首页 > 解决方案 > 如何从使用 javascript 扩展内容的页面中 __scrape__ 中的所有信息

问题描述

我正在尝试抓取一个包含元素列表的页面,并在底部有一个增加列表的展开按钮。它使用 onclick 事件展开,我不知道如何激活它。我正在尝试使用scrapy-splash,因为我读过它可能会起作用,但我无法使其正常运行。

我目前正在尝试做的是这样的

    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>

标签: javascriptscrapyscrapy-splash

解决方案


如果您查看 chromedevtools 的网络工具,则不需要使用 Splash。它正在使用一些参数发出一个 get HTTP 请求。这称为重新设计 HTTP 请求,比使用 splash/selenium 更可取。特别是如果您要抓取大量数据。

单击页面上的按钮会显示此 XHR

复制请求

在重新设计请求的情况下,复制 BASH 请求并将其放入 curl.trillworks.com。这为我提供了该特定请求的格式良好的标头、参数和 cookie。我通常使用 requests python 包来处理这个 HTTP 请求。在这种情况下,最简单的 HTTP 请求是您只需要传递参数而不是标头的请求。

这是参数,注意页码

如果您在右侧查看标题和参数。使用 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)

解释

在构建第一个 URL 时,我们使用start_requestsmeta 参数并传递一个名为 data 的字典,并将我们的参数值提供给 HTTP 请求。当您单击按钮时,这将获取页面接下来 40 项的 HTML。


推荐阅读