3

多数の異なるサイトをクロールする必要があるプロジェクトがあります。本文ページから項目を抽出する必要がないため、クロールするこのすべてのサイトで同じスパイダーを使用できます。私が考えたアプローチは、スパイダーファイルでクロールするドメインをパラメーター化し、ドメインを渡してスクレイピークロールコマンドを呼び出し、URL をパラメーターとして開始することです。これにより、すべてのサイトに対して単一のスパイダーを生成することを回避できます (サイトリストは時間)。アイデアは、scrapyd が実行されているサーバーにデプロイすることなので、いくつか質問があります。

  • これは私が取ることができる最善のアプローチですか?
  • その場合、異なる引数を渡して同じスパイダーを複数回スケジュールすると、同時実行性の問題は発生しますか?
  • これが最善のアプローチではなく、サイトごとに 1 つのスパイダーを作成する方がよい場合は、プロジェクトを頻繁に更新する必要があります。プロジェクトの更新は実行中のスパイダーに影響しますか?
4

1 に答える 1

4

スパイダーデザイン

ドメインスパイダーを構築するための2つのアプローチがあります

  1. URL のリストを単一のスパイダーに引数として送信する
  2. 異なる start_url を引数として同じスパイダーの複数のインスタンスを実行する

最初のアプローチは最も簡単でテストが簡単で ( Scrapy のクロールで実行できます)、多くの場合は問題ありません。2 番目の方法は使いにくいですが、コードを書くのは簡単です。

  1. URL のリストを引数として単一のスパイダーに送信します。
    • 最小限の CPU フットプリント: すべての URL に対して 1 つのプロセスを起動
    • ユーザーフレンドリー: スクラップクロールまたはスクラップとして実行できます
    • デバッグが難しい: ドメイン制限なし
  2. start_url ごとに 1 つのインスタンスを実行する
    • 大量のリソース フットプリント: URL ごとに 1 つの専用プロセスを起動する
    • ユーザーフレンドリーではありません: スパイダーを起動して URL をフィードするには、外部スクリプトを作成する必要があります。
    • デバッグが容易: 一度に 1 つのドメインを実行するコードを書く

.

from urlparse import urlparse
...
class .....(Spider):
    def __init__(*args, *kwargs):
        ...
        self.start_urls = ....
        ...
        self.allowed_domains = map(lambda x: urlparse(x).netloc, self.start_urls)

プログラミングの課題が発生した場合にのみ、2 番目のアプローチをお勧めします。それ以外の場合は、単純さとスケーラビリティのためにオプション 1 に固執します。

同時実行

settings.pyCONCURRENT_REQUESTS_BY_DOMAIN 変数を追加することで、同時実行を制御できます。

プロジェクトの更新

どちらのアーキテクチャも、スパイダーを 1 つだけ作成する必要があります。スパイダーを 1 回だけインスタンス化する (オプション 1 ) または URL ごとに 1 回 (オプション 2 )。複数のスパイダーを記述する必要はありません。

参考までに: プロジェクトを更新しても、実行中のスパイダーには影響しません。

于 2014-07-05T00:33:43.617 に答える