2014-03-06 24 views
3

Scrapy的JOBDIR設置快速複製項目提供可恢復爬網,描述如下:Scrapy - 使用JOBDIR

http://doc.scrapy.org/en/latest/topics/jobs.html

我嘗試這樣執行我的檢索命令:

scrapy crawl myspider -o out.csv -t csv -s JOBDIR=./jobs/run-1 

雖然它仍在運行,我按CTRL-C優雅地關閉它。然後再次發出相同的命令以恢復它。我可以證實,它是從終端輸出恢復抓取:

[myspider] INFO: Resuming crawl (74 requests scheduled) 

但是,當我看到我的輸出CSV文件,我看到有重複的項目是這樣的:

name,email 
Alice,[email protected] 
Bob,[email protected] 
... 
name,email   <- duplicated header! 
Bob,[email protected] <- duplicated row! 
... 

這是正常的嗎?我想知道在同一個命令中是否可以使用-o選項和JOBDIR。如果不是,我如何導出抓取的項目?

順便說一句,我正在使用Scrapy 0.22.1。

謝謝!

回答

4

是的,這是可以預料的。如果您想看看的scrapy的源代碼,特別是CsvItemExporter,你會發現,這是無國籍相對於停止/恢復爬。出口商基本上處理帶有2個標誌的標題。一個指示是否包含標題:include_headers_line。第二個:_headers_not_written,除了會話的第一個項目外,每次都會阻止標題被轉儲,寫入一個新的被刪除項目。然而,這些標誌被重置每次履帶重新啓動重新時間和出口商似乎並沒有攜帶任何類型的信息,關於續會:

class CsvItemExporter(BaseItemExporter): 

    def __init__(self, file, include_headers_line=True, join_multivalued=',', **kwargs): 

     .... 
     self._headers_not_written = True 
     .... 

    def export_item(self, item): 
     if self._headers_not_written: 
      self._headers_not_written = False 
      self._write_headers_and_set_fields_to_export(item) 

而且-o選項做無非指示crawler轉儲將所刮取的物品放入指定的輸出:

class Command(ScrapyCommand): 

    .... 

    def add_options(self, parser): 
     ScrapyCommand.add_options(self, parser) 
     parser.add_option("-a", dest="spargs", action="append", default=[], metavar="NAME=VALUE", \ 
      help="set spider argument (may be repeated)") 
     parser.add_option("-o", "--output", metavar="FILE", \ 
      help="dump scraped items into FILE (use - for stdout)") 
     parser.add_option("-t", "--output-format", metavar="FORMAT", default="jsonlines", \ 
      help="format to use for dumping items with -o (default: %default)")