报错:TypeError: Object of type 'Ob
2019-08-19 本文已影响0人
越大大雨天
在爬虫中使用MongoDB保存数据时可能遇到这个错误,虽然不会影响数据的写入,但是在终端显示时会一直不断报这个错误。
报错原因
造成改问题的原因是数据在写入MongoDB的时候,即使你没有指定_id字段,也会为每一行数据自动生成一个_id字段,而这个_id字段的类型如我截图所示:
image.png
该字段为ObjectId类型,不能使用Json序列化返回,因此解释器中不断报错。
解决办法
既然_id字段不能被转换,也对我们实际数据没什么作用,那就不让它显示就行了。
在pipeline的process_item(self, item, spider)
方法中我们是直接return的item,item中已经包括了自动生成的_id字段,因此,在return之前,删除_id字段即可,如下:
def process_item(self, item, spider):
if spider.name == 'book':
item = dict(item)
self.collection.insert(item)
# 此时item对象必须是一个字典,再插入
# 如果此时item是BaseItem则需要先转换为字典:dict(BaseItem)
item.pop("_id")
return item
使用pop先弹出_id字段,再返回。重新运行程序,不再报错。
除了scrapy中可能遇到该问题,在其他序列化返回MongoDB数据的地方也可能会遇到这样的报错,解决方法都可以通用。