Introdução a Web Scraping com R


Venho mostrar nesse post, uma introdução sobre Web Scraping com R.

O estudo será realizado sobre o projeto “SERENATA DE AMOR” https://serenata.ai/, que é um projeto aberto no qual usa data science (ciência de dados) – a mesma tecnolgia usada por gigantes como Google, Facebook e Netflix – com o objetivo de monitorar os gastos públicos e compartilhar informações de forma acessível a todos.

Até a data da publicação deste post, o projeto já reportou mais de 8.276 ressarcimentos suspeitos à Câmara dos Deputados envolvendo 735 parlamentares diferentes com valor total superior a R$ 3,6 mi.

Quer saber como funciona o sistema de relatórios? Você pode ler mais neste post – clicando aqui!.

Explicado o projeto Serenata, voltamos ao Web Scraping. A coleta de dados será sobre o Jarbas ), que é a plataforma onde ficam armazenados os documentos considerados suspeitos. Com o intuito de mostrar que é possível analisar os dados da forma que desejar para tomada de decisões, um gráfico será gerado com os dados coletados de alguns deputados e os valores de reembolso solicitados por eles.

Passo 1: Lendo a URL.

Para ler a página em html, será utilizado a função “read_html” do pacote rvest.

library(rvest)
## Carregando pacotes exigidos: xml2
url <- "https://jarbas.serenata.ai/dashboard/chamber_of_deputies/reimbursement/"
jarbas_webpage <- read_html(url)

Passo 2: Agora, a melhor parte da biblioteca rvest é que você pode extrair os dados de html em forma de nós, o que significa que você pode selecionar imediatamente quais os nós através dos ids ou classes css e extrair o texto das tags do html. Então eu fui para o meu url e abri o “firebug ” no navegador e percebi que os nomes dos deputados foram encapsulados na classe css “.field-congressperson_name ”, usando esta classe css que posso extrair todos os nomes dos deputados na página da web.

