1

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

这是我的CsvPipeline类:

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
4

4 回答 4

4

有一个已经内置的提要导出器。查看scrapy文档

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

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

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

class MySpider(Spider):
    name = 'myspider'
    custom_settings = {'FEED_URI': 'myspider.csv'}
于 2017-04-08T06:36:09.097 回答
2

您可以在FEED_URI设置中使用命名参数,这些参数被蜘蛛属性替换:

FEED_URI = '%(name)s.csv'
于 2017-04-08T08:53:32.187 回答
1

我将实现以下方法: 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 管道文档

于 2017-04-08T03:59:48.167 回答
0

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

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

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

现在应该定义为:

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

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

(希望这可以帮助任何可能发现这个问题但正在使用更新的scrapy版本的人。)

于 2021-10-23T16:16:29.267 回答