2012-07-23 3 views
1

Чтобы все было организовано, я определил, что есть три класса предметов, которые будет заполнять паук.Repackage Scrapy Spider Items

Каждый класс предметов имеет множество полей, которые заполнены.

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 я добавил:

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

После того, как паук выполнил сканирование страницы и загрузки элементов, я получаю:

yield rePackIt(items) 

, который ведет меня к pipelines.py.

В process_item распаковать пункт я сделал следующие:

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

элементов теперь словарь, который содержит все выделенные поля из паука, который я затем используется для вставки в одну таблицу базы данных

Смежные вопросы