Задать вопрос

Scrapy — множественные страницы в единственный item

Здравствуйте,
нужно добавить в item, основная информация для которого получается из главного response, дополнительные поля, которые находятся во внешних ссылках, например .js, другие url.

Вот чего я достиг после 5 часов чтения документации и stackoverflow, здесь парсится главная страница google, и в item добавляется словарь page_size, в котором содержатся url страниц, которые есть в google.com и их размер в байтах.

{'page_size': [{'http://support.google.com/accounts/?hl=ru': 50526}]}

{'page_size': [{'http://support.google.com/accounts/?hl=ru': 50526},
               {'http://www.google.com/intl/ru/policies/privacy/': 37644}]}


и т.д.

То есть в результате возвращаются все шаги по обновлению item до финального состояния, мне нужна только последняя итерация, а еще лучше было бы получать всю информацию в конце метода parse_item.
Есть ли какой-нибудь нормальный способ это сделать?

Заранее благодарен, ниже код про который идет речь.

class TestSpider(CrawlSpider):
    name = 'test'
    allowed_domains = ['google.com', 'google.ru']
    start_urls = ['https://www.google.com/',]
    rules = (
                Rule(SgmlLinkExtractor(allow=(r'https://www.google')),
                                       callback='parse_item',
                                       follow=False),
            )

def get_page_size(self, response):
    item = response.meta['item']
    if 'page_size' not in item:
        item['page_size'] = list()

    item['page_size'].append({
                              response.url:
                              len(response.body)
                            })
    yield item

def parse_item(self, response):
    item = TestProduct()
    doc = leaf.parse(response.body)

    for url in doc('a'):
        if 'href' not in url.attrib:
            continue

        url = url.attrib['href']
        if url.find('http:') != 0:
            continue

        request = Request(url, callback=self.get_page_size)
        request.meta['item'] = item
        yield request
  • Вопрос задан
  • 3418 просмотров
Подписаться 3 Оценить 1 комментарий
Пригласить эксперта
Ответы на вопрос 1
@kmike
Можно сделать так: добавлять запросы на получение размера по одному — get_page_size вызывает следующий get_page_size и т.д., пока что-то еще есть в очереди. Последний в цепочке возвращает элемент. «Очередь» можно передавать через meta.

Я не спец — возможно, есть варианты и лучше.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы