Python-urllib2.urlopen(torrenturl).read()无法获取torrent文件内容
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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
一句话回答就是:你程序中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,于是读到的数据就是图片本身的数据,下载的图片正常。
(打了这么字,不容易啊!)