7

私はscrapyを使用して、さまざまなドメインから並行してページをダウンロードしています。ダウンロードするページは数十万ページあるので、パフォーマンスが重要です。

残念ながら、scrapyの速度をプロファイリングしたので、1秒あたり数ページしか取得できません。実際、平均して1秒あたり約2ページです。私は以前、毎秒数百ページを実行するために独自のマルチスレッドスパイダーを作成しました。スクラピーズのツイストなどの使用は、同様の魔法を使用できると確信していました。

スクレイプをスピードアップするにはどうすればよいですか?私はフレームワークが本当に好きですが、このパフォーマンスの問題は私にとって大きな問題になる可能性があります。

これがsettings.pyファイルの関連部分です。私が見逃した重要な設定はありますか?

LOG_ENABLED = False
CONCURRENT_REQUESTS = 100
CONCURRENT_REQUESTS_PER_IP = 8

いくつかのパラメーター:

  • スクレイプバージョン0.14を使用
  • プロジェクトはEC2ラージインスタンスにデプロイされるため、十分なメモリ、CPU、帯域幅を使用できる必要があります。
  • JSONプロトコルを使用してクロールをスケジュールし、クローラーに常に数十の同時クロールを追加し続けます。
  • 最初に言ったように、私は多くのサイトからページをダウンロードしているので、リモートサーバーのパフォーマンスとCONCURRENT_REQUESTS_PER_IPは心配する必要はありません。
  • 今のところ、後処理はほとんど行っていません。xpathなし。正規表現なし。各ページのURLといくつかの基本的な統計を保存しているだけです。(これは、基本的なパフォーマンスの問題が解決されたら、後で変更されます。)
4

1 に答える 1

9

私は過去にこの問題を抱えていました...そして、その大部分は「汚い」古いトリッキーで解決しました。

ローカル キャッシュ DNS を実行します

ほとんどの場合、同時にリモート サイトにアクセスして CPU 使用率が高い場合は、scrapy が URL を解決しようとしていることが原因です。

また、ホスト (/etc/resolv.conf) の DNS 設定をローカル キャッシング DNS サーバーに変更することを忘れないでください。

最初のものはゆっくりですが、すぐにキャッシングを開始し、より効率的に解決できるようになると、大幅な改善が見られます。

これがあなたの問題に役立つことを願っています!

于 2012-10-25T00:43:27.940 に答える