如何scrapy出口项目分开每个项目的CSV文件(How can scrapy export ite

2019-06-27 16:26发布

我刮足球网站,蜘蛛(单蜘蛛)得到几种物品从网站的页面:团队,比赛,俱乐部等我试图使用CSVItemExporter存储在单独的CSV文件,这些项目,teams.csv ,matches.csv,clubs.csv等

我不知道是什么做的正确方法。 到目前为止,我已经想到的唯一方法是创建自己的自定义管道像例如http://doc.scrapy.org/en/0.14/topics/exporters.html而且在spider_opened方法打开所有需要的CSV文件,即创建的每个csv文件,并在process_item放码的CSV出口弄清楚什么样的项目是“项目”参数,然后将其发送到相应的出口对象。

反正我还没有发现在scrapy处理多个CSV文件(每个项目类型),所以我担心,我在这并不意味着要使用的方式使用它的任何实例。 (这是我的Scrapy第一次的经验)。

迪奥梅德斯

Answer 1:

你的方法似乎没什么问题。 Piplines是Scrapy的一个很大的特点,并IMO建立类似的做法。

你可以创建多个项目(例如SoccerItem,MatchItem),并在您的MultiCSVItemPipeline刚刚通过检查项目类委托各项目自身的CSV类。



Answer 2:

我在这里发布我用来生产代码MultiCSVItemPipeline基于上述drcolossos的答案。

这条管道假设所有的项目类别按照惯例*项目(如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


文章来源: How can scrapy export items to separate csv files per item