我有一个CrawlSpider派生的蜘蛛。当url具有某种格式时,它会对名为parse_item的函数进行回调。
rules = (
Rule(
LinkExtractor(
allow=('/whatever/', )
)
),
Rule(
LinkExtractor(
allow=('/whatever/detailpage/1234/')
),
callback='parse_item'
),
)
我的蜘蛛状态为only_new = True。启用此状态后,我不想抓取已存在于我的数据库中的网址。
我想在请求完成之前检查网址,因为当我有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)
这可能是中间件还是什么?
答案 0 :(得分:3)
您正在寻找process_links
attribute for the Rule - 它允许您指定用于过滤Link
返回的LinkExtractor
对象列表的可调用名称或方法名称。
您的代码看起来像这样:
rules = (
(...)
Rule(
LinkExtractor(
allow=('/whatever/detailpage/1234/')
),
process_links='filter_links_already_seen'
),
)
def filter_links_already_seen(self, links):
for link in links:
if self.only_new and url_exists_in_database(link.url):
continue
else:
yield link