【发布时间】:2016-11-11 19:38:06
【问题描述】:
我对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() 指的是解析目标页面的函数。根据documentation,CrawlSpider 应该使用request_tagPage 发出请求,一旦返回响应,它就会调用parse_tagPage() 来解析它。但是,我意识到当使用request_tagPage() 时,蜘蛛根本不会调用parse_tagPage()。所以在实际代码中,我在request_tagPage中手动添加了parse_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,指导蜘蛛爬行?
【问题讨论】:
-
您确定您的链接提取器是否正常工作?通过
scrapy shell url打开一个网站并导入 LinkExtractor 并尝试在response.body上使用相同的参数。 -
它工作正常。当 parse_tagPage() 不用作 request_tagPage() 中的回调函数时,我从控制台看到蜘蛛应该按原样爬行。从scrapy的documentation on Rule object,我认为将 parse_tagPage() 设置为 Rule 的回调就足够了,结果根本没有调用回调函数。所以我必须把回调放在request_tagPage() 中。然后回调被调用,但蜘蛛失去了跟踪链接的能力,除了 start_urls 中的链接。
-
您是否尝试过不构造全新的
Request对象,而是使用Request.replace()方法?例如。return request.replace(meta={'cookiejar': 1}, headers=self.headers)。CrawlSpider在其自己的处理爬网规则的parse()回调中处理所有页面,因此手动更改callback似乎不是一个好方法。 -
@shirk3y 尝试使用 request.replace()。然而,它的工作原理相同。同样感谢
标签: callback scrapy web-crawler rules