Scrapy: Передача элемента между методами

Предположим, что у меня есть Bookitem, мне нужно добавить к нему информацию как на фазе анализа, так и на фазе

def parse(self, response)
    data = json.loads(response)
    for book in data['result']:
        item = BookItem();
        item['id'] = book['id']
        url = book['url']
        yield Request(url, callback=self.detail)

def detail(self,response):        
    hxs = HtmlXPathSelector(response)
    item['price'] = ......
#I want to continue the same book item as from the for loop above

Использование кода as is приведет к элементу undefined на этапе детализации. Как передать элемент деталям? детали (self, response, item), похоже, не работают.

Ответ 1

Существует аргумент с именем meta для запроса:

yield Request(url, callback=self.detail, meta={'item': item})

тогда в функции detail обращайтесь к нему следующим образом:

item = response.meta['item']

Подробнее о здесь о теме вакансий.

Ответ 2

Вы можете определить переменную в init:

class MySpider(BaseSpider):
    ...

    def __init__(self):
        self.item = None

    def parse(self, response)
        data = json.loads(response)
        for book in data['result']:
            self.item = BookItem();
            self.item['id'] = book['id']
            url = book['url']
            yield Request(url, callback=self.detail)

    def detail(self, response):        
        hxs = HtmlXPathSelector(response)
        self.item['price'] = ....