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

Sky*_*326 4 rules callback web-crawler scrapy

我对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)
    ]
Run Code Online (Sandbox Code Playgroud)

request_tagePage()指将cookie添加到请求parse_tagPage()中的函数,指的是解析目标页面的函数。根据文档, 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.
Run Code Online (Sandbox Code Playgroud)

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

pau*_*rth 5

CrawlSpider规则生成的请求使用内部回调并使用meta它们来实现它们的“魔法”

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

相反,如果您只想添加 cookie 和特殊标头,您可以.replace()传递给的请求使用方法request_tagPage,以便CrawlSpider保留的“魔法” 。

这样的事情应该足够了:

def request_tagPage(self, request):
    tagged = request.replace(headers=self.headers)
    tagged.meta.update(cookiejar=1)
    return tagged
Run Code Online (Sandbox Code Playgroud)