我正在抓取一个网站,将数据导出为语义格式(n3)。
不过,我还想对这些数据进行一些数据分析,因此以csv格式进行分析更为方便。
为了得到两种格式的数据

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

然而,这会将数据刮两次,而且我无法负担大量的数据。
有没有办法将相同的擦除数据导出成多种格式?(无需多次下载数据)
我发现有趣的是有一个中间表示的擦除数据,可以出口到不同的格式。但似乎没办法对付斯皮奇。

最佳答案

根据我对源代码和文档的理解,-t option refers to the FEED_FORMAT setting不能有多个值。此外,FeedExporter内置扩展(source)仅适用于单个导出器。
实际上,可以考虑在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

关于python - 使用scrapy以多种格式导出抓取数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31032340/

10-13 07:23
查看更多