2014-09-06 4 views
1

Что бы я хотел сделать, это заполнить поля предметов, определенные в item.py, в разных функциях в файле spider.py, скажем в функции start_requests, где все запросы Я хотел бы заполнить поле «item_id».Заполнение предметов в scrapy в разных функциях по пауку

def start_requests(self): 
    forms = [] 
    for item in self.yhd_items: 
     self.item["item_id"] = item.ItemCode 
     forms.append(FormRequest(self.base_url + item.ItemCode, method='GET', 
           callback = self.parse_search_result)) 

    return forms 

Обратите внимание, что я сделал экземпляр элементов в функции init. Таким образом, заполняется только элемент item_id и передается следующему методу парсера (parse_search_result). Другие поля в item.py будут заполнены следующей функцией и снова переданы другому методу парсера. Будет ли это законным?

ответ

3

Это именно то, что meta argument для, например:

def parse_page1(self, response): 
    item = MyItem() 
    item['main_url'] = response.url 
    request = scrapy.Request("http://www.example.com/some_page.html", 
          callback=self.parse_page2) 
    request.meta['item'] = item 
    return request 

def parse_page2(self, response): 
    item = response.meta['item'] 
    item['other_url'] = response.url 
    return item 

Здесь мы определяем экземпляр элемента в parse_page1, заполняя main_url поле, а затем передавая элемент в parse_page2 в meta словаре. В поле parse_page2, other_url установлено поле, и элемент возвращается.

Надеюсь, это то, о чем вы просили.

+0

Спасибо, что я искал –

+1

@mehdix_ Вы должны принять ответ, если он отвечает на ваш вопрос. На стороне примечания, вы должны быть осторожны при передаче объектов, так как вы делаете запросы потребляющими больше памяти, и они уже являются наиболее потребляющим память компонентом скрипирования. – todinov

+0

Если у меня есть две страницы - стр. 2 и стр. 3 - у которых есть части заполняемой информации, как я могу их последовательно вызвать в двух разных вариантах scrapy.Requests? Я могу передать наполовину заполненный элемент в «мета» для обоих, но я хочу, чтобы конечный «элемент» имел данные со страницы 1 + стр. 2 + стр. 3 - все вместе – dowjones123

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