Web scraping é uma técnica de extração de dados utilizada para coletar dados de sites. Por meio de processos automatizados, implementados usando um rastreador bot, esse tipo de ‘raspagem’ é uma forma de realizar cópias de dados em que informações específicas são coletadas e copiadas da web.
Maiores detalhes em: <ahref=‘https://blogbrasil.westcon.com/o-que-e-web-scraping’>https://blogbrasil.westcon.com/o-que-e-web-scraping - Blog Brasil Westcon.
Os principais pacotes que podemos utilizar para trabalhar com web scraping são: xml2, httr e rvest.
O pacote xml2 tem a finalidade de estruturar arquivos HTML ou XML de forma eficiente, tornando possível a obtenção de tags e seus atributos dentro de um arquivo.
O pacote httr é responsável por realizar requisições web para obtenção das páginas de interesse, buscando reduzir ao máximo a complexidade da programação.
Por último, o pacote rvest é escrito sobre os dois anteriores e por isso eleva ainda mais o nível de especialização para raspagem de dados.
Para trabalhar com páginas simples, basta carregar o rvest e utilizar suas funcionalidades. Caso o acesso à página exija ações mais complexas e/ou artifícios de ferramentas web, será necessário utilizar o httr. O xml2 só será usado explicitamente nos casos raros em que a página está em XML, que pode ser visto como uma generalização do HTML.
Maiores detalhes em:
http://www2.sabesp.com.br/mananciais/DivulgacaoSiteSabesp.aspx.
library(tibble)
## Warning: package 'tibble' was built under R version 3.6.1
library(httr)
## Warning: package 'httr' was built under R version 3.6.1
library(rvest)
## Warning: package 'rvest' was built under R version 3.6.1
## Loading required package: xml2
## Warning: package 'xml2' was built under R version 3.6.1
library(lubridate)
## Warning: package 'lubridate' was built under R version 3.6.1
##
## Attaching package: 'lubridate'
## The following object is masked from 'package:base':
##
## date
library(stringr)
## Warning: package 'stringr' was built under R version 3.6.1
library(purrr)
##
## Attaching package: 'purrr'
## The following object is masked from 'package:rvest':
##
## pluck
library(dplyr)
## Warning: package 'dplyr' was built under R version 3.6.1
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:lubridate':
##
## intersect, setdiff, union
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
link <- 'http://www2.sabesp.com.br/mananciais/DivulgacaoSiteSabesp.aspx'
txt <- GET(link)
# As tags na internet são palavras que servem justamente como uma etiqueta e ajudam na hora de organizar informações, agrupando aquelas que receberam a mesma marcação, facilitando encontrar outras relacionadas.
pegar_tags <- function(req, tipo) {
req %>%
content('text') %>%
read_html() %>%
html_node(tipo) %>%
html_attr('value')
}
# exemplo
viewstate <- pegar_tags(txt, "#__VIEWSTATE")
eventval <- pegar_tags(txt, "#__EVENTVALIDATION")
sabesp_dados <- function(data, vs, ev) {
data <- as.Date(data)
dados <- list(cmbDia = lubridate::day(data),
cmbMes = lubridate::month(data),
cmbAno = lubridate::year(data),
Imagebutton1.x = '0',
Imagebutton1.y = '0',
'__VIEWSTATE' = vs,
'__EVENTVALIDATION' = ev,
'__VIEWSTATEENCRYPTED' = '')
}
# exemplo
data <- '2017-02-14'
form <- sabesp_dados(data, viewstate, eventval)
# requisicao de busca
result <- POST(link, body = form)
sabesp_nm_sistemas <- function(r) {
nomes <- r %>%
content('text') %>%
read_html() %>%
html_nodes('img') %>%
html_attr('src') %>%
keep(~str_detect(.x, '\\.gif$')) %>%
map_chr(~str_match(.x, '/(.+)\\.gif')[, 2])
}
# conteúdo da página
sabesp_conteudo <- function(r) {
nomes <- sabesp_nm_sistemas(r)
r %>%
content('text') %>%
read_html() %>%
html_node('#tabDados') %>%
html_table(fill = TRUE) %>%
select(titulo = X1, info = X2) %>%
filter(titulo != '') %>%
mutate(lugar = rep(nomes, each = 4)) %>% #View
mutate(info = info %>%
str_extract('[-0-9, %m]+$') %>%
str_replace_all('^[^:]+:', '') %>%
str_replace_all(',', '.') %>%
str_replace_all('[^0-9.]', '') %>%
as.numeric()) %>%
as_tibble()
}
# exemplo
sabesp_conteudo(result)
### Forma mais resumida de fazer
sabesp_dia <- function(data) {
link <- 'http://www2.sabesp.com.br/mananciais/DivulgacaoSiteSabesp.aspx'
txt <- GET(link)
viewstate <- pegar_tags(txt, "#__VIEWSTATE")
eventval <- pegar_tags(txt, "#__EVENTVALIDATION")
form <- sabesp_dados(data, viewstate, eventval)
result <- POST(link, body = form)
d_res <- sabesp_conteudo(result) %>%
mutate(result = 'OK')
return(d_res)
}
# exemplo
sabesp_dia('2017-02-14')
sabesp_dias <- function(datas) {
sabesp_dia_safe <- failwith(tibble(result = 'erro'), sabesp_dia)
datas %>%
setNames(as.character(datas)) %>%
purrr::map_df(sabesp_dia_safe, .id = 'data')
}
# exemplo
dts <- as.Date('2017-02-14') - lubridate::days(0:13 * 30)
d_sabesp <- sabesp_dias(dts)
## Warning: Deprecated: please use `purrr::possibly()` instead
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 3.6.1
d_sabesp %>%
filter(titulo == 'índice armazenado') %>%
mutate(data = ymd(data)) %>%
ggplot(aes(x = data, y = info, colour = lugar)) +
geom_line() +
theme_bw()