シリアル化可能なスクレイプフレームワークの下のパイプラインアイテム:TypeError:ObjectId( '5be7f7075f627d30060a9eeb')はJSONではありません



Pipeline Item Under Serializable Scrapy Framework



スクレイピーフレームワークで見つかった問題は正しくありません。

Traceback (most recent call last): File '/usr/local/lib/python3.5/dist-packages/twisted/internet/defer.py', line 654, in _runCallbacks current.result = callback(current.result, *args, **kw) File '/home/python/PycharmProjects/untitled/jd/jd/pipelines.py', line 17, in process_item content = json.dumps(item,ensure_ascii=False)+' ' File '/usr/lib/python3.5/json/__init__.py', line 237, in dumps **kw).encode(obj) File '/usr/lib/python3.5/json/encoder.py', line 198, in encode chunks = self.iterencode(o, _one_shot=True) File '/usr/lib/python3.5/json/encoder.py', line 256, in iterencode return _iterencode(o, 0) File '/usr/lib/python3.5/json/encoder.py', line 179, in default raise TypeError(repr(o) + ' is not JSON serializable') TypeError: ObjectId('5be7f7075f627d30060a9eeb') is not JSON serializable

これは、JdPipelineのjson.dumps()がアイテムのObjectIdをjsonデータにシリアル化できないことを示しています。



settings.py 内部のコード、MongoDBPipeを最初に実行させます

ITEM_PIPELINES = { 'jd.pipelines.JdPipeline': 309, 'jd.pipelines.MongoDBPipe': 300, }

pipes.py コードイン



import json class JdPipeline(object): def open_spider(self,spider): if spider.name == 'phone': self.file = open('JD_phone.jsonlines','w',encoding='utf8') def process_item(self, item, spider): if spider.name == 'phone': print(33333, item) content = json.dumps(item,ensure_ascii=False)+' ' self.file.write(content) return item def close_spider(self,spider): if spider.name == 'phone': self.file.close() from pymongo import MongoClient class MongoDBPipe(object): def open_spider(self,spider): if spider.name == 'phone': self.client = MongoClient('127.0.0.1', 27017) self.col = self.client['phone']['infor'] def process_item(self, item, spider): print(11111, item) if spider.name == 'phone': self.col.insert(item) print(22222, item) return item def close_spider(self, spider): if spider.name == 'phone': self.client.close()

‘’ ’
MongoDBが実行されてアイテムがJdPipelineに返されると(ディクショナリにディクショナリデータがあり、データにNを超えるデータが含まれている場合、データは終了せず、ラップされます)、MongoDBはself.col.insert(dict(item)) 、それ以外の場合はエラーを報告します。さらに、JdPipelineが実行されて最初にアイテムが返される場合、MongoDBはself.col.insert(item)を使用します。

A:受け取るアイテムはすべて同じではありませんが。 MongoDBPipeのself.col.insert(item)は、_id:Object(xxx ...)のオブジェクトフィールドをアイテムに追加します。これはmongodbの下部であり、自動的にデータになります。簡単に取得できるようにIDを増やします。 self.col.insert(dict(item))の場合、アイテムは辞書に再変換されます:remove _id:Object(xxx ...)なので、アイテムをクラスJdPipelineまたは元のアイテムに戻します。エラーはありません。 、それ以外の場合item _id:Object(xxx ...)のフィールドがあり、json.dumps(item、ensure_ascii = False)+ ' n'は_id:Object(xxx ...)オブジェクトをjsonデータに変換できません、文字列である必要があります。キーと値のペアはjsonに変換できます。注意深く観察し、エラーを徐々に排除して理由を見つけます。コントラストは非常に重要です。私はそれが好きになることを願っています。
‘’ ’