2017-09-01 44 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 –