0

私はPythonで簡単なWebクローラーを作った。これまでに行われたすべてのことは、訪れたはずのURL、既に訪れたURLのセットを作成します。ページを解析する間に、そのページのすべてのリンクを訪問済みのセットに追加し、ページURLを既に訪問したセットに追加します。その間にshould_be_visitedの長さは0です。これまでのところ、すべてのことが1つのスレッドで行われます。Webクローラー用のPythonスレッドまたはマルチプロセッシング?

このアプリケーションに並列性を追加したいので、同じ種類のリンクといくつかのスレッド/プロセスを持つ必要があります。それぞれがshould_be_visitedから1つのURLをポップアップし、already_visitedを更新します。私は本当にスレッド化とマルチプロセッシングで失われています。私はこれを使用する必要があります。プール、キューが必要ですか?

+0

訪問するURLのセットについては、同じサーバーのURLの多く、またはすべてが異なるサーバーのURLのセットですか? – halfer

+0

すべてから同じ – wasd

+1

OK、その場合は、サーバーがあなたのコントロール下にあり、サーバー/ネットワークが負荷を処理できない限り、まったく並列化しないでください。遠隔管理者にサービス拒否攻撃として現れる要求をスピードアップするのではなく、各要求の間にわずかな遅れを入れなければなりません。スクレイピングの広範なルールは、**遅くなくてもすばやく**実行する必要があります。これを監視しないと、サーバーがIPブロックリストに登録される可能性があります。 – halfer

答えて

1

スレッドをPythonで使用するかどうかを決定する際の経験則は、スレッドが実行するタスクがCPU集約型かI/O集約型かを問うことです。答えがI/O集約型であれば、スレッドを使うことができます。

GILのため、Pythonインタプリタは一度に1つのスレッドしか実行しません。スレッドが何らかのI/Oを行っている場合、データが利用可能になるのを待つ(たとえば、ネットワーク接続やディスクから)ことをブロックし、その間インタープリタは別のスレッドにコンテキスト切り替えを行います。一方、スレッドがCPU集中型タスクを実行している場合、他のスレッドはインタープリタが実行を決定するまで待機しなければなりません。

WebクロールはほとんどI/O指向のタスクです.HTTP接続を行い、要求を送信し、応答を待つ必要があります。はい、応答を受け取った後、解析するためにCPUを費やす必要がありますが、それに加えてI/O作業がほとんどです。だから、私は糸がこの場合に適した選択だと信じています。

(そしてもちろん、robots.txtのを尊重し、

0

別の代替:-)あまりにも多くの要求を持つサーバを嵐していないで、私のこの種のためにはるかに優れている非同期I/O、/Oバインドタスク(ページの処理がの場合、実際にはが高価な場合を除きます)。 httpclientを使用してasyncioまたはTornadoの両方で試してみることができます。

関連する問題