You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 10:18:22