【问题标题】:Extracting a list of links from a webpage by using its class使用其类从网页中提取链接列表
【发布时间】:2021-06-12 06:52:46
【问题描述】:

我正在尝试从this website 中提取四个链接的列表,这些链接明确命名为:

PNADC_012018_20190729.zip

PNADC_022018_20190729.zip

PNADC_032018_20190729.zip

PNADC_042018_20190729.zip

我已经看到它们都是名为“jstree-wholerow”的类的一部分。我不太擅长抓取,但我尝试使用这种规律性来捕获此类链接:

x <- rvest::read_html('https://www.ibge.gov.br/estatisticas/downloads-estatisticas.html?caminho=Trabalho_e_Rendimento/Pesquisa_Nacional_por_Amostra_de_Domicilios_continua/Trimestral/Microdados/2018') %>%
  rvest::html_nodes("jstree-wholerow") %>%
  rvest::html_text()

但是,我收到了一个空向量作为输出。

有人可以帮忙解决这个问题吗?

【问题讨论】:

  • 它们不是链接。它们链接到处理下载数据生成和 ftp 下载的 javascript
  • 但是我怎么能提取这些呢?
  • 我不确定。可以对其中一个源文件 (servicodados.ibge.gov.br/api/v1/downloads....) 中的一个 API 调用进行逆向工程。或者,使用浏览器自动化(例如 RSelenium)之类的方法,您只需点击相应的元素即可。
  • 这是一个有趣的问题。
  • 我想这些不是一个真正的选择,因为这是一个包?但是这些不是链接实际上是一个问题吗?在这个阶段,我只想要这些字符串,而不是下载任何东西

标签: r web-scraping rvest


【解决方案1】:

虽然网页使用 javascript,但文件存储在 ftp 中。它还具有非常可预测的目录名称。

library(tidyverse)
library(stringr)
library(rvest)
#> 
#> Attaching package: 'rvest'
#> The following object is masked from 'package:readr':
#> 
#>     guess_encoding
library(RCurl)
#> 
#> Attaching package: 'RCurl'
#> The following object is masked from 'package:tidyr':
#> 
#>     complete

link <- 'https://ftp.ibge.gov.br/Trabalho_e_Rendimento/Pesquisa_Nacional_por_Amostra_de_Domicilios_continua/Trimestral/Microdados/2018/PNADC_042018_20190729.zip'

zip_names <- c('PNADC_012018_20190729.zip', 'PNADC_022018_20190729.zip', 'PNADC_032018_20190729.zip', 'PNADC_042018_20190729.zip')

links <- str_replace(link, '/2018.*\\.zip$', str_c('/2018/', zip_names))

links
#> [1] "https://ftp.ibge.gov.br/Trabalho_e_Rendimento/Pesquisa_Nacional_por_Amostra_de_Domicilios_continua/Trimestral/Microdados/2018/PNADC_012018_20190729.zip"
#> [2] "https://ftp.ibge.gov.br/Trabalho_e_Rendimento/Pesquisa_Nacional_por_Amostra_de_Domicilios_continua/Trimestral/Microdados/2018/PNADC_022018_20190729.zip"
#> [3] "https://ftp.ibge.gov.br/Trabalho_e_Rendimento/Pesquisa_Nacional_por_Amostra_de_Domicilios_continua/Trimestral/Microdados/2018/PNADC_032018_20190729.zip"
#> [4] "https://ftp.ibge.gov.br/Trabalho_e_Rendimento/Pesquisa_Nacional_por_Amostra_de_Domicilios_continua/Trimestral/Microdados/2018/PNADC_042018_20190729.zip"


#option 2

links <-  RCurl::getURL(url = 'https://ftp.ibge.gov.br/Trabalho_e_Rendimento/Pesquisa_Nacional_por_Amostra_de_Domicilios_continua/Trimestral/Microdados/2018/') %>% read_html() %>% 
    html_nodes(xpath = '//td/a[@href]') %>% html_attr('href')

links <- links[-1]

links
#> [1] "PNADC_012018_20190729.zip" "PNADC_022018_20190729.zip"
#> [3] "PNADC_032018_20190729.zip" "PNADC_042018_20190729.zip"

str_c('https://ftp.ibge.gov.br/Trabalho_e_Rendimento/Pesquisa_Nacional_por_Amostra_de_Domicilios_continua/Trimestral/Microdados/2018/', links)
#> [1] "https://ftp.ibge.gov.br/Trabalho_e_Rendimento/Pesquisa_Nacional_por_Amostra_de_Domicilios_continua/Trimestral/Microdados/2018/PNADC_012018_20190729.zip"
#> [2] "https://ftp.ibge.gov.br/Trabalho_e_Rendimento/Pesquisa_Nacional_por_Amostra_de_Domicilios_continua/Trimestral/Microdados/2018/PNADC_022018_20190729.zip"
#> [3] "https://ftp.ibge.gov.br/Trabalho_e_Rendimento/Pesquisa_Nacional_por_Amostra_de_Domicilios_continua/Trimestral/Microdados/2018/PNADC_032018_20190729.zip"
#> [4] "https://ftp.ibge.gov.br/Trabalho_e_Rendimento/Pesquisa_Nacional_por_Amostra_de_Domicilios_continua/Trimestral/Microdados/2018/PNADC_042018_20190729.zip"

reprex package (v2.0.0) 于 2021-06-11 创建

【讨论】:

  • 这对我来说是不够的。主机经常更改每个文件的名称,因此这种方法不起作用。我正在寻找更强大的东西,完全依赖于页面的结构
  • 这四个名字似乎是永久的。宿主改变了它们的哪一部分?
  • “zip_names”下的那些
  • @ArthurCarvalhoBrito 我添加了另一种首先获取名称的方法。
猜你喜欢
  • 1970-01-01
  • 2011-04-14
  • 2019-04-12
  • 2023-03-18
  • 2011-07-04
  • 2012-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多