设置process_request和callback参数时,Scrapy规则不起作用

时间:2016-07-09 09:02:36

标签: callback scrapy web-crawler rules

我对scrapy CrawlSpider

有这个规则
rules = [
        Rule(LinkExtractor(
                    allow= '/topic/\d+/organize$', 
                    restrict_xpaths = '//div[@id= "zh-topic-organize-child-editor"]'
                    ),
           process_request='request_tagPage', callback = "parse_tagPage", follow = True)
    ]

request_tagePage()是指将cookie添加到请求中的函数,parse_tagPage()是指用于解析目标页面的函数。根据{{​​3}},CrawlSpider应使用request_tagPage发出请求,一旦返回响应,它就会调用parse_tagPage()来解析它。但是,我意识到当使用request_tagPage()时,蜘蛛根本不会调用parse_tagPage()。所以在实际代码中,我手动将parse_tagPage()回调函数添加为request_tagPage中的回调函数,如下所示:

def request_tagPage(self, request):
    return Request(request.url, meta = {"cookiejar": 1}, \ # attach cookie to the request otherwise I can't login
            headers = self.headers,\
            callback=self.parse_tagPage) # manually add a callback function.

虽然有效,但现在蜘蛛并没有使用规则来扩展它的爬行。从start_urls抓取链接后,它会关闭。但是,在我将parse_tagPage()作为回调手动设置为request_tagPage()之前,规则有效。所以我想这可能是一个错误?是一种启用request_tagPage()的方法,我需要在请求中附加Cookie,parse_tagPage(),用于解析页面,rules,指示蜘蛛抓取?

2 个答案:

答案 0 :(得分:2)

CrawlSpider规则生成的请求使用internal callbacks and use meta to do their "magic"

我建议您不要在规则中从头开始重新创建请求。 process_request挂钩(或者您可能最终会重新实现CrawlSpider已为您做的事情。)

相反,如果您只想添加Cookie和特殊标题,则可以使用传递给request_tagPage的{​​{3}},以便"魔法"保留CrawlSpider

这样的事情应该足够了:

def request_tagPage(self, request):
    tagged = request.replace(headers=self.headers)
    tagged.meta.update(cookiejar=1)
    return tagged

答案 1 :(得分:1)

我发现了问题。 CrawlSpider使用其默认parse()来应用规则。因此,当我的自定义parse_tagPage()被调用时,不再需要parse()来继续应用规则。解决方案是将默认parse()添加到我的自定义parse_tagPage()中。它现在看起来像这样:

def parse_tagPage(self, response):
    # parse the response, get the information I want...
    # save the information into a local file...
    return self.parse(response) # simply calls the default parse() function to enable the rules