scrapy如何将项目导出为每个项目单独的csv文件

2024-05-12 14:34:08 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

迪奥米德


Tags: 文件csv方法类型网站页面item物品
2条回答

你的做法对我来说很好。Piplines是Scrapy的一个很好的特性,我是为类似于您的方法而构建的。

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

我在这里发布的代码是我用来根据上面drcolosos的答案生成一个MultiCSVItemPipeline

此管道假定所有项类都遵循约定*项(例如team Item、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

相关问题 更多 >