我正在尝试通过点击网址下载PDF。说我的网址如下:http://foo.bar/this/downloads/pdf
如果我直接点击URL,浏览器会下载PDF,没有问题。但是,如果我尝试使用urllib2.urlopen
获取PDF,则会收到不完整的文件。
url = "http://foo.bar/this/downloads/pdf"
sock = urllib2.urlopen(url)
content = sock.read()
with open('/tmp/test.pdf', 'w') as f:
f.write(content)
/tmp/test.pdf的最后3行看起来像这样(在变量content
中看起来像这样):
0000778731 00000 n
0000778751 00000 n
000
但是我从浏览器下载的实际文件如下所示:
0000778731 00000 n
0000778751 00000 n
0000778772 00000 n
...
%%EOF
每一个PDF,无论大小,似乎都会在最终的数字组合中切断。
我尝试了以下解决方案,但都无效。我认为原因与数据的读取方式无关,但urllib2
甚至没有得到完整的响应。
python,not getting full response
urllib2 not retrieving entire HTTP response
另一个可能是因素(虽然我不确定)是PDF发送到浏览器的方式。据我所知,PDF是使用PHP x-sendfile发送的。我很困惑为什么部分下载PDF。
答案 0 :(得分:2)
您必须打开文件才能以二进制模式写入(请注意wb
):
with open('/tmp/test.pdf', 'wb') as f:
f.write(content)
编辑:哦,你还必须继续阅读,直到.read()
没有返回任何内容:
url = "http://foo.bar/this/downloads/pdf"
sock = urllib2.urlopen(url)
with open('/tmp/test.pdf', 'wb') as f:
while True:
content = sock.read()
if not content: break
f.write(content)
一个警告:read()方法,如果省略size参数或为负数,则在数据流结束之前可能无法读取;在一般情况下,没有好的方法可以确定读取了套接字的整个流。
此警告未出现在urllib2
的文档中,但适用相同的概念。