Python urllib2没有获得完整响应(PDF)

时间:2012-09-24 20:31:53

标签: php python pdf urllib2 x-sendfile

我正在尝试通过点击网址下载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。

1 个答案:

答案 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)

来自urllib documentation

  

一个警告:read()方法,如果省略size参数或为负数,则在数据流结束之前可能无法读取;在一般情况下,没有好的方法可以确定读取了套接字的整个流。

此警告未出现在urllib2的文档中,但适用相同的概念。