Existem 2 funções que usaremos aqui:

  1. html_nodes: Use esta função para extrair os nós que desejamos (neste caso nós com “.field-congressperson_name” como classe css
  2. html_text: Use esta função para extrair o texto entre dos nós html (neste caso, os nomes de nossos representantes)
#Scraping  usando classe css ‘field-congressperson_name’
jarbas_names_html <-html_nodes(jarbas_webpage, '.field-congressperson_name')
jarbas_names <- html_text(jarbas_names_html)
head(jarbas_names)
## [1] "Valmir Assunção" "Hélio Leite"     "Hélio Leite"     "Hélio Leite"    
## [5] "Bacelar"         "Hélio Leite"

Da mesma forma, agora farei isso para todos os outros atributos: SUBQUOTA TRANSLATED, FORNECEDOR. Cada um desses atributos tem suas próprias classes css: field-subquota_translated, field-supplier_info.

#SUBQUOTA TRANSLATED
jarbas_subquota_html <-html_nodes(jarbas_webpage, '.field-subquota_translated')
jarbas_subquota <- html_text(jarbas_subquota_html)
head(jarbas_subquota)
## [1] "Combustíveis e lubrificantes"                
## [2] "Divulgação da atividade parlamentar"         
## [3] "Divulgação da atividade parlamentar"         
## [4] "Combustíveis e lubrificantes"                
## [5] "Consultorias, pesquisas e trabalhos técnicos"
## [6] "Combustíveis e lubrificantes"
#Fornecedor
jarbas_provider_html <-html_nodes(jarbas_webpage, '.field-supplier_info')
jarbas_provider <- html_text(jarbas_provider_html)
head(jarbas_provider)
## [1] "POSTO MK 107 NORTE LTDA05.625.571/0001-35"                        
## [2] "PRISCILLA DE CASSIA PORTELA VINHOTE 7054665724934.314.072/0001-25"
## [3] "M SANTOS GUIMARAES EIRELI23.936.281/0001-94"                      
## [4] "SUPER POSTO PALMEIRA LTDA83.838.839/0001-20"                      
## [5] "NARCISO COELHO E MATOS ADVOGADOS ASSOCIADOS17.359.366/0001-54"    
## [6] "Posto de Combustiveis Garantia Ltda72.578.438/0002-43"

A seguir serão mostrados o valor do reembolso, note que eles são extraídos em tipo de variável caracter: Ex: R$ 139,76, R$ 40,23. Entretanto, como desejamos manipular esses números, precisamos convertê-los para tipo de variável numérica, dessa forma será utilizado a biblioteca: “Stringr” mais especificamente a função: str_extract. Segue o script para conversão da variável.

library(stringr)
#valores em Real
jarbas_value_html <-html_nodes(jarbas_webpage, '.field-value')
jarbas_value <- html_text(jarbas_value_html)
head(jarbas_value)
## [1] "R$ 198,84"   "R$ 900,00"   "R$ 300,00"   "R$ 5022,28"  "R$ 13000,00"
## [6] "R$ 168,94"
#R$ 139,76" "R$ 40,23"  "R$ 72,05"  "R$ 72,05"  "R$ 56,39"  "R$ 235,64"  
#dados extraídos na forma de caracter, vamos converter para tipo numérico
jarbas_value <- as.numeric(sub(",",".",str_extract(jarbas_value,pattern = "\\-*\\d+,\\s{0,}\\d+")))
head(jarbas_value,25)
##  [1]   198.84   900.00   300.00  5022.28 13000.00   168.94   600.65   129.17
##  [9]    88.42    26.54   800.62    64.84   164.00    25.84  1817.62   199.35
## [17]  1889.55    64.45    60.40  2214.45   139.32    25.65  3000.00  5000.00
## [25]  1500.00

Passo 3: Com essas informações disponíveis, vamos gerar um dataframe. Para facilitar a visualização, apenas o primeiro nome de cada deputado foi selecionado.

#Combinando todas as características obtidas
jarbas_names <- str_extract(jarbas_names,pattern = boundary("word"))
jarbas_df <- data.frame(
  Name = jarbas_names,
  Subquota = jarbas_subquota,
  Provider = jarbas_provider,
  Value = jarbas_value
  )
str(jarbas_df)
## 'data.frame':    100 obs. of  4 variables:
##  $ Name    : chr  "Valmir" "Hélio" "Hélio" "Hélio" ...
##  $ Subquota: chr  "Combustíveis e lubrificantes" "Divulgação da atividade parlamentar" "Divulgação da atividade parlamentar" "Combustíveis e lubrificantes" ...
##  $ Provider: chr  "POSTO MK 107 NORTE LTDA05.625.571/0001-35" "PRISCILLA DE CASSIA PORTELA VINHOTE 7054665724934.314.072/0001-25" "M SANTOS GUIMARAES EIRELI23.936.281/0001-94" "SUPER POSTO PALMEIRA LTDA83.838.839/0001-20" ...
##  $ Value   : num  199 900 300 5022 13000 ...

Passo 4: Numa primeira análise, podemos utilizar gráfico entre o valor do reembolso e o nome dos deputados. Foram utilizados as 50 primeiras linhas do data.frame e uma biblioteca ggplot2 para geração do gráfico.

library(ggplot2)

jarbas_df <- jarbas_df[1:50,]

ggplot(
  jarbas_df, aes(Value,Name,colour=Subquota)) +
  geom_point() +
  labs(title="", x ="pedidos de reembolso (R$)",
       y = "deputados",colour="SUBQUOTA TRANSLATED")

“Post gerado com framework HUGO (http://gohugo.io/), R Markdown (http://rmarkdown.rstudio.com/), no qual os resultados são gerados na geração da página.”

Post original:

https://jodavid.github.io/post/web-scraping-introduction-with-r/

LinkedIn do autor:

https://www.linkedin.com/in/jodavidferreira/

#webscraping #R #dadosweb #extrairdados