kir*_*ril 6 python exporter scrapy web-scraping
我正在抓取一个网站将数据导出为语义格式(n3).但是,我还想对该数据进行一些数据分析,因此以csv格式使用它更方便.
要获得两种格式的数据,我都可以
scrapy spider -t n3 -o data.n3
scrapy spider -t csv -o data.csv
Run Code Online (Sandbox Code Playgroud)
但是,这会刮掉数据两次,我无法承受大量数据.
有没有办法将相同的数据导出为多种格式?(不多次下载数据)
我觉得有趣的是有一个可以导出成不同格式的抓取数据的中间表示.但似乎没有办法用scrapy做到这一点.
根据我在探索源代码和文档后的理解,-t选项指的是FEED_FORMAT不能有多个值的设置.此外,FeedExporter内置扩展(源)仅适用于单个导出器.
实际上,考虑在Scrapy Issue Tracker上提出功能请求.
更像是一种解决方法,定义管道并开始使用多个导出器导出.例如,以下是如何导出为CSV和JSON格式:
from collections import defaultdict
from scrapy import signals
from scrapy.exporters import JsonItemExporter, CsvItemExporter
class MyExportPipeline(object):
def __init__(self):
self.files = defaultdict(list)
@classmethod
def from_crawler(cls, crawler):
pipeline = cls()
crawler.signals.connect(pipeline.spider_opened, signals.spider_opened)
crawler.signals.connect(pipeline.spider_closed, signals.spider_closed)
return pipeline
def spider_opened(self, spider):
csv_file = open('%s_products.csv' % spider.name, 'w+b')
json_file = open('%s_products.json' % spider.name, 'w+b')
self.files[spider].append(csv_file)
self.files[spider].append(json_file)
self.exporters = [
JsonItemExporter(json_file),
CsvItemExporter(csv_file)
]
for exporter in self.exporters:
exporter.start_exporting()
def spider_closed(self, spider):
for exporter in self.exporters:
exporter.finish_exporting()
files = self.files.pop(spider)
for file in files:
file.close()
def process_item(self, item, spider):
for exporter in self.exporters:
exporter.export_item(item)
return item
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
946 次 |
| 最近记录: |