1

Web サイトで Python で Web スクレイピングを試みています (spynner と BeautifulSoup を使用)。ある時点で、次の html クエリによってトリガーされる zip ファイルのダウンロードをテストしたいと思います。

https://mywebsite.com/download?from=2011&to=2012

ブラウザー (chrome) で明示的に使用すると、指定された名前の zip ファイルのダウンロードがトリガーされます。私のヘッドレス ブラウザでは、この動作を再現できませんでした。私はそれを行う正しい方法ではないことを知っていますが、スピナーのようなものを使用しています:

from spynner import Browser
b = Browser()
b.load(webpage,wait_callback=wait_page_load, tries=3)
b.load_jquery(True)
...
output = b.load("https://website.com/download?from=2011&to=2012")
print b.html
>> ...

もちろん機能しません(zipファイルのダウンロードはありません)。最後の print ステートメントは、Java 例外スタックを含むエラー ページが表示されることを示しています。

する方法はありますか

  1. スピナーロードメカニズムを使用せずにhtmlクエリを適切に呼び出しますか?
  2. 結果のzipファイルをキャプチャしますか?
  3. 選んだ名前でダウンロードしますか?

ご協力いただきありがとうございます。

最後に、Chrome で Java デバッガーを使用してテストした結果、ブラウザーで実行すると次の警告が表示されました。

Resource interpreted as Document but transferred with MIME type application/zip "https://mywebsite.com/download?from=2011&to=2012"

編集:

行われた呼び出しは次のとおりであることがわかりました。

https://mywebsite.com/download?from=10%2F18%2F2011&to=10%2F18%2F2012

これはブラウザで使用でき、

https://mywebsite.com/download?from=10/18/2011&to=10/18/2012

%2FURLエンコーディングがマップされるため、Pythonでは使用できませんでした%252F

4

3 に答える 3

2

これがあなたのケースを処理するかどうかはわかりませんが、試してみてください:

def download_finished(reply):
    try:
        with open('filename.ext', 'wb') as downloaded_file:
            downloaded_file.write(reply.readAll())
    except Exception:
        pass

    b.manager.finished.disconnect(download_finished)

download_url = spynner.QUrl(url)
request = spynner.QNetworkRequest(download_url)

# requires: from PyQt4.QtCore import QByteArray
request.setRawHeader('Accept', QByteArray(
    'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'))

b.manager.finished.connect(download_finished)
reply = b.manager.get(request)
b.wait_requests(1)
于 2012-10-19T05:12:46.903 に答える
0

次のコードは機能しますか?

import urllib, os, urlparse

url = YOUR_URL

file = urllib.URLopener()
file.retrieve(url, os.path.basename(urlparse.urlparse(url).path))
print 'downloading:', url
于 2012-10-19T00:18:13.117 に答える
0

と間違えましたspynner

スクリプトは次のようになります。

from spynner import Browser
b = Browser()
b.load(webpage,wait_callback=wait_page_load, tries=3)
b.load_jquery(True)
...
b.load("https://website.com/download?from=2011&to=2012")
# print b.html
f = open("/tmp/foo.zip", "w")
f.write(b.html)
f.close()

スピナーのドキュメントを参照してください

于 2012-10-19T00:17:15.510 に答える