scrapy如何导出项目以分隔每个项目的csv文件

时间:2012-09-01 18:34:38

标签: csv scrapy exporter

我正在抓一个足球网站,蜘蛛(一只蜘蛛)从网站的网页上获得了几种物品:团队,比赛,俱乐部等。 我正在尝试使用CSVItemExporter将这些项目存储在单独的csv文件中, teams.csv,matches.csv,clubs.csv等。

我不确定这样做的正确方法是什么。 到目前为止,我想到的唯一方法是创建我自己的自定义管道,如示例中所示 http://doc.scrapy.org/en/0.14/topics/exporters.html并在spider_opened方法中打开所有需要的csv文件,即为每个csv文件创建一个csv导出器,并在process_item中放置代码以确定哪个项目是“item”参数然后将其发送到相应的导出器对象。

无论如何,我没有找到任何处理scrapy中的多个csv文件(每个项目类型)的例子,所以我担心我以一种不打算使用它的方式使用它。 (这是我第一次使用Scrapy)。

迪奥梅德斯

3 个答案:

答案 0 :(得分:22)

我在这里发布了根据上面的drcolossos答案生成MultiCSVItemPipeline的代码。

此管道假定所有Item类都遵循约定* 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

答案 1 :(得分:11)

你对我的态度似乎很好。 Piplines是Scrapy的一个很好的功能,它可以像你的方法一样构建IMO。

您可以创建多个项目(例如SoccerItem,MatchItem),并在MultiCSVItemPipeline中通过检查项目类将每个项目委托给自己的CSV类。

答案 2 :(得分:0)

我已经尝试了答案。似乎在最新版本(2.21)中不起作用。

我已提供我的代码供您参考:

class MultiCSVItemPipeline(object):
    SaveTypes = ['CentalineTransactionsItem','CentalineTransactionsDetailItem','CentalineBuildingInfo']

    def open_spider(self, spider):
        self.files = dict([ (name, open(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 close_spider(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 = type(item).__name__
        if what in set(self.SaveTypes):
            self.exporters[what].export_item(item)
        return item