硒;循环和下载csv文件

时间:2019-10-17 19:21:33

标签: r loops web-scraping rvest rselenium

我正在尝试使用RSelenium(与docker一起)从以下网站提取数据:https://nominatransparente.rhnet.gob.mx

#-- Load package
library(RSelenium)
library(rvest)
library(xml2)
library(tidyverse)

#-- Remote driver
remDr <- remoteDriver(remoteServerAddr = "192.168.99.100", port = 4445L, browserName = "chrome")
remDr$open()

#-- navigate to the website 
remDr$navigate("https://nominatransparente.rhnet.gob.mx/")

#-- confirm the website
remDr$getTitle()

#-- screenshot 
remDr$screenshot(display = TRUE)

#-- Loading website's extra information
Sys.sleep(15)

#-- selecting filters: manipulate 
webElement <- remDr$findElement("class name", "switch")
webElement$clickElement()

webElement <- remDr$findElement("class name", "ng-input")
webElement$clickElement()

直到这里,我都可以选择并单击下拉菜单,但是无法从下拉菜单中选择每个项目(我无法找到正确的xpath或ID)。我想浏览所有这些项目,也要从第二个下拉菜单中进行选择,然后下载它们各自的CSV文件。

我想使用RSelenium执行所有操作。我看到了类似的问题here,但使用了 rvest 。有没有一种有效的方法来提取所有CSV文件?

1 个答案:

答案 0 :(得分:1)

我的西班牙语有点生锈,但是如果我没记错的话,您尝试先切换// fetch.js file function myFetch(){ return new Promise((resolve)=>{ setTimeout(()=>{ console.log("my Fetch Done"); resolve("myFetch"); }, 500); }) } // download.js file function myDownload(){ return new Promise((resolve)=>{ setTimeout(()=>{ console.log("My download done"); resolve("myDownload"); }, 100); }) } // main.js file async function myMain(){ // "synchronous" const res1 = await myFetch(); const res2 = await myDownload(); console.log('final log', res1, res2); } myMain();,然后进行los filtros de búsqueda por Sector e Institución x sector组合。

如果单击其中一种组合,例如institución x Aportaciones de Seguridad Social,则可以观察到以下网络请求:

Fondo de la Vivienda del ISSSTE

此响应是一个包含相关数据的method GET url "https://dgti-ejz-mspadronserpub.200.34.175.120.nip.io/ms/InfoPadron/servidoresPublicosSector/19/HC6/1/100?query=nombres,primerApellido,segundoApellido,dependencia,tipoEntidad,nombrePuesto,sueldoBase,compensacionGarantizada" Headers: Host: dgti-ejz-mspadronserpub.200.34.175.120.nip.io User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:71.0) Gecko/20100101 Firefox/71.0 Accept: application/json Accept-Language: de,en-US;q=0.7,en;q=0.3 Accept-Encoding: gzip, deflate, br Referer: https://nominatransparente.rhnet.gob.mx/ Origin: https://nominatransparente.rhnet.gob.mx Connection: keep-alive TE: Trailers ,我们可以使用JSONR中发出相同的请求:

httr

如您所见,此版本比使用Selenium + Docker重型火炮要简单得多。

此外,您可以迭代# Make the request headers <- c( "Host" = "dgti-ejz-mspadronserpub.200.34.175.120.nip.io", "User-Agent" = "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv=71.0) Gecko/20100101 Firefox/71.0", "Accept" = "application/json", "Referer" = "https://nominatransparente.rhnet.gob.mx", "Origin" = "https://nominatransparente.rhnet.gob.mx", "Connection" = "keep-alive", "TE" = "Trailers" ) url <- "https://dgti-ejz-mspadronserpub.200.34.175.120.nip.io/ms/InfoPadron/servidoresPublicosSector/19/HC6/1/100?query=nombres,primerApellido,segundoApellido,dependencia,tipoEntidad,nombrePuesto,sueldoBase,compensacionGarantizada" response <- httr::GET(url, httr::add_headers(headers)) # Extract the data data <- httr::content(response) # Example, the first entry data$listDtoServidorPublico[[1]] # $nombres # [1] "JOSE OSCAR" # # $primerApellido # [1] "ABURTO" # # $segundoApellido # [1] "LOPEZ" # # $dependencia # [1] "FONDO DE LA VIVIENDA DEL ISSSTE" # # $tipoEntidad # [1] "ORGANISMO DESCENTRALIZADO" # # $nombrePuesto # [1] "JEFE DE AREA PROF B EN PROC HIPOTEC FOVISSSTE" # # $sueldoBase # [1] 9432 # # $compensacionGarantizada # [1] 2096 x sector组合。关键可能是更改URL参数以接收不同的组合(即URL的institución部分。我本人并未对此进行调查,但是通过在请求其他组合时检查DOM和网络,您应该能够确定

编辑1:检查网络

在浏览器中,切换开发人员工具,然后在内部点击 Network 标签。当您执行 Buscar 时,将出现一个新请求,即一个与上述请求类似的请求(取决于所选组合)。

我已经完成了另一种组合,并观察到请求的网址是

?query=...

因此,我对于必须调整网址的哪一部分是错误的:如果您将这两个链接进行比较,则它们之间的区别是

https://dgti-ejz-mspadronserpub.200.34.175.120.nip.io/ms/InfoPadron/servidoresPublicosSector/25/C00/1/100?query=nombres,primerApellido,segundoApellido,dependencia,tipoEntidad,nombrePuesto,sueldoBase,compensacionGarantizada

因此,每个 url_1 = x + 19/HC6 + y url_2 = x + 25/C00 + y # where x = https://dgti-ejz-mspadronserpub.200.34.175.120.nip.io/ms/InfoPadron/servidoresPublicosSector/ y = /100?query=nombres,primerApellido,segundoApellido,dependencia,tipoEntidad,nombrePuesto,sueldoBase,compensacionGarantizada x sector似乎都被编码为institución。如果检索到所有这些,则可以遍历组合。

最后,如果进一步检查网络机会,您会发现一些包含这些编码映射的请求。

编辑2

怀疑,在检查网络时,我用下面的请求URL VW/XYZ对标记为sectores.json的请求进行了加密。至少包含我在https://nominatransparente.rhnet.gob.mx/assets/sectores.json部分中所指的映射。进一步查看可能会为sector产生相似的结果。

可能您必须切换并单击给定的instutución才能查看给定sector的所有institucón选项。然后在DOM内,您将看到类似的映射。我建议:

sector