0

URLをクリックしてPDFをダウンロードしようとしています。私の URL が次のようになっているとします: http://foo.bar/this/downloads/pdf

URL を直接叩くと、ブラウザーは問題なく PDF をダウンロードします。ただし、を使用して PDF を取得しようとするとurllib2.urlopen、不完全なファイルが取得されます。

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、完全な応答が得られない

urllib2 が HTTP 応答全体を取得しない

もう 1 つの要因は (私にはよくわかりませんが)、PDF がブラウザーに送信される方法です。私の知る限り、PDF は PHP x-sendfile を使用して送信されます。PDFが部分的にダウンロードされる理由について、私は混乱しています。

4

1 に答える 1

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ドキュメントから:

注意点:read()メソッドは、size引数が省略されているか負の場合、データストリームの最後まで読み取れない可能性があります。一般的なケースでは、ソケットからのストリーム全体が読み取られたことを確認する良い方法はありません。

この警告はのドキュメントには記載されていませんurllib2が、同じ概念が適用されます。

于 2012-09-24T20:32:59.917 に答える