【问题标题】:scrapy csvpipeline to export csv according to spiders name or idscrapy csvpipeline 根据蜘蛛名称或 id 导出 csv
【发布时间】:2017-09-03 12:50:36
【问题描述】:

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

这是我的 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

【问题讨论】:

    标签: python scrapy scrapy-pipeline


    【解决方案1】:

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

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

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

    现在应该定义为:

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

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

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

    【讨论】:

      【解决方案2】:

      您可以在FEED_URI 设置中使用named parameters,它们被蜘蛛属性替换:

      FEED_URI = '%(name)s.csv'
      

      【讨论】:

        【解决方案3】:

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

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

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

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

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

        【讨论】:

          【解决方案4】:

          我会实现以下方法: 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

          【讨论】:

            猜你喜欢
            • 2012-02-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-11-29
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多