我对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
,指示蜘蛛抓取?
答案 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