RSelenium;Зацикливание и загрузка CSV-файлов - PullRequest
0 голосов
/ 17 октября 2019

Я пытаюсь использовать RSelenium (с докером) для извлечения данных с этого сайта: 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. Я видел подобный вопрос здесь , но использует rvest . Есть ли эффективный способ извлечь все файлы CSV?

1 Ответ

1 голос
/ 17 октября 2019

Мой испанский немного ржавый, но если я не ошибаюсь, вы пытаетесь сначала переключить los filtros de búsqueda por Sector e Institución, а затем пройти через sector x institución комбинаций.

Если вы нажмете на одну изВ комбинациях, скажем, Aportaciones de Seguridad Social x 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

Этот ответ представляет собой JSON, содержащий соответствующие данные, и мы можем сделать тот же запрос в пределах R с использованием httr:

# 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

Как видите, эта версия намного проще, чем тяжелая артиллерия Selenium + Docker.

Кроме того, вы можете выполнять итерации поsector х institución комбинаций. Ключ, вероятно, заключается в изменении параметров URL для получения различных комбинаций (т. Е. Части URL ?query=.... Я сам не исследовал это, но, проверив DOM и сеть при запросе других комбинаций, вы сможете выяснить это.

Редактировать 1: Проверка сети

В браузере переключите инструменты разработчика и внутри щелкните на вкладке Сеть . Когда вы выполняете Buscar , должен появиться новый запрос, а именно тот, который аналогичен приведенному выше (в зависимости от выбранной комбинации).

Я сделал это для другой комбинации и заметилURL-адрес запроса

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-адреса вы должны адаптировать: если сравнить две ссылки, вот как они отличаются

 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

Так выглядиткак если бы каждый sector x institución был закодирован как VW/XYZ. Если вы извлекаете все из них, вы можете затем выполнить итерации по комбинациям.

Наконец, если вы продолжите проверку сетиСкорее всего, вы найдете какой-нибудь запрос, содержащий отображение этих кодировок.

Редактировать 2

Как и предполагалось, при проверке сети я принял запрос, помеченный sectores.json со следующим URL-адресом запроса https://nominatransparente.rhnet.gob.mx/assets/sectores.json. Это содержит отображение, о котором я говорил, по крайней мере, для части sector. Если посмотреть дальше, можно получить аналогичный результат для instutución.

Возможно, вам нужно переключиться и щелкнуть по данному sector, чтобы затем увидеть все опции institucón для данного sector. Тогда внутри DOM вы увидите похожее отображение. Я бы предложил:

1. Get the sector mapping
2. Find out inside the network how the list of instituciónes is given back. Probably something like:
-> Request containing sector-ID in the URL -> return a JSON with all instituciónes
3. Once you figure out the logic behind it, use httr::GET to create a list of all sector x institución
4. Once you have this list, iterate over all combinations to get JSON data as above.
...