0

次のコードがあります。

#!/usr/bin/env python
from mechanize import Browser
from BeautifulSoup import BeautifulSoup

mech = Browser()
mech.set_handle_robots(False)
url = "http://storage.googleapis.com/patents/retro/2011/ad20111231-02.zip"
page = mech.open(url)
html = page.read()

soup = BeautifulSoup(html)
print soup.prettify()

Web ページから .zip ファイルをダウンロードしようとする非常に単純な Web スクレーパーです。このコードを実行すると、このファイルが 4kb であることを念頭に置いて、プログラムはまるで無限の while ループにあるかのように終了しません。私はここで何をしましたか?

4

1 に答える 1

2

あなたがあなたをした後に置いてみてprint htmlくださいpage.read()。自分が思っているものが得られない可能性があります。ファイル自体ではなく、エラーページが表示されているようです。ファイルを正しく処理しているかどうかはわかりませんが、ここでより良いアプローチを見つけることができます。Pythonを使用してWebページ上のすべてのリンク(関連ドキュメント)をダウンロードします

zipファイルは4KBではありません。約87MBで、784MBのXMLファイルが含まれています。これは、ブラウザでそのURLを押してダウンロードすることで確認できます。問題となるのは無限ループではないかもしれません。ロードに長い時間がかかるだけです。

また、zipアーカイブされたXMLの場合、データをHTMLとして渡そうとしています。(実際ファイルを取得したら)応答データをに保存するStringIOと、メモリに解凍できます(ここで概説します)。次に、XMLを渡すことを明示的に伝えるBeautifulSoup必要があります。

soup = BeautifulSoup(html, 'xml')

これにはlxmlをインストールする必要がありますが、Pythonで最速のXMLパーサーである可能性があるため、これは有利に機能します。

最後に一つだけ:

mech.set_handle_robots(False)
url = "http://storage.googleapis.com/patents/retro/2011/ad20111231-02.zip"

robots.txt私は、Googleが可能な限りスクレイピングを禁止するように設定したという印象を受けました。それでもファイルのコピーをダウンロードできない場合は、試してみることをお勧めしSeleniumます。よく似mechanizeていますが、ChromeやFirefoxなどの実際のブラウザを制御するため、正当なブラウザリクエストになります。

于 2012-10-11T00:11:20.663 に答える