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,并指示蜘蛛抓取?
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)
| 归档时间: |
|
| 查看次数: |
2299 次 |
| 最近记录: |