Вызвать другого паука после разбора страницы на другом пауке - PullRequest
0 голосов
/ 07 ноября 2019

Это было решено до некоторой степени здесь и здесь

Но я хотел бы спросить здесь, прежде чем делать что-либо из того, что предлагается там, потому что я неМне действительно нравится любой из подходов.

Так что, в принципе, я пытаюсь отказаться от игр Steam. Как вы, возможно, знаете, в Steam есть ссылка, где вы можете получить доступ ко всем обзорам игры, например:

https://steamcommunity.com/app/730/reviews/?browsefilter=toprated&snr=1_5_100010_

Здесь вы можете игнорировать параметры запросов snr и browsefilter.

Во всяком случае, я создал одного паука, который будет сканировать список игр здесь и работает довольно хорошо:

https://store.steampowered.com/search/?sort_by=Released_DESC

Но теперь для каждой игры, которую я хочучтобы получить все отзывы.

Первоначально я создал нового Паука, который имеет дело со свитком инфинте на странице, которая содержит полный набор обзоров для игры, но, очевидно, что пауку нужен URL, где живут эти обзоры.

Итак, что я сейчас делаю, так это собираю все страницы игр и сохраняю URL с обзорами для каждой игры в текстовом файле, который затем передается в качестве параметра второму пауку. Но мне это не нравится, потому что это вынуждает меня сделать двухэтапный процесс, и, кроме того, мне нужно каким-то образом сопоставить результаты второго паука с результатами первого (эти обзоры принадлежат этой игре и т. Д.)

Итак, мои вопросы:

  • Было бы лучше отправить результаты удаления страницы игры (и, следовательно, URL со всеми отзывами) второму пауку, илихотя бы URL, а затем получить все отзывы для каждой игры, используя второго паука? Это будет O (N * M) с точки зрения производительности, т.е. N игр и M обзоров за игру, может быть, просто из-за этого иметь 2 паука стоит ... мыслей?

    • Могу ли я на самом деле вызвать Паука из другого Паука? Из того, что я прочитал в документации по Scrapy, это не похоже на это. Я, вероятно, могу перенести все на одного паука, но будет выглядеть ужасно и не будет придерживаться принципа единственной ответственности ...

1 Ответ

1 голос
/ 07 ноября 2019

Почему бы вам не использовать другую процедуру разбора?

https://docs.scrapy.org/en/latest/intro/tutorial.html#more-examples-and-patterns

def parse(self, response):
    # follow links to author pages
    for href in response.css('.author + a::attr(href)'):
        yield response.follow(href, self.parse_author)

    # follow pagination links
    for href in response.css('li.next a::attr(href)'):
        yield response.follow(href, self.parse)

def parse_author(self, response):
    def extract_with_css(query):
        return response.css(query).get(default='').strip()

    yield {
        'name': extract_with_css('h3.author-title::text'),
        'birthdate': extract_with_css('.author-born-date::text'),
        'bio': extract_with_css('.author-description::text'),
    }

    # follow pagination links
    for href in response.css('li.next a::attr(href)'):
       yield response.follow(href, self.parse_author)

И добавьте необходимые значения с метатегом:

https://docs.scrapy.org/en/latest/topics/request-response.html#scrapy.http.Request.meta

пример в Этоможно передать переменную из start_requests () в parse () для каждого отдельного запроса?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...