Kha*_*lla 4 python http-headers http-protocols python-2.7
我想在多线程模式下载文件,我在这里有以下代码:
#!/usr/bin/env python
import httplib
def main():
url_opt = '/film/0d46e21795209bc18e9530133226cfc3/7f_Naruto.Uragannie.Hroniki.001.seriya.a1.20.06.13.mp4'
headers = {}
headers['Accept-Language'] = 'en-GB,en-US,en'
headers['Accept-Encoding'] = 'gzip,deflate,sdch'
headers['Accept-Charset'] = 'max-age=0'
headers['Cache-Control'] = 'ISO-8859-1,utf-8,*'
headers['Cache-Control'] = 'max-age=0'
headers['User-Agent'] = 'Mozilla/5.0 (Windows NT 5.1)'
headers['Connection'] = 'keep-alive'
headers['Accept'] = 'text/html,application/xhtml+xml,application/xml,*/*'
headers['Range'] = ''
conn = httplib.HTTPConnection('data09-cdn.datalock.ru:80')
conn.request("GET", url_opt, '', headers)
print "Request sent"
resp = conn.getresponse()
print resp.status
print resp.reason
print resp.getheaders()
file_for_wirte = open('cartoon.mp4', 'w')
file_for_wirte.write(resp.read())
print resp.read()
conn.close()
if __name__ == "__main__":
main()
Run Code Online (Sandbox Code Playgroud)
这是输出:
Request sent
200
OK
[('content-length', '62515220'), ('accept-ranges', 'bytes'), ('server', 'nginx/1.2.7'), ('last-modified', 'Thu, 20 Jun 2013 12:10:43 GMT'), ('connection', 'keep-alive'), ('date', 'Fri, 14 Feb 2014 07:53:30 GMT'), ('content-type', 'video/mp4')]
Run Code Online (Sandbox Code Playgroud)
这段代码工作正常然而我不明白通过文档如何使用范围下载文件.如果您看到响应的输出,则服务器提供:
('content-length', '62515220'), ('accept-ranges', 'bytes')
Run Code Online (Sandbox Code Playgroud)
它支持"字节"单位范围,内容大小为62515220
但是在此请求中整个文件已下载.但是,我想要做的是首先获取服务器信息,比如使用http范围查询和文件内容大小而不下载可以支持此文件吗?我如何创建范围的http查询(即:0~25000)?
fal*_*tru 14
Range使用bytes=start_offset-end_offset范围说明符传递标头.
例如,以下代码检索前300个字节.(0-299):
>>> import httplib
>>> conn = httplib.HTTPConnection('localhost')
>>> conn.request("GET", '/', headers={'Range': 'bytes=0-299'}) # <----
>>> resp = conn.getresponse()
>>> resp.status
206
>>> resp.status == httplib.PARTIAL_CONTENT
True
>>> resp.getheader('content-range')
'bytes 0-299/612'
>>> content = resp.read()
>>> len(content)
300
Run Code Online (Sandbox Code Playgroud)
注:两者start_offset,end_offset都包括在内.
UPDATE
如果服务器不理解Range标题,它将使用状态代码200(httplib.OK)而不是206(httplib.PARTIAL_CONTENT)进行响应,它将发送整个内容.要确保服务器响应部分内容,请检查状态代码.
>>> resp.status == httplib.PARTIAL_CONTENT
True
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8170 次 |
| 最近记录: |