最近在练习用scrapy爬文本数据,在爬某问答社区的时候,因为问题有两级分类:c1,c2,我用一个列表来存储分类信息:item[‘class’] = [c1,c2]
但是在使用Request函数向下一级传递item信息时,使用如下函数
Request(href,meta={‘item’:item},callback=self.parse2,dont_filter=True)
却发现传递到parse2中的item[‘class’]的值与传递前不同,在传递前,我的item[‘class’]值无论是[c1,c2]还是[c1,c3]还是[c1,c4],传递后都变为了[c1,c4]。
查找原因后,发现是因为使用Request函数传递item时,使用的是浅复制(对象的字段值被复制时,字段引用的对象不会被复制),因此item被复制时,class字段对应的列表中的值c1,c2没有被复制。
解决方法:
在调用Request时使用深复制
import copy
class spider(scrapy.Spider)
name=[‘xx’]
start_urls=[‘xx’]
def parse(self,response):
#…
yield Request(href,meta={‘item’:copy.deepcopy(item)},callback=self.parse2,dont_filter=True)