Scrapy配置多Pipeline分类型处理Item时触发NameError问题求助
Scrapy Pipeline NameError 问题排查与修复
错误触发原因
你代码中的核心问题集中在pipelines.py文件,具体如下:
- 类继承错误:Scrapy Pipeline 不需要继承自定义的Item类,你错误地让
ProjectlistPipeline继承ProjectItem、ProjectPipeline继承ProjectDetails,导致类初始化时导入链异常,触发ProjectItem未定义的NameError。 - 缩进逻辑错误:你把
__init__、create_table、实际处理数据的process_item方法全部写在了第一层process_item的return语句之后,这些方法根本没有被注册为Pipeline的类方法,代码逻辑完全无法正常执行。 - SQL语法错误:单元素的SQL参数需要显式加逗号声明为元组,你写的
(item['project_title'])会被识别为普通字符串,后续执行时会报参数数量不匹配错误。 - 方法重复定义:每个Pipeline内出现了两次
process_item方法定义,逻辑完全冲突。
修复方案
直接替换你的pipelines.py为以下代码即可:
import sqlite3 from tutorial.items import ProjectItem from tutorial.items import ProjectDetails class ProjectlistPipeline: def __init__(self): self.con = sqlite3.connect('freelancer.db') self.cur = self.con.cursor() self.create_table() def create_table(self): self.cur.execute("""CREATE TABLE IF NOT EXISTS projects( project_title TEXT PRIMARY KEY)""") def process_item(self, item, spider): if not isinstance(item, ProjectItem): return item self.cur.execute("""INSERT OR IGNORE INTO projects VALUES(?)""", (item['project_title'],)) self.con.commit() return item class ProjectPipeline: def __init__(self): self.con = sqlite3.connect('freelancer.db') self.cur = self.con.cursor() self.create_table() def create_table(self): self.cur.execute("""CREATE TABLE IF NOT EXISTS project_site( project_budget TEXT)""") def process_item(self, item, spider): if not isinstance(item, ProjectDetails): return item self.cur.execute("""INSERT OR IGNORE INTO project_site VALUES(?)""", (item['project_budget'],)) self.con.commit() return item
验证说明
修复后重新启动爬虫即可正常区分两类Item,分别写入对应的SQLite表中,原NameError问题会直接解决。
内容的提问来源于stack exchange,提问作者CodeCoder20
相关产品推荐
相关产品推荐

