我有一个 CrawlSpider 派生的蜘蛛。当 url 具有某种格式时,它会对名为 parse_item 的函数进行回调。
rules = (
Rule(
LinkExtractor(
allow=('/whatever/', )
)
),
Rule(
LinkExtractor(
allow=('/whatever/detailpage/1234/')
),
callback='parse_item'
),
)
我的蜘蛛有一个状态 only_new=True。启用此状态后,我不想抓取数据库中已经存在的 url。
我想在请求完成之前检查 url,因为当我有 5 个新的详细信息页面我想抓取但 1000 个我不想抓取的详细信息页面时,我想发送 5 个请求而不是 1000 个。
但是在回调函数中,请求已经完成了。我想做如下的事情:
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)
这可以通过中间件或其他方式实现吗?