2017-09-01 14 views
1

どのようにしてCSVで遅延なく書き込むように設定できますか?遅延なしでCSVへの書き込みを書く

scrapy crawl spider_1を実行し、spider_1に予想される200個のアイテムがあるとすると、治療はcsvではなくバッチで書き込まれます。私はこれを設定する場所がわかりません。

私は

CONCURRENT_REQUESTS = 1 

CONCURRENT_ITEMS = 1 

を試みたが、まだそれは15+バッチでcsvファイルに書き込みます。ここで

は、彼らが道私はそれをテストして..です

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

結果は、それが20th最初32th項目を書き込む

0 
    35 
    35 
    35 
    35 
    52 
    52 
    52 
    52 
    70 
    70 

お知らせ18thました。

私が欲しいのは、データを取得した直後にアイテムを書き込むことです。 どうすればいいですか?

+0

治療は同期要求しないでください。それは多くの要求を送り、応答を待つ。したがって、シーケンス出力は得られません。 –

+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を呼び出す必要があります。私はまだコードをテストしていない

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() 

1つのオプションは、あなたがCsvItemExporterを拡張し、export_item機能、例えばを上書きすることができるということです。また、読む価値があるpython flush to fileに関するトピックもあります。

希望します。 ありがとう

+0

ありがとう@rojeeer –

関連する問題