使用scrapy导出多种格式的刮削数据



我正在抓取一个网站,将数据导出为语义格式(n3)。然而,我也想对这些数据进行一些数据分析,所以以csv格式进行分析更方便。

要获得两种格式的数据,我可以进行

scrapy spider -t n3 -o data.n3
scrapy spider -t csv -o data.csv

然而,这会两次刮伤数据,我负担不起大量数据。

是否有方法将相同的刮削数据导出为多种格式(不需要多次下载数据)

我发现有趣的是,有一个可以导出为不同格式的刮取数据的中间表示。但是,似乎没有办法做到这一点与斗志。

根据我对源代码和文档的了解,-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

相关内容

  • 没有找到相关文章

最新更新