1

为了使事情井井有条,我确定蜘蛛将填充三个项目类别。

每个项目类都有各种填充的字段。

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 传递到管道中。

有人对重新包装这些物品有什么建议吗?无论是在蜘蛛还是管道中?

谢谢

4

1 回答 1

1

我做了这个 hack 来让事情动起来,但如果有人可以改进或暗示更好的解决方案,请分享。

像这样在蜘蛛中加载我的项目:

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添加:

class rePackageItems(Item):
    """Repackage the items"""
    pass  

蜘蛛完成爬取页面并加载我产生的项目后:

yield rePackIt(items)  

这将我带到pipelines.py.

process_item解压物品时,我做了以下操作:

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

items 现在是一个字典,其中包含从蜘蛛中提取的所有字段,然后我将其插入到单个数据库表中

于 2012-07-23T16:56:52.130 回答