Scrapy独立方法传self参数给回调函数时翻页失效问题
问题根本原因
代码爬取单页就停止和self机制、Scrapy回调规则没有关系,核心问题是你没有把自定义翻页方法生成的Request对象交给Scrapy引擎。
所有带yield关键字的Python函数都是生成器函数:你在parse方法里直接调用go_to_nextpage()时,Python不会立刻执行函数内部的代码,只会返回一个未迭代的生成器对象。而Scrapy引擎只会收集回调函数直接yield抛出的Request、Item对象加入调度队列,你既没有迭代这个生成器,也没有把生成器里的请求抛给引擎,相当于翻页请求根本没送到Scrapy手里,自然不会触发后续翻页。
顺便提一句,你在类内部调用实例方法的写法也不规范:不需要手动传入self参数,用self.方法名(参数)的形式调用会自动绑定实例,不过这不是本次功能失效的核心原因。
修复方案
只需要在调用翻页方法时,用yield from迭代生成器,把内部产出的所有请求直接抛给Scrapy引擎即可,修改parse方法里的翻页调用代码:
# 错误写法 # go_to_nextpage(self, current_page_number) # 正确写法 yield from self.go_to_nextpage(current_page_number)
你写的go_to_nextpage方法内部逻辑不需要做任何调整,改完调用方式就能正常连续翻页。
快速验证方法:你可以在原来的错误调用行下面加一句
print(type(go_to_nextpage(self, current_page_number))),运行后会看到输出是<class 'generator'>,证明函数内部的Request构造逻辑根本没有执行,也没有被传递到Scrapy调度器。
对你提到的两个知识点的澄清
- 关于
self:self就是当前Spider类的实例引用,只要传入的实例正确,不会导致请求无法调度,你之前的误解不成立。 - 关于Scrapy回调逻辑:Scrapy没有对
parse方法做特殊处理,任何回调方法只要是可调用对象、且方法内yield的请求/数据能被引擎捕获,都会正常执行调度,不存在自定义方法里的请求不生效的规则。
内容的提问来源于stack exchange,提问作者Kellerness
相关产品推荐
相关产品推荐

