1

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

这可以通过中间件或其他方式实现吗?

4

1 回答 1

3

您正在寻找 Rule 的属性process_links——它允许您指定可调用或方法名称,用于过滤.LinkLinkExtractor

您的代码将如下所示:

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
于 2014-12-25T21:17:45.417 回答