2017-08-02 83 views
1

我正在開發scrapy蜘蛛,它正在成功生成一些項目。這些項目應該使用pymysql插入到數據庫中。因爲數據是關係型的,所以我必須執行一些插入語句。 我想在每次整個插入之後調用connection.commit()以確保發生錯誤不會導致數據庫中的不一致條目。Scrapy項目流水線並行或順序執行process_item

我目前想知道scrapy是否會爲多個項目並行調用process_item,或者爲一個接一個項目順序調用。如果是後者的話,我可以簡單地用下面的辦法:

def process_item(self, item, spider): 
    # execute insert statements 
    connection.commit() 

如果不止一個呼叫process_item在由scrapy同時執行,在月底commit()呼叫可以被稱爲而另一項目未完全插入。

documentation for item pipelines狀態:

後的物品已被蜘蛛刮下,它被髮送到項目管道,其處理它通過依次執行幾個組件。

但我不能肯定這是否意味着process_item絕不會並行執行,或丟棄重複只是不同的管道將總是一個接一個執行(例如 - >更改的東西 - > dB的插入)。


我認爲process_item會按順序執行,如文檔示出了下面的示例:

class DuplicatesPipeline(object): 

def __init__(self): 
    self.ids_seen = set() 

def process_item(self, item, spider): 
    if item['id'] in self.ids_seen: 
     raise DropItem("Duplicate item found: %s" % item) 
    else: 
     self.ids_seen.add(item['id']) 
     return item 

在該代碼中,有添加的id來ids_seen涉及,不過我不沒有同步不知道這個例子是否簡化,因爲它只演示瞭如何使用管道。

回答

1

CONCURRENT_ITEMS設置的文檔指定以並列方式處理項目(至少在單個響應中)。我認爲將其設置爲1可能對您有幫助。

我不是這方面Scrapy的專家,但我相信this is where it happens

+0

謝謝,不知何故,我沒有看到這個選項! – Alex