2012-07-23 86 views
1

爲了保持組織有序,我確定有三個項目類,蜘蛛會填充。重新包裝Scrapy蜘蛛項目

每個項目類都有各種填充的字段。

class item_01(Item): 
    item1 = Field() 
    item2 = Field() 
    item3 = Field() 

class item_02(Item): 
    item4 = Field() 
    item5 = Field() 

class item_03(Item): 
    item6 = Field() 
    item7 = Field() 
    item8 = Field() 

有多個頁面可以抓取相同的項目。 在蜘蛛中,我使用XPathItemLoader來填充'容器'。

目標是將項目傳遞給mysql管道以填充單個表。但這是問題。

當我產生三個容器(每頁)時,它們作爲三個獨立的容器傳遞到管道中。 他們通過管道作爲他們自己的BaseItem並僅填充他們的mysql表的部分,而將其他列'NULL'。

我想要做的是將這三個容器重新打包到一個BaseItem中,以便它們作爲單個ITEM傳遞到管道中。

有沒有人有任何建議重新包裝的項目?無論是在蜘蛛或管道?

感謝

回答

1

我做了這個技巧來讓物體移動,但如果有人能改善或更好的解決方案提示,請分享。

加載我的項目在蜘蛛這樣的:

items = [item1.load_item(), item2.load_item(), item3.load_item()] 

然後我定義的蜘蛛之外的功能:

def rePackIt(items): 
    rePackage = rePackageItems() 
    rePack = {} 
    for item in items: 
     rePack.update(dict(item)) 

    for key, value in rePack.items(): 
     rePackage.fields[key] = value 
    return rePackage 

凡在items.py我說:

​​

蜘蛛完成抓取頁面並加載項目後,我會得到:

yield rePackIt(items) 

它把我帶到pipelines.py

process_item解壓我做了以下項目:

def process_item(self, item, spider): 
     items = item.fields 

項目現在是包含然後我用插入到單個數據庫表的蜘蛛所提取的所有領域的字典