Как можно экспортировать элементы экспорта для разделения файлов csv на элемент

Я соскабливаю сайт футбола, и паук (единственный паук) получает несколько видов предметов со страниц сайта: Team, Match, Club и т.д. Я пытаюсь использовать CSVItemExporter для хранения этих элементов в отдельных файлах csv, teams.csv, matches.csv, clubs.csv и т.д.

Я не уверен, что это правильный способ сделать это. Единственный способ, который я думал до сих пор, - создать собственный собственный конвейер, как в примере http://doc.scrapy.org/en/0.14/topics/exporters.html и открываем все необходимые csv файлы в методе spider_opened, т.е. создаем csv-экспортер для каждого файла csv и в коде process_item помещаем код выяснить, какой элемент является параметром "item", а затем отправить его соответствующему экспоненту.

Во всяком случае, я не нашел примеров обработки нескольких файлов csv (по типу элемента) в scrapy, поэтому я беспокоюсь, что использую его таким образом, который не предназначен для использования. (это мой первый опыт работы с Scrapy).

Диомед

Ответ 1

Вы приближаетесь, кажется мне хорошо. Пиплины - отличная особенность Scrapy, и они построены для того, что вам нравится.

Вы можете создать несколько элементов (например, SoccerItem, MatchItem), а в MultiCSVItemPipeline просто делегировать каждый элемент в свой собственный класс CSV, проверив класс элемента.

Ответ 2

Я размещаю здесь код, который я использовал для создания MultiCSVItemPipeline на основе ответа drcolossos выше.

Этот конвейер предполагает, что все классы Item следуют за соглашением * Элемент (например, TeamItem, EventItem) и создает файлы team.csv, event.csv и отправляют все записи в соответствующие файлы csv.

from scrapy.exporters import CsvItemExporter
from scrapy import signals
from scrapy.xlib.pydispatch import dispatcher


def item_type(item):
    return type(item).__name__.replace('Item','').lower()  # TeamItem => team

class MultiCSVItemPipeline(object):
    SaveTypes = ['team','club','event', 'match']
    def __init__(self):
        dispatcher.connect(self.spider_opened, signal=signals.spider_opened)
        dispatcher.connect(self.spider_closed, signal=signals.spider_closed)

    def spider_opened(self, spider):
        self.files = dict([ (name, open(CSVDir+name+'.csv','w+b')) for name in self.SaveTypes ])
        self.exporters = dict([ (name,CsvItemExporter(self.files[name])) for name in self.SaveTypes])
        [e.start_exporting() for e in self.exporters.values()]

    def spider_closed(self, spider):
        [e.finish_exporting() for e in self.exporters.values()]
        [f.close() for f in self.files.values()]

    def process_item(self, item, spider):
        what = item_type(item)
        if what in set(self.SaveTypes):
            self.exporters[what].export_item(item)
        return item