【问题标题】:Scrapy write to csv without delayScrapy立即写入csv
【发布时间】:2017-09-01 11:24:21
【问题描述】:

我怎样才能配置scrapy以不延迟地写入csv。

如果我运行scrapy crawl spider_1 并假设spider_1 预计有200 个项目,那么scrapy 将在csv 中写入,但分批写入。我不知道在哪里配置这个。

我试过了

CONCURRENT_REQUESTS = 1

CONCURRENT_ITEMS = 1

但它仍然以 15+ 批次写入 csv 文件。

这是我测试它的方式..

while sleep 2; do cat results/price.csv | wc -l; done;

结果是

   0
  35
  35
  35
  35
  52
  52
  52
  52
  70
  70

请注意,它会写入第一个 32th 项目,然后是 20th,然后是 18th

我想要的是在获取数据后立即写入项目。 我怎样才能做到这一点?

【问题讨论】:

  • scrapy 不发出同步请求。它发送大量请求并等待响应。因此你不会得到序列输出。
  • 您可能想看看CsvItemExporter 是如何实现的,尤其是。 .export_item().
  • 我有类似的问题。我做了什么我将所有数据写入mongodb,然后从那里写入所有数据
  • @AnuragMisra 实际上你的建议是有道理的。我目前的实现是scrapy + django。我不想延迟的原因是我想以角度显示递增的数字(csv 行数)。因此,我可以创建一个指向 django 模型的 drf 端点。谢谢
  • @rojeeer,是的,我在管道中相应地实现了它。我用CsvItemExporter。在 spider_open 中,我做spider_opened。在spider_closed 我做self.exporter.finish_exporting()。在process_item 我做self.exporter.export_item(item) 并且我把它保存在django 数据库中。当我运行爬虫并签入 django 数据库时,它是同步的,与 csv 文件不同。

标签: python scrapy


【解决方案1】:

正如我所评论的,将项目写入文件时,项目不会立即写入磁盘,除非缓冲区已满或刷新缓冲区,否则它会被缓冲。由于您使用 CsvItemExporter,它不会为每个项目刷新缓冲区,请参阅csvwriter does not save to file whay,如果您确实需要此功能,则需要调用 flush。

一种选择是您可以扩展 CsvItemExporter 并覆盖 export_item 函数,例如:

class MyCsvItemExporter(CsvItemExporter):
    def export_item(self, item):
        if self._headers_not_written:
            self._headers_not_written = False
            self._write_headers_and_set_fields_to_export(item)

        fields = self._get_serialized_fields(item, default_value='',
                                             include_empty=True)
        values = list(self._build_row(x for _, x in fields))
        self.csv_writer.writerow(values)
        #flush
        self.stream.flush()

我还没有测试代码。还有一个关于python flush to file的话题值得一读。

希望对您有所帮助。 谢谢

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-22
    相关资源
    最近更新 更多