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
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ê
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