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
相关产品推荐
相关产品推荐

