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

Scrapy爬虫__init__中定义rules未触发parse_items回调是什么原因?

问题核心原因

你当前使用的是Scrapy的CrawlSpider类,parse_items不回调的核心问题有两个:

  • 局部变量未绑定实例:你在__init__中定义的rules、start_urls、custom_settings都是函数内的局部变量,没有赋值给self.xxx实例属性,Scrapy框架无法读取到这些配置,自然不会按你定义的规则抓取链接、触发回调。
  • 父类初始化顺序错误:CrawlSpider的__init__方法会提前编译rules规则生成链接匹配逻辑,你先执行了super().__init__(),再设置rules的话,父类已经完成了规则编译,后续新增的规则不会生效。

修正后的代码

def __init__(self, inputfile="input.csv", *args, **kwargs):
    # 先定义实例级别的custom_settings,要在调用super之前设置
    self.custom_settings = {
        'ITEM_PIPELINES': {
            'ScrapySpider.pipelines.PostProcessingHtml': 300,
            'ScrapySpider.pipelines.GetShortDesc': 301,
            # 'ScrapySpider.pipelines.Database': 302
        }
    }
    # 读取输入文件构造规则和初始链接
    InputData = ReadParamsFromCSV(inputfile)
    self.start_urls = []
    self.rules = []
    for item in InputData:
        self.start_urls.append(item[0])
        self.rules.append(
            Rule(LinkExtractor(allow=item[1]),
                 callback='parse_items',
                 cb_kwargs={'InputData': item},
                 follow=True))
    # 所有配置设置完成后,再调用父类初始化方法
    super(DemoSpider, self).__init__(*args, **kwargs)

补充说明

  • 爬虫类的__init__方法不需要返回任何内容。
  • 如果没有动态修改配置的需求,custom_settings也可以直接定义为爬虫类的类属性,不用放在__init__里设置。
  • 可以额外检查InputData[i][1]的正则规则是否和你要匹配的链接格式一致,规则写错也会导致无法提取到链接触发回调。

内容的提问来源于stack exchange,提问作者user16570427

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 08:45:09