没有输出的输入是不完整的

0%

Bug-scrapy-数据错位

在用scrapy进行数据爬取的时候,发现通过meta传递的数据不匹配,最后发现是深拷贝和浅拷贝的问题。

Bug详情

Request 会浅复制传入的 meta 字典,但其中的可变值(比如 item)仍可能被多个请求共享。如果循环里复用同一个 item 并继续修改,等待处理的请求就可能读到后一次修改的值,造成前后不匹配。
可以为每条逻辑记录新建 item;如果需要保留传递时的快照,也可以深拷贝这个 item。

1
2
3
4
import copy
···
def parse(self, response):
yield Request(url=new_url, meta={'item': copy.deepcopy(item)}, callback=self.another_parse)

同理,如果 yield 后还会继续修改同一个 item,也可以先深拷贝再传递,避免后续修改影响已交出的数据:

1
2
# 原来是yield item ,变成如下的样子即可。
yield copy.deepcopy(item)

参考链接

1.scrapy里面item传递数据后数据不正确的问题