Как мне очистить веб-сайт, на котором есть кнопка «Далее», а также прокрутка? - PullRequest
0 голосов
/ 15 апреля 2019

Я пытаюсь очистить все данные с сайта quotestoscrape. Но, когда я пытаюсь запустить свой код, он получает только одну случайную цитату. Он должен принимать как минимум все данные с этой страницы, но только один. Кроме того, если я каким-то образом получаю данные со страницы 1, теперь мне нужно получить данные со всех страниц.

  1. Так, как мне решить эту ошибку (которая должна взять все данные со страницы 1)?
  2. Как мне взять все данные, которые присутствуют на следующих страницах?

items.py file

    import scrapy
    class QuotetutorialItem(scrapy.Item):

        title = scrapy.Field()
        author = scrapy.Field()
        tag = scrapy.Field()

quotes_spider.py file

import scrapy
from ..items import QuotetutorialItem

class QuoteScrapy(scrapy.Spider):
    name = 'quotes'
    start_urls = [
        'http://quotes.toscrape.com/'
    ]

    def parse(self, response):

        items = QuotetutorialItem()

        all_div_quotes = response.css('div.quote')

        for quotes in all_div_quotes:
            title = quotes.css('span.text::text').extract()
            author = quotes.css('.author::text').extract()
            tag = quotes.css('.tag::text').extract()

            items['title'] = title
            items['author'] = author
            items['tag'] = tag

        yield items

Скажите, пожалуйста, какие изменения я могу сделать?

Ответы [ 2 ]

1 голос
/ 15 апреля 2019

Как сообщалось, вам не хватает идентичного уровня в вашей доходности.А чтобы следить за следующими страницами, просто добавьте проверку для следующей кнопки и выдайте запрос после нее.

import scrapy


class QuoteScrapy(scrapy.Spider):
    name = 'quotes'
    start_urls = [
        'http://quotes.toscrape.com/'
    ]

    def parse(self, response):

        items = {}

        all_div_quotes = response.css('div.quote')

        for quotes in all_div_quotes:
            title = quotes.css('span.text::text').extract()
            author = quotes.css('.author::text').extract()
            tag = quotes.css('.tag::text').extract()

            items['title'] = title
            items['author'] = author
            items['tag'] = tag

            yield items

        next_page = response.css('li.next a::attr(href)').extract_first()
        if next_page:
            yield response.follow(next_page)
0 голосов
/ 15 апреля 2019

Поскольку @LanteDellaRovere правильно определено в комментарии, оператор yield должен выполняться для каждой итерации цикла for - поэтому вы видите только одну (предположительно последнюю) ссылку с каждой страницы.

Что касается чтения продолженных страниц, вы можете извлечь его из элемента <nav> в нижней части страницы, но структура очень проста - ссылки (если тег не указан) имеют форму

http://quotes.toscrape.com/page/N/

Вы найдете, что для N = 1 вы получите первую страницу. Так что просто обращайтесь к URL-адресам для увеличения значений N, пока попытка не увидит возврат 404, который будет работать как упрощенное решение.

Немного зная о Scrapy, я не могу дать вам точный код, но примеры на https://docs.scrapy.org/en/latest/intro/tutorial.html#following-links весьма полезны, если вы хотите более изощренный и Pythonic подход.

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