scrapy中定义items.py字段需继承scrapy.item并用scrapy.field()声明,字段名须为合法标识符,可选添加serializer或metadata元数据,批量定义仅适用于无差异化配置的场景。

在Scrapy项目中定义items.py字段,是为了明确爬取数据的结构和类型,让Pipeline能稳定接收预期格式的数据,避免因字典键名拼写错误或字段缺失导致后续处理崩溃。
创建Item类并继承scrapy.Item
进入项目根目录下的items.py文件,删除默认注释,写入import scrapy,然后定义一个类,例如BookItem,并让它继承scrapy.Item。
这一步不可跳过——如果不继承scrapy.Item,Scrapy将无法识别该类为合法Item对象,调用yield item时会抛出TypeError。
用scrapy.Field()声明每个字段
在Item类内部,为每个要提取的字段赋值scrapy.Field(),例如:title = scrapy.Field()、price = scrapy.Field()、isbn = scrapy.Field()。
【字段名必须是合法的Python标识符,不能含空格、连字符或中文】。比如写成book-price = scrapy.Field()会直接报语法错误;写成书名 = scrapy.Field()虽不报错,但在Pipeline中用item['书名']访问时,可能因编码或IDE兼容性引发隐性异常。
给字段添加元数据说明(可选但推荐)
方法一:直接在scrapy.Field()中传入关键字参数,如url = scrapy.Field(serializer=str.strip),表示该字段入库前自动调用str.strip()清洗。
方法二:用metadata字典存业务含义,例如category = scrapy.Field(metadata={'description': '图书所属一级分类,如文学、计算机'}),方便团队协作时快速理解字段用途。
注意:serializer函数必须是可调用对象,不能写成serializer='str.strip'字符串,否则运行时不会执行清洗,也不会报错,容易埋下脏数据隐患。
批量定义多个字段(适用于字段名规律性强的场景)
第一步:在类外部预先构造字段名列表,例如attr_names = ['name', 'age', 'city']。
第二步:用for循环动态设置类属性:for name in attr_names: setattr(BookItem, name, scrapy.Field())。
第三步:确保这段代码写在class BookItem(scrapy.Item):定义之后、文件末尾之前,否则字段不会被加载进类命名空间。
这一步操作起来很简单,但仅适合字段无差异化配置的场景;如果部分字段需要serializer、部分需要metadata,仍需手动逐个声明。











