python - Scrapy 立即写入 csv

标签 python scrapy

我如何配置scrapy以立即写入csv。

如果我运行 scrapycrawlspider_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

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

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

最佳答案

正如我所评论的,将项目写入文件时,该项目不会立即写入磁盘,而是会被缓冲,除非缓冲区已满或刷新缓冲区。由于您使用 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的主题值得一读。

希望对您有帮助。 谢谢

关于python - Scrapy 立即写入 csv,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45999238/

相关文章:

python - 找不到 Pyspark 模块

python - 有没有简单的方法来检查网站是否有 SSL 证书

python-3.x - 如何从 AWS Lambda 运行 Scrapy 蜘蛛?

python - Scrapy根据css属性解析网页中的html字符串

python - 如果比 Lastmod 日期更新,则抓取 url -Scrapy

python - 错误: no module named gtk.林间空地

python - 将列表的 numpy 数组展平为每行 4 个值

Python-GStreamer:使用固定参数访问回调函数内的类成员

docker - 谷歌应用引擎 : Load another Docker Image for Scrapy + Splash

python - 无法使用 scrapy 从 Reddit 嵌入式提要窗口中获取 `href`