Как scrapy экспорта товаров в отдельные CSV-файлы за штуку

Я соскабливаю футбольный сайт, и паук (один паук) получает несколько видов предметов со страниц сайта: команда, Матч, Клуб и т. д. Я пытаюсь использовать CSVItemExporter для хранения этих элементов в отдельных csv-файлах, команды.КШМ, спички.КШМ, клубы.КШМ и т. д.

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

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

Диомед

2 ответов


Мне кажется, что вы подходите. Piplines-отличная особенность Scrapy и IMO build для чего-то вроде вашего подхода.

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


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

этот конвейер предполагает, что все классы элементов следуют соглашению *Item (например, TeamItem, EventItem) и создает team.КШМ, событие.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