CrawlSpider から派生したスパイダーがあります。URL が特定の形式の場合、parse_item という名前の関数へのコールバックを行います。
rules = (
Rule(
LinkExtractor(
allow=('/whatever/', )
)
),
Rule(
LinkExtractor(
allow=('/whatever/detailpage/1234/')
),
callback='parse_item'
),
)
スパイダーのステータスは only_new=True です。この状態が有効になっている場合、データベースに既に存在する URL をクロールしたくありません。
クロールしたい新しい詳細ページが 5 つあるが、クロールしたくない詳細ページが 1000 ある場合、1000 ではなく 5 つのリクエストを送信したいので、リクエストが完了する前に URL を確認したいと思います。
ただし、コールバック関数では、リクエストは既に行われています。次のようなことをしたいと思います:
rules = (
(...)
Rule(
LinkExtractor(
allow=('/whatever/detailpage/1234/')
),
callback_before_request='check_if_request_is_nessesary'
),
)
def check_if_request_is_nessesary(spider, url):
if spider.only_new and url_exists_in_database():
raise IgnoreRequest
else:
do_request_and_call_parse_item(url)
これはミドルウェアなどで可能ですか?