2014-01-30 64 views
2

我在問關於scrapy的框架。scrapy - 如何將分層項目插入數據庫?

我正在刮商務頁面。首先我添加品牌項目(我有品牌表)與商業名稱,然後我想添加幾個商業地點(BusinessLocations表),但我需要數據庫BrandId插入業務位置數據庫。然後,我爲每個業務地點添加幾個關於部門的記錄,並且再次需要數據庫BusinessLocationId插入每個部門。

我們假設我在管道中將項插入數據庫。

我可以簡單地假設早些時候處理的項目已經離開管道並且在數據庫中嗎?在這種情況下,我可以使用通過元數據傳遞的一些文本唯一字段從數據庫中簡單選擇所需的Id。

但是我想可能有競爭條件,因爲scrapy同時處理多個請求。根據競爭條件,我的意思是在將適當品牌插入數據庫之前添加BusinessLocation項目。 是否有這種競爭條件的風險?

回答

1

我可以簡單地假設早些時候處理的項目已經離開管道,並且在數據庫中嗎?

一般來說,沒有。

它高度重視您在管道中的工作。例如,如果您使用圖像管道,那麼帶圖像的項目將被圖像管道保留,直到檢索到所有圖像爲止,同時沒有圖像或很少圖像的項目將傳遞到前一個項目之前的下一個管道。

您可以收集主項目對象中傳遞給子請求的子項目,但是您必須關心是否處理錯誤以避免丟失不完整的項目。另一種方法可以將這些項目存儲在暫存數據庫中,然後整合查找孤立記錄。

1

我發現解決方案如何等待,直到所有數據都被刮掉 - 關閉spider後調用管道的close_spider方法。

class BlsPipeline100(object): 
    def __init__(self): 
     self.items = [] 

    def process_item(self, item, spider): 
     self.items.append(item) 
     return item 

    def close_spider(self, spider): 
     processAllItems() 

現在我可以創建可以訪問所有項目的層次結構。