从Scrapy导出CSV文件(不通过命令行)

21 投票
4 回答
17321 浏览
提问于 2025-04-18 16:15

我成功地通过命令行把我的项目导出成了一个csv文件,像这样:

   scrapy crawl spiderName -o filename.csv

我想问的是: 在代码中怎么做这个最简单?我需要这样做,因为我从另一个文件中提取文件名。 最终的结果应该是,我调用

  scrapy crawl spiderName

然后它就会把项目写入filename.csv这个文件里。

4 个回答

1

最新的回答是:

使用内置的导出功能。你可以把文件名设置为关键字。配置可能看起来像这样:

filename = 'export' 
class mySpider(scrapy.Spider):
  custom_settings = {
    'FEEDS': {
      f'{filename}.csv': {
        'format': 'csv',
        'overwrite': True
      }
    }
  }

文档链接: https://docs.scrapy.org/en/latest/topics/feed-exports.html#std-setting-FEEDS

1

这就是“数据导出”的用途:

http://doc.scrapy.org/en/latest/topics/feed-exports.html

在实现网络爬虫时,最常见的需求之一就是能够正确存储抓取到的数据。通常,这意味着需要生成一个“导出文件”,里面包含抓取到的数据(通常叫做“导出数据流”),以便其他系统使用。

Scrapy 提供了这个功能,叫做数据导出,它可以让你生成一个包含抓取项目的数据流,支持多种格式和存储方式。

2

在Scrapy中,有一种更新的方式来保存你的文件,那就是使用“FEEDS”。

class mySpider(scrapy.Spider):
    name = "myProject"
    custom_settings = {
    "FEEDS":{"fileName.csv":{"format":"csv"}},
    }
18

为什么不使用项目管道呢?

WriteToCsv.py

   import csv
   from YOUR_PROJECT_NAME_HERE import settings

   def write_to_csv(item):
       writer = csv.writer(open(settings.csv_file_path, 'a'), lineterminator='\n')
       writer.writerow([item[key] for key in item.keys()])

   class WriteToCsv(object):
        def process_item(self, item, spider):
            write_to_csv(item)
            return item

settings.py

   ITEM_PIPELINES = { 'project.pipelines_path.WriteToCsv.WriteToCsv' : A_NUMBER_HIGHER_THAN_ALL_OTHER_PIPELINES}
   csv_file_path = PATH_TO_CSV

如果你想让不同的爬虫把数据写入不同的CSV文件,你可以给你的爬虫添加一个CSV_PATH字段。然后在你的管道中使用这个爬虫的字段,而不是从设置中获取路径。

这个方法是可行的,我在我的项目中测试过。

希望这对你有帮助。

http://doc.scrapy.org/en/latest/topics/item-pipeline.html

撰写回答