2015-05-06 31 views
2

我正在使用Scrapy和Scrapyd監視某些網站。輸出文件是壓縮的jsonlines。在我將作業計劃提交給scrapyd後,我可以看到輸出文件正在創建,並且隨着它的進行而不斷增長。Scrapy蜘蛛完成後重命名輸出文件

我的問題是我無法確定何時輸出文件準備就緒,即蜘蛛完成。一種方法是將輸出文件重命名爲「output.done」,這樣我的其他程序就可以列出這些文件並對其進行處理。

我目前的方法是檢查文件的修改時間,如果它沒有改變五分鐘,那麼我認爲它完成了。然而,五分鐘有時似乎不夠,我真的希望我不需要延長到30分鐘。

回答

0

我嘗試了不同的方法後得到了一個工作解決方案。 因爲在我的特殊情況下,我將輸出轉儲爲文件,特別是bz2文件。我在打開文件之前和之後定製了一個FileFeedStorage來完成這項工作。請參閱以下代碼:

from scrapy.contrib.feedexport import FileFeedStorage 
import os 
import bz2 

MB = 1024 * 1024 


class Bz2FileFeedStorage(FileFeedStorage): 
    IN_PROGRESS_MARKER = ".inprogress" 

    def __init__(self, uri): 
    super(Bz2FileFeedStorage, self).__init__(uri) 
    self.in_progress_file = self.path + Bz2FileFeedStorage.IN_PROGRESS_MARKER 

    def open(self, spider): 
    dirname = os.path.dirname(self.path) 
    if dirname and not os.path.exists(dirname): 
     os.makedirs(dirname) 
    return bz2.BZ2File(self.in_progress_file, "w", 10 * MB) 

    def store(self, file): 
    super(Bz2FileFeedStorage, self).store(file) 
    os.rename(self.in_progress_file, self.path) 
1

您可能想要使用scrapy信號,特別是spider_openedspider_closed來了解蜘蛛何時使用該文件。更多信息可以在這裏找到:http://doc.scrapy.org/en/latest/topics/signals.html

spider_opened可以在文件重命名output.progressspider_closed可以將其重命名爲output.done指示文件不再由蜘蛛使用。

如果輸出文件是通過Item流水線寫入的,則可以使用與open_spiderclose_spider回調相同的回調,這與使用信號的邏輯相同。有關物品管道回調的更多信息:http://doc.scrapy.org/en/latest/topics/item-pipeline.html#writing-your-own-item-pipeline

+0

謝謝。使用信號是一個好主意,但是想知道它如何與現有管道配合使用?具體而言,我不確定是否可以在蜘蛛的開頭和結尾重命名文件。它不會破壞導出器輸出文件處理程序嗎? – Andy

+0

如果您使用項目管道來編寫輸出文件,則可能需要使用spider_open/spider_close回調:http://doc.scrapy.org/en/latest/topics/item-pipeline.html#writing-yourown -Item流水線 – sardok