8

大規模なデータ マイニングを実行したいと考えています。このためには、高速クローラーが必要です。必要なのは、Web ページをダウンロードし、リンクを抽出して再帰的にたどることだけですが、同じ URL に 2 回アクセスする必要はありません。基本的に、ループは避けたいです。

Python で既にクローラーを作成しましたが、遅すぎます。100Mbit 回線を飽和させることができません。最高速度は ~40 URL/秒です。そして、何らかの理由で、より良い結果を得るのが難しい. Pythonのマルチスレッド/ソケットに問題があるようです。Python のガベージ コレクターでも問題が発生しましたが、それは解決可能でした。ところで、CPUはボトルネックではありません。

では、可能な限り高速なクローラーを作成するには何を使用すればよいでしょうか?また、クロール中のループを回避するための最善の解決策は何でしょうか?

multiprocessing編集: 解決策は、threadingモジュールを結合することでした。最良の効果を得るには、プロセスごとに複数のスレッドで複数のプロセスを生成します。1 つのプロセスで複数のスレッドを生成することは効果的ではなく、スレッドが 1 つだけの複数のプロセスが大量のメモリを消費します。

4

5 に答える 5

8

Scrapyのように、既にクロールがテストされているものを使用しないのはなぜですか? ネットワーク速度が約 6 ~ 7 Mb/s (つまり 100Mbps 未満) であるのに対し、RAM メモリが制限された (約 400Mb) ローエンド VPS で 1 秒あたりほぼ 100 ページに到達することができました。

できるもう 1 つの改善点は、使用することですurllib3(特に、1 つのドメインから多くのページをクロールする場合)。これは私が少し前に行った簡単な比較です:

urllib ベンチマーク

アップデート:

Scrapyは Requests ライブラリを使用するようになり、これは urllib3 を使用します。そのため、スクレイピングに関しては、Scrapy が絶対的な頼りになるツールになります。最近のバージョンではプロジェクトのデプロイもサポートされているため、VPS からのスクレイピングはこれまで以上に簡単です。

于 2011-10-04T20:02:58.213 に答える
2

単純なマルチスレッドクローラーを作成しました。これはGitHubでDiscoveringWebResourcesとして利用可能であり、関連記事を書いています:ブログフィードとTwitter、Facebook、LinkedInアカウントの自動検出がビジネスWebサイトに接続されています。NWORKERSクラス変数で使用されているスレッドの数を変更できます。さらにサポートが必要な場合は、遠慮なく質問してください。

于 2012-10-25T17:59:41.697 に答える
1

言語の問題よりもデザインの問題があるようです。スレッドではなく、同時により多くのサイトにアクセスするためのマルチプロセッシングモジュールを調べてみてください。また、以前にアクセスしたサイトを格納するためのテーブルを取得することを検討してください(データベースかもしれませんか?)。

于 2011-10-04T19:57:01.383 に答える
1

あなたの限界が何であるかを伝えることは不可能です。あなたの問題はC10Kの問題に似ています-最初に読んで、すぐに最適化しないでください。簡単に実現できる方法を選択してください。ほとんどの場合、アプリケーションの設計を分析することで、パフォーマンスが大幅に向上します。大規模なマルチスレッドまたは大規模なマルチプロセスから始めないでください。

私はTwistedを使ってネットワーキングの部分を書きます。これは非常に高速です。一般に、マシンの I/O は平均よりも優れている必要があります。データをディスクまたは別のマシンに書き込む必要があります。すべてのノートブックが 10MByte/s の持続的なデータベース書き込みをサポートしているわけではありません。最後に、非同期インターネット接続を使用している場合、単にアップストリームが飽和している可能性があります。ここではACK の優先順位付けが役立ちます (OpenBSD の例)。

于 2011-10-04T19:59:34.877 に答える