スパイダーデザイン
ドメインスパイダーを構築するための2つのアプローチがあります
- URL のリストを単一のスパイダーに引数として送信する
- 異なる start_url を引数として同じスパイダーの複数のインスタンスを実行する
最初のアプローチは最も簡単でテストが簡単で ( Scrapy のクロールで実行できます)、多くの場合は問題ありません。2 番目の方法は使いにくいですが、コードを書くのは簡単です。
- URL のリストを引数として単一のスパイダーに送信します。
- 最小限の CPU フットプリント: すべての URL に対して 1 つのプロセスを起動
- ユーザーフレンドリー: スクラップクロールまたはスクラップとして実行できます
- デバッグが難しい: ドメイン制限なし
- 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.py
CONCURRENT_REQUESTS_BY_DOMAIN 変数を追加することで、同時実行を制御できます。
プロジェクトの更新
どちらのアーキテクチャも、スパイダーを 1 つだけ作成する必要があります。スパイダーを 1 回だけインスタンス化する (オプション 1 ) または URL ごとに 1 回 (オプション 2 )。複数のスパイダーを記述する必要はありません。
参考までに: プロジェクトを更新しても、実行中のスパイダーには影響しません。