2017-09-01 49 views
1

如何配置scrapy以毫无延迟地写入csv。Scrapy无延迟地写入csv

如果我运行了scrapy crawl spider_1并且假设spider_1有预期的200个项目,那么scrapy将会以csv写入,但是按批次写入。我不知道在哪里配置这个。

我试过

CONCURRENT_REQUESTS = 1 

CONCURRENT_ITEMS = 1 

但它仍然在csv文件通过15+批次写道。

这里是他们的方式我测试了它..

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

我想要的是在获取数据后立即写入项目。 我该怎么做?

+0

scrapy不做同步请求。它发出很多请求并等待响应。因此你不会得到序列输出。 –

+0

你可能想看看['CsvItemExporter'](https://github.com/scrapy/scrapy/blob/dfe6d3d59aa3de7a96c1883d0f3f576ba5994aa9/scrapy/exporters.py#L206)是如何实现的,尤其是, '.export_item()'。 –

+0

我有类似的问题。我做了什么,我把所有的数据写入mongodb,然后写出所有的数据 –

回答

0

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

一种选择是,你可以扩展CsvItemExporter并覆盖export_item功能,e.g:

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的话题值得一读。

希望它有帮助。 谢谢

+0

谢谢@rojeeer –