Scrapy: cómo generar elementos en un formato json específico

Salí los datos raspados en formato json. El exportador predeterminado de scrapy muestra la lista de dict en formato json. El tipo de elemento se ve como:

[{"Product Name":"Product1", "Categories":["Clothing","Top"], "Price":"20.5", "Currency":"USD"}, {"Product Name":"Product2", "Categories":["Clothing","Top"], "Price":"21.5", "Currency":"USD"}, {"Product Name":"Product3", "Categories":["Clothing","Top"], "Price":"22.5", "Currency":"USD"}, {"Product Name":"Product4", "Categories":["Clothing","Top"], "Price":"23.5", "Currency":"USD"}, ...] 

Pero quiero exportar los datos en un formato específico como este:

 { "Shop Name":"Shop 1", "Location":"XXXXXXXXX", "Contact":"XXXX-XXXXX", "Products": [{"Product Name":"Product1", "Categories":["Clothing","Top"], "Price":"20.5", "Currency":"USD"}, {"Product Name":"Product2", "Categories":["Clothing","Top"], "Price":"21.5", "Currency":"USD"}, {"Product Name":"Product3", "Categories":["Clothing","Top"], "Price":"22.5", "Currency":"USD"}, {"Product Name":"Product4", "Categories":["Clothing","Top"], "Price":"23.5", "Currency":"USD"}, ...] } 

Por favor, aconsejame alguna solución. Gracias.

Esto está bien documentado en la página web de scrapy aquí .

 from scrapy.exporters import JsonItemExporter class ItemPipeline(object): file = None def open_spider(self, spider): self.file = open('item.json', 'w') self.exporter = JsonItemExporter(self.file) self.exporter.start_exporting() def close_spider(self, spider): self.exporter.finish_exporting() self.file.close() def process_item(self, item, spider): self.exporter.export_item(item) return item 

Esto creará un archivo json que contiene sus artículos.

Estaba tratando de exportar JSON bastante impreso y esto es lo que funcionó para mí.

Creé una tubería que se veía así:

 class JsonPipeline(object): def open_spider(self, spider): self.file = open('your_file_name.json', 'wb') self.file.write("[") def close_spider(self, spider): self.file.write("]") self.file.close() def process_item(self, item, spider): line = json.dumps( dict(item), sort_keys=True, indent=4, separators=(',', ': ') ) + ",\n" self.file.write(line) return item 

Es similar al ejemplo de los documentos desechables https://doc.scrapy.org/en/latest/topics/item-pipeline.html, excepto que imprime cada propiedad JSON con sangría y en una nueva línea.

Vea la parte sobre impresión bonita aquí https://docs.python.org/2/library/json.html