Почему Scrapy не возвращает значение из функции? - PullRequest
0 голосов
/ 26 января 2019

КОД:

import scrapy
from scrapy.spiders import CrawlSpider
from scrapy import Request


class TestSpider(CrawlSpider):
  name = "test_spyder"
  allowed_domains = ["stackoverflow.com"]
  start_urls = ['https://stackoverflow.com/tags']

  def parse(self, response):
    title_1 = response.xpath('//h1/text()').extract_first()
    next_url = 'https://stackoverflow.com/users'
    title_2 = Request(url=next_url, callback=self.parse_some)
    yield {'title_1': title_1, 'title_2': title_2}

  def parse_some(self, response):
    return response.xpath('//h1/text()').extract_first()

Я не понимаю, почему вместо заголовка второй страницы (Пользователи) я получаю другое значение (https://stackoverflow.com/users>). Scrapy должен вернуть следующие значения: Tags + Users, но возвращает: Tag + <Request GET htt... в списке, я так думаю. Где ошибка и как ее исправить?

1 Ответ

0 голосов
/ 26 января 2019

Чтобы сканировать URL, вам нужно yield Request объект.Так что ваши обратные вызовы синтаксического анализа должны либо:

  1. Получить словарь / Item - это конец цепочки сканирования.Элемент генерируется, он отправляется через конвейеры и, наконец, сохраняется где-то, если у вас есть такая настройка.
  2. Получите объект Request - он все еще продолжает цепочку сканирования до другого обратного вызова.

Пример этого процесса:

  1. url1 сканирования (2)
  2. url2 для сканирования (2)
  3. единица дохода (1)

Ваш паук в этом случае должен выглядеть следующим образом:

def parse(self, response):
    title = response.xpath('//h1/text()').extract_first()
    yield {'title': title}

    next_url = 'https://stackoverflow.com/users'
    yield Request(url=next_url, callback=self.parse_some)

И ваши конечные результаты ползут с scrapy crawl spider -o output.json:

# output.json
[
{'title': 'title1'},
{'title': 'title2'}
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...