1

物事を整理しておくために、スパイダーが投入する 3 つのアイテム クラスがあると判断しました。

各アイテム クラスには、入力されるさまざまなフィールドがあります。

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 パイプラインに渡して単一のテーブルに入力することです。しかし、ここに問題があります。

3 つのコンテナー (ページごと) を生成すると、それらは 3 つの別個のコンテナーとしてパイプラインにそのまま渡されます。それらは独自の BaseItem としてパイプラインを通過し、mysql テーブルのセクションのみを入力し、他の列は「NULL」のままにします。

私がやりたいことは、これら 3 つのコンテナーを単一の BaseItem に再パッケージ化して、単一の ITEM としてパイプラインに渡されるようにすることです。

アイテムを再パッケージ化することに関して何か提案はありますか? スパイダーかパイプラインか?

ありがとう

4

1 に答える 1

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追加した場所:

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 に答える