5

1 つのサイトで Web ページを一括ダウンロードしたい。「urls.txt」ファイルには 5000000 個の URL リンクがあります。300Mくらいです。マルチスレッドでこれらの URL をリンクし、これらの Web ページをダウンロードするにはどうすればよいですか? またはこれらの Web ページを一括ダウンロードする方法は?

私のアイデア:

with open('urls.txt','r') as f:
    for el in f:
        ##fetch these urls

またはねじれた?

それに対する良い解決策はありますか?

4

4 に答える 4

3

これがより大きなプログラムの一部ではない場合、既存のツールを使用してこれを達成するという notnoop のアイデアは非常に優れています。wget を呼び出すシェル ループが問題を解決する場合、カスタム ソフトウェア開発を伴うものよりもはるかに簡単です。

ただし、これらのリソースをより大きなプログラムの一部としてフェッチする必要がある場合、シェルでそれを行うのは理想的ではない場合があります。この場合、多くのリクエストを並行して簡単に実行できる Twisted を強くお勧めします。

数年前、私はこれを行う方法の例を書きました。http://jcalderone.livejournal.com/24285.htmlをご覧ください。

于 2010-01-25T20:53:03.050 に答える
1

ネットワーク帯域幅やOSのファイル記述子など、多くのことを最大限に活用できるため、一度に5MのWebページを確実にダウンロードすることはお勧めできません。私は100-1000のバッチで行きます。urllib.urlopenを使用してソケットを取得し、いくつかのスレッドでread()を実行できます。select.selectを使用できる場合があります。その場合は、先に進んで1000個すべてを一度にダウンロードし、選択した各ファイルハンドルを配布して、たとえば10個のワーカースレッドを返します。selectが機能しない場合は、バッチを100ダウンロードに制限し、ダウンロードごとに1つのスレッドを使用します。確かに、OSが爆発したり、少なくとも少し遅くなる可能性があるため、100を超えるスレッドを開始しないでください。

于 2010-01-25T19:49:11.087 に答える
1

最初にファイルを解析し、URL をキューにプッシュしてから、5 ~ 10 個のワーカー スレッドを生成してキューから URL を取り出してダウンロードします。キューはこれであなたの友達です。

于 2010-01-26T02:59:09.553 に答える
0

wget スクリプトはおそらく最も単純ですが、python を利用したクロール ソリューションを探している場合は、scrapyをチェックしてください。

于 2010-01-26T03:18:53.237 に答える