Scrapy |Перейдите по ссылкам, которые загружаются динамической кнопкой «Загрузить еще» - PullRequest
0 голосов
/ 28 февраля 2019

Я знаю, что этот вопрос задавался несколько раз с подобными подходами, но я не могу обернуть его вокруг.Вот почему я хочу открыть конкретный случай / вопрос.

Ситуация

Я сканирую веб-сайт, на котором отображаются статьи, скажем, 20 (но на сайте 200).Я перехожу по ссылкам к статьям и там буду извлекать нужные мне данные.Пока все хорошо.

Некоторые страницы имеют кнопку Загрузить еще вместо "обычной" нумерации страниц, чтобы показать более 20 статей.И вот тут начинается борьба.Я проверил страницу (как описано в этом видео с этим примером , например).Однако структура URL запроса при нажатии кнопки отличается от описанной в видео.Поскольку структура будет оставаться прежней вместо загрузки страниц, таких как http://quotes.toscrape.com/api/quotes?page=8, " page = 9 " и т. Д.

При нажатии кнопки я обнаружил веб-сайты со следующими URL-адресами запроса:

В обоих примерах при нажатии кнопки ссылка не изменится.Так что я немного растерялся и не могу применить решение взятых мною учебников.

Я думаю, что решение могло бы быть использованием Splash , как описано здесь .Он гласит:

Часто бывает так, что вам нужно нажать кнопку перед отображением страницы.Мы можем сделать это с помощью функции splash: mouse_click:

function main(splash)
    assert(splash:go(splash.args.url))
    local get_dimensions = splash:jsfunc([[
        function () {
            var rect = document.getElementById('button').getClientRects()[0];
            return {"x": rect.left, "y": rect.top}
        }
    ]])
    splash:set_viewport_full()
    splash:wait(0.1)
    local dimensions = get_dimensions()
    splash:mouse_click(dimensions.x, dimensions.y)
    -- Wait split second to allow event to propagate.
    splash:wait(0.1)
    return splash:html() 
end

Я установил splash и установил все настройки.Тем не менее, я действительно борюсь с тем, как интегрировать это в мой код Scrapy.И будет ли это на самом деле работать или эта функция просто нажимает кнопку один раз?Кроме того, элемент Button на сайтах, которые я обрабатываю, не имеет идентификатора, только имя класса (но я думаю, что это не проблема, с которой я борюсь).

Буду очень признателен за любую информацию о том, как интегрировать эту функцию-всплеск в мой код scrapy или другое решение для перехода по ссылкам, загруженным кнопкой динамической загрузки.

Вот фрагмент моего кода (без Splash, только следующие ссылки и скребки):

import scrapy

class ExampleSpider(scrapy.Spider):
    name = "example"
    allowed_domains = ["example.com"]
    start_urls = [
        "https://example.com",
    ]


    def parse(self, response):
        # follow links to article
        for href in response.xpath('//div[@class="article"]/a/@href'):
            yield response.follow(href, self.parse_article)

    def parse_article(self, response):
        def get_with_xpath(query):
             return response.xpath(query).get(default='').strip()


        yield {
            'title': get_with_xpath('//meta[@name="title"]/@content'),
            'description': get_with_xpath('//meta[@name="description"]/@content')

            }
...