Web scraping r em javascript

Estou tentando extrair algumas informações da seguinte página:
www.inmet.gov.br/sonabra/maps/pg_mapa.php

Como é java, não consegui, mas talvez a abordagem está errada

No código fonte da página (view-source:http://www.inmet.gov.br/sonabra/maps/pg_mapa.php) preciso tabela as seguintes informações:
Estação: Projeto Criosfera-C891
Código OMM: 89079
<a href=http://www.inmet.gov.br/sonabra/pg_dspDadosCodigo_sim.php?Qzg5MQ== target=_new>
Aberta em: 01/01/2014
Latitude: -84.0000
Longitude: -79.4942
Altitude: 1,285 metros

Das varias abordagens que tentei, essa foi a que cheguei mais próximo:

if (!require(“pacman”)) install.packages(“pacman”);pacman::p_load(
xml2,httr,rvest,stringr,plyr,dplyr,ggvis,knitr)

autinmet<-GET(‘http://www.inmet.gov.br/sonabra/maps/pg_mapa.php’)

oi <- autinmet%>%content(‘text’)%>%read_html()%>%html_text()

Caro,

Obrigado por mais um exemplo de como um site pode ser incrivelmente mal feito :stuck_out_tongue:

Nesse caso, acredite, todos os dados foram hard coded (ou seja, escritos na mão) dentro de um javascript, que está dentro do HTML!

Olha só:

library(magrittr)

r <- httr::GET("http://www.inmet.gov.br/sonabra/maps/pg_mapa.php")

codigo <- r %>% 
  xml2::read_html() %>% 
  xml2::xml_find_all("//script") %>% 
  dplyr::last() %>% 
  xml2::xml_text()

# mostrar um pedaço específico do texto
stringr::str_sub(codigo, 2000, 3000)
#> [1] "\r\n         //************* ESTACÃO C891 ***************** \n         
var point = new google.maps.LatLng(-84.0000, -79.4942);\n         
var html = '<div style=\"width:240px\"><font size=\"1\" face=\"Arial\" color=\"black\"><b><b>Estação:</b> Projeto Criosfera-C891<br>
<b>Código OMM:</b> 89079<br><b>Registro</b>: 23 UTC
 <br>Temp. Max.: -32.5 ºC<br>Temp. Min.: -32.6 ºC
<br>Umidade: 63%<br>Pressão: 845.4 hPa<br>Precipitação: ///// mm<br>Vento Dir: 192 º<br>Vento Vel: 6 m/s<br><a href=http://www.inmet.gov.br/sonabra/ma
ps/fotos/C891.jpg target=_new> <img src=http://www.in
met.gov.br/sonabra/maps/fotos/C891.jpg width=110 he
ight=64 alt=Foto border=0><br></a><table width=111
 border=0><tr><td width=50><a href=http://www.inm
et.gov.br/sonabra/pg_dspDadosCodigo_sim.php?Qz
g5MQ== target=_new><img src=http://www.inmet.gov.
br/sonabra/maps/dados.png alt=Dados width=30 height
=25 border=0 /></a><br>Dados</td><td width=45><a href=http://www.inmet.gov.br/sonabra/pg_iframe.php?codEst=C891&mesAno=2020 target=_new><img src="...

Created on 2020-05-15 by the reprex package (v0.3.0)

Está vendo esse var html = '...? É aí que está o que você está procurando, acredite se quiser. HTML dentro do javascript dentro do HTML.

Para ler isso, primeiro eu separaria todos esses html dentro do javascript, usando uma regex:

library(magrittr)

re_html <- "(?<=var html = ')<div.[^']+"
all_var_html <- stringr::str_extract_all(codigo, re_html) %>% 
  unlist()

# vetor resultante tem 589 entradas. Primeira posição:
all_var_html[1]
#> [1] "<div style=\"width:240px\"><font size=\"1\" face=\"Arial\" color=\"black\"><b>
<b>Estação:</b> Projeto Criosfera-C891<br><b>Código OMM:</b> 89079<br>
<b>Registro</b>: 23 UTC <br>Temp. Max.: -32.5 ºC<br>Temp. Min.: -32.6 ºC<br>Umidade: 63%<br>Pressão: 845.4 hPa<br>Precipitação: ///// mm<br>Vento Dir: 192 º<br>Vento Vel: 6 m/s<br><a href=http://www.inmet.gov.br/sonabra/maps/fotos/C891.jpg target=_new> <img src=http://www.inmet.gov.br/sonabra/maps/fotos/C891.jpg width=110 height=64 alt=Foto border=0><br></a><table width=111 border=0><tr><td width=50>
<a href=http://www.inmet.gov.br/sonabra/pg_dspDadosCodigo_sim.php?Qzg5MQ== target=_new><img src=http://www.inmet.gov.br/sonabra/maps/dados.png a
lt=Dados width=30 height=25 border=0 /></a><br>Dado
s</td><td width=45><a href=http://www.inmet.gov.br/son
abra/pg_iframe.php?codEst=C891&mesAno=2020 targe
t=_new><img src=http://www.inmet.gov.br/sonabra/maps/
grafico.png alt=Grafico width=30 height=25 border=0 /></a
><br>Gráfico</td></tr></table>Aberta em: 01/01/2014<br>
Latitude: -84.0000º<br>Longitude: -79.4942º<br>Altitude: 1,
285 metros</font><\\/div>"

Created on 2020-05-15 by the reprex package (v0.3.0)

Depois, eu faria uma função que lê esse bloco de HTML e solta uma tabela, e utilizaria purrr::map_dfr() para ler todos os blocos e empilha o resultado. Essa parte eu deixo para você :wink:

le_um_html <- function(h) {
   # função incompleta. Apenas lê o HTML e transforma em texto. 
   xml2::read_html(h) %>% 
      xml2::xml_text()
}

kkkkkkk
Bem assim mesmo

Conseguem dificultar tudo né

Pode deixar, muito obrigado. Ajudou muito

1 curtida

@jtrecenti, conseguir fazer a raspagem. Ficou muito bom. Mas não estou conseguindo mandar o código

Mas agora estou com um problema no acesso POST para a url dos dados acima
Preciso das seguintes informações:
aleaValue:
xaleaValue:
xID:
dtaini:
dtafim:
aleaNum:

Já consegui aleaValue, dtaini, dtafim e aleaNum, xaleaValue parece ser uma junção da data da consulta e aleaValue, mas tem dois digitos que não sei ainda o que são, mas o xID está bem difícil de conseguir.
Vou te mandar até onde cheguei, utilizei boa parte do código do italocegatta/inmetdown

id_filter <- id<-estacoes$id

inicio <- tryCatch(lubridate::dmy(inicio), warning=function(w) w)
fim <- tryCatch(lubridate::dmy(fim), warning=function(w) w)

end_hour <- ifelse(
fim == Sys.Date(),
lubridate::hour(lubridate::now(“UTC”)) - 1, 23)

end_date_time <- lubridate::ymd_hms(paste0(fim, “-”, end_hour, “:0:0”))

seq <- seq_along(estacoes$id)
out <- vector(“list”, length(seq))

i=1

session <- suppressWarnings(rvest::html_session(estacoes$url[i], “.”))

code_cript <- session %>%
rvest::html_nodes(“img”) %>%
rvest::html_attr(‘src’) %>%
stringr::str_extract("(?<==)(.*?)(?==)")

teste <- base64enc::base64decode(code_cript)
codigo_img <- paste0(substr(teste, 2,2)[1],substr(teste, 2,2)[2],substr(teste, 2,2)[3],substr(teste, 2,2)[4])

ddf <- list(
aleaValue = paste0(code_cript,’==’),
xaleaValue = ‘’,
xID = ‘’,
dtaini = format(start, “%d/%m/%Y”),
dtafim = format(end, “%d/%m/%Y”),
aleaNum = paste0(codigo_img))

g<-httr::POST(estacoes$url[i],body = ddf)

Parei aqui, não consegui acessar a tabela. Não acho os valores de xaleaValue e xID