CrawlSpider:在请求之前忽略URL

时间:2014-12-25 18:31:32

标签: scrapy scrapy-spider

我有一个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)

这可能是中间件还是什么?

1 个答案:

答案 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