Scrapy循环生成多Item返回重复数据,请问问题出在哪里?
问题原因及解决办法
你遇到的问题核心是Python的对象引用机制:
你写的new_item = item并没有创建新的Item实例,只是让new_item变量指向了原来的item对象。循环里每次修改new_item["new_field"],其实都是在修改同一个Item对象,最后yield出去的全是这个对象的引用,所以返回的n条数据完全相同。
解决办法很简单,每次循环都创建一个独立的Item实例,有两种常用方式:
方式1:使用深拷贝(推荐,适合Item包含嵌套结构的情况)
from copy import deepcopy for i in new_fields: new_item = deepcopy(item) # 完全复制原item的所有内容,生成新实例 new_item["new_field"] = i yield new_item
方式2:使用Scrapy Item的copy方法(适合字段都是简单类型的情况)
Scrapy的Item类自带copy()方法,可以快速创建浅拷贝:
for i in new_fields: new_item = item.copy() new_item["new_field"] = i yield new_item
这样每次yield的都是独立的Item对象,修改new_field只会影响当前循环的实例,最终返回的每条数据就会对应不同的new_field值了。
内容的提问来源于stack exchange,提问作者Zero
相关产品推荐
相关产品推荐

