scrapy csvpipeline 根据蜘蛛名称或 ID 导出 csv

scrapy csvpipeline to export csv according to spiders name or id

我有两个不同的蜘蛛运行。我正在寻找以蜘蛛名称命名的 2 个不同的 csv 文件。 spider1.csv 数据来自 spider1 和 spider2.csv 数据来自 蜘蛛2

这是我的 CsvPipeline class:

class CsvPipeline(object):
def __init__(self):
    self.file = open("ss.csv", 'wb')
    self.exporter = CsvItemExporter(self.file, unicode)
    self.exporter.start_exporting()

def close_spider(self, spider):
    self.exporter.finish_exporting()
    self.file.close()

def process_item(self, item, spider):
    self.exporter.export_item(item)
    del item['crawlid']
    del item['appid']
    return item

我将实现以下方法: open_spider(self, spider):

蜘蛛打开时调用此方法

参数: spider (Spider object) – 打开的蜘蛛

class CsvPipeline(object):
def __init__(self):
    self.files = {}

def open_spider(self, spider):
    self.file = open("%s.csv" % (spider.name), 'wb')
    self.exporter = CsvItemExporter(self.file, unicode)
    self.exporter.start_exporting()

def close_spider(self, spider):
    self.exporter.finish_exporting()
    self.file.close()

def process_item(self, item, spider):
    self.exporter.export_item(item)
    del item['crawlid']
    del item['appid']
    return item

更多:scrapy pipeline documentation

已经有一个内置的提要导出器。参见 scrapy docs

简而言之,您只需将这些添加到您的 settings.py:

FEED_URI = 'somename.csv'
FEED_FORMAT = 'csv'

您还可以为每个蜘蛛设置这些设置:

class MySpider(Spider):
    name = 'myspider'
    custom_settings = {'FEED_URI': 'myspider.csv'}

可以使用named parameters in a FEED_URI设置,替换为spider属性:

FEED_URI = '%(name)s.csv'

在最近的 scrapy 版本中,FEED_URIFEED_FORMAT 设置已被弃用,取而代之的是 FEEDS 设置。

那么,什么可以定义为(如 的回答中所述):

FEED_URI = '%(name)s.csv'
FEED_FORMAT = 'csv'

现在应该定义为:

FEEDS = {
    '%(name)s.csv': {
        'format': 'csv',
    }
}

我认为这比覆盖每个蜘蛛的提要 uri 或实现自定义管道来执行提要导出器已经做的事情更优雅。

(希望这对可能发现此问题但使用较新的 scrapy 版本的任何人有所帮助。)