2015-06-24 6 views
5

Я соскабливаю веб-сайт для экспорта данных в семантический формат (n3). Однако я также хочу выполнить некоторый анализ данных по этим данным, поэтому использование его в формате csv более удобно.Экспорт скребок данных в нескольких форматах с использованием scrapy

Чтобы получить данные в обоих форматах можно сделать

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

Однако это скребет данные дважды, и я не могу себе это позволить с большими объемами данных.

Есть ли способ экспортировать те же скребковые данные в несколько форматов? (без загрузки данных более одного раза)

Мне очень интересно иметь промежуточное представление скрещенных данных, которые могут быть экспортированы в разные форматы. Но, похоже, нет никакого способа сделать это с помощью scrapy.

+0

Как alecxe предложенных, я отправил запрос на выделение в SCRAPY-х GitHub https://github.com/scrapy/scrapy/issues/1336 – kiril

ответ

5

Из того, что я понимаю после изучения исходного кода и документации, -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 
+0

Ok , это подходящее решение, хотя я хотел бы иметь возможность настраивать весь экспорт с использованием аргументов. Таким образом, я могу отредактировать 'settings.py', чтобы изменить конфигурацию экспорта. – kiril