2012-11-20 69 views
1

我將使用scrapy來抓取域。我打算用sqlalchemy將所有這些信息存儲到我的db中。這是非常簡單的Xpath選擇器每頁,我打算使用HttpCacheMiddleware。Scrapy爲什麼要打擾項目,你可以直接插入?

從理論上講,只要我有蜘蛛的數據,就可以直接向我的數據庫插入數據(這需要hxs至少被實例化)。這將允許我繞過實例化任何Item子類,所以不會有任何項目通過我的管道。

我看到這樣做的優點:

  1. 較少CPU密集型的,因爲不會有任何CPU處理管道
  2. 防止內存泄漏。

磁盤I/O比網絡I/O快很多,所以我不認爲這會對蜘蛛造成很大影響。

是否有我想使用Scrapy的Item類的原因?

回答

6

如果您直接插入蜘蛛內,那麼您的蜘蛛將阻塞,直到數據插入。如果您創建一個項目並將其傳遞給管道,則在插入數據時,蜘蛛可以繼續爬網。另外,如果多個蜘蛛嘗試同時插入數據,可能會出現競爭狀況。

+0

比賽情況將通過的SQLAlchemy的線程池來照顧。磁盤IO比網絡IO慢得多,因此不應該存在重大風險 – disappearedng

+0

根據您的使用情況,存儲數據花費的時間可能很長。例如,您必須在存儲之前處理數據,或者存儲位於不同的計算機上。 – Dikei

1

這是一個老問題,但我覺得upvoted的答案並不是真的正確。

有沒有我之所以想要使用Scrapy的Item類的原因?

幅刮削的Scrapy模型本質:

  1. 與蜘蛛收集數據。
  2. 將數據捆綁到項目中。
  3. 使用料品管線處理這些料品。
  4. 用另一個物品管道在某處存儲這些物品。

步驟3和4包含「大」物品管線。如果您沒有繼承Item,則無法將對象輸入到物品管道中,因此您必須對這些字段進行規範化並將項目插入到您的數據庫中,所有這些都在您的蜘蛛中。

如果Item,你可以讓你的項目處理的代碼更容易維護:

from scrapy.item import Item, Field 
from scrapy.contrib.loader import XPathItemLoader 
from scrapy.contrib.loader.processor import MapCompose, Identity 

class Product(Item): 
    name = Field() 
    price = Field() 

    aisle = Field() 
    categories = Field() 

class ProductLoader(XPathItemLoader): 
    default_item_class = Product 

    price_in = MapCompose(parse_price) 
    categories_out = Identity() 
相關問題