Scrapy立即写入csv

时间:2017-09-01 11:24:21

标签: python scrapy

如何配置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

请注意,它会先写入32th20th然后18th

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

1 个答案:

答案 0 :(得分:0)

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

希望它有所帮助。 感谢