Python-urllib2.urlopen(torrenturl).read()无法获取torrent文件内容

发布于 2016-12-08 04:42:25 字数 318 浏览 1134 评论 1

    info_hash = '00001BD2C9F364C7DCB759DEC6BE02F913C96F72'
url = 'http://torrage.com/torrent/%s.torrent' % info_hash
print url
data = urllib2.urlopen(url).read()
f = open('%s.torrent' % info_hash, 'wb')
f.write(data)
f.close()

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

归属感 2017-08-19 01:33:08

一句话回答就是:你程序中read的数据是压缩后的数据,而浏览器下载会自动解压。

详解信息如下:

文本类型的文件在压缩后体积大幅度减小,为了减小信息传输体积,HTTP协议在文件头部会有一个Content-Encoding来规定传输数据时所使用的内容编码。

如果你先执行下面的代码,看看你这次连接的一些状态信息:

import urllib2

info_hash = '00001BD2C9F364C7DCB759DEC6BE02F913C96F72'
url = 'http://torrage.com/torrent/%s.torrent' % info_hash
print url
conn = urllib2.urlopen(url)
print conn.info()

你会得到下面的信息:

看到了吗?Content-Encoding是gzip!而你不经过解压直接写入文件自然会出错了!

找到问题所在,就好解决了,下面是示意的代码,下载后的文件是没有问题的:

 import gzip
import StringIO
import urllib2

info_hash = '00001BD2C9F364C7DCB759DEC6BE02F913C96F72'
url = 'http://torrage.com/torrent/%s.torrent' % info_hash
print url

conn = urllib2.urlopen(url)
print conn.info()

data = conn.read()
compressed_file = StringIO.StringIO()
compressed_file.write(data)
compressed_file.seek(0)

decompressed_file = gzip.GzipFile(fileobj = compressed_file, mode = 'rb')
f = open('%s.torrent' % info_hash, 'wb')
f.write(decompressed_file.read())
f.close()

那浏览器下载正常呢?我想,大概是因为浏览器替我们做了很多事情,能够正确解析HTTP协议头部,正常解码,得到正确的文件了。

另外,就我一些下载图片的经验而言,你的代码是没有问题的,我想,应该是因图片本身是压缩的,HTTP协议头部不再指定Content-Encoding,于是读到的数据就是图片本身的数据,下载的图片正常。

(打了这么字,不容易啊!)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文