Как 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