小编典典

如何抓取导出项目以将每个项目的CSV文件分开

scrapy

我正在抓取一个足球网站,spider (a single spider) 从该网站的页面中获取了多种物品:团队,比赛,俱乐部等。我试图使用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”参数是哪种项目,然后将其发送到相应的导出器对象。

无论如何,我还没有找到任何处理多个csv文件(按项目类型)的示例,因此我担心我以一种不被使用的方式使用它。(这是我对Scrapy的第一次体验)。


阅读 569

收藏
2020-04-09

共2个答案

小编典典

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

该管道假定所有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
2020-04-09
小编典典

你的方法对我来说似乎不错。管道是Scrapy的一个重要功能,也是IMO为类似您的方法而构建的。

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

2020-04-09