Как удалить всю информацию со страницы, на которой для расширения содержимого используется javascript - PullRequest
1 голос
/ 03 августа 2020

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

То, что я сейчас пытаюсь сделать, выглядит примерно так

    def expand_page(self, response):
    expand = response.css('#maisVagas')
    page = response.request.url
    if len(expand) > 0:
        expand = expand.xpath("@onclick").extract()
        yield SplashRequest(url=page, callback=self.expand_page, endpoint='execute',
                            args={'js_source': expand[0], "wait": 0.5})
    else:
        yield response.follow(page, self.open_page)

Несмотря на то, что это на португальском языке, если это помогает в качестве ссылки, сайт, который я пытаюсь очистить, выглядит следующим образом: https://www.vagas.com.br/vagas-em-rio-de-janeiro. Кнопка «Развернуть» - это синяя кнопка внизу страницы, и она показывает этот результат.

<a data-grupo="todasVagas" data-filtro="pagina" data-total="16" data-url="/vagas-em-rio-de-janeiro?c%5B%5D=Rio+de+Janeiro&amp;pagina=2" class="btMaisVagas btn" id="maisVagas" onclick="ga('send', 'event', 'Pesquisa', 'anuncios');" href="#" style="pointer-events: all; cursor: pointer;">mostrar mais vagas</a>

1 Ответ

1 голос
/ 03 августа 2020

Не обязательно использовать Spla sh, если вы посмотрите на сетевые инструменты chromedevtools. Он делает HTTP-запрос на получение с некоторыми параметрами. Это называется реинжинирингом HTTP-запросов и предпочтительнее использовать splash / selenium. Особенно, если вы собираете много данных.

Clicking the button on the page brings up this XHR

Copying Request

In cases of re-engineering the request copying the BASH request and putting this into curl.trillworks.com. This gives me a nice formated headers, parameters and cookies for that particular request. I usually play about with this HTTP request using the requests python package. In this case, the simplest HTTP request is one where you just have to pass the parameters and not the headers.

Вот параметры, обратите внимание на номер страницы

Если вы посмотрите с правой стороны, у вас есть заголовки и параметры. Используя пакет reuqests, я понял, что вам нужно только передать параметры страницы, чтобы получить необходимую информацию.

params = (
    ('c[]', 'Rio de Janeiro'),
    ('pagina', '2'),
    ('_', '1596444852311'),
)

Вы можете изменить номер страницы, чтобы получить следующие 40 элементов контента. Вы также знаете, что на этой странице 590 элементов.

Это для второй страницы.

В качестве минимального примера этого в Scrapy

Пример кода

class TestSpider(scrapy.Spider):
    name = 'test'
    allowed_domains = ['vagas.com.br']


    data = {
    'c[]': 'Rio de Janeiro',
    'pagina': '2',
    '_':'1596444852311'}


    def start_requests(self):
        url = 'https://www.vagas.com.br/vagas-em-rio-de-janeiro'
        yield scrapy.Request(url=url,callback=self.parse,meta={'data':self.data})
    def parse(self, response):
        card = response.xpath('//li[@class="vaga even "]')
        print(card)

Объяснение

Используя start_requests для построения первого URL-адреса, мы используем мета-аргумент и передаем словарь с именем data и передаем ему значение наших параметров в HTTP-запрос. Это захватывает HTML для следующих 40 элементов страницы, когда вы нажимаете кнопку.

...