2012-07-23 113 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 

项目现在是包含然后我用插入到单个数据库表的蜘蛛所提取的所有领域的字典