在用scrapy进行数据爬取的时候,发现通过meta传递的数据不匹配,最后发现是深拷贝和浅拷贝的问题。
Bug详情
Request 会浅复制传入的 meta 字典,但其中的可变值(比如 item)仍可能被多个请求共享。如果循环里复用同一个 item 并继续修改,等待处理的请求就可能读到后一次修改的值,造成前后不匹配。
可以为每条逻辑记录新建 item;如果需要保留传递时的快照,也可以深拷贝这个 item。
1 | import copy |
同理,如果 yield 后还会继续修改同一个 item,也可以先深拷贝再传递,避免后续修改影响已交出的数据:
1 | # 原来是yield item ,变成如下的样子即可。 |