报错: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数据的地方也可能会遇到这样的报错,解决方法都可以通用。

上一篇下一篇

猜你喜欢

热点阅读