Web scraping com rvest

Extração de dados da Web usando rvest em R - Guia expandido

Saiba como extrair dados de sites usando o pacote rvest no R. Este tutorial expandido abrange não apenas os fundamentos da análise de HTML e da extração de dados, mas também técnicas avançadas, como o tratamento da paginação, o uso de sessões e a implementação do tratamento de erros para uma extração robusta da Web.

Programação
Autor
Afiliação
Data de Publicação

10 de fevereiro de 2024

Data de Modificação

9 de maio de 2025

Palavras-chave

Tutorial do rvest, raspagem da Web em R, Análise de HTML no R, Extrair dados com o rvest, raspagem avançada da Web R

Introdução

A raspagem da Web é uma técnica essencial para cientistas de dados e analistas que precisam extrair dados de sites para análise ou pesquisa. Neste tutorial, você aprenderá a usar o rvest, um pacote R popular, para analisar HTML, extrair dados e lidar com desafios comuns de raspagem da Web. Começaremos com exemplos básicos e depois expandiremos para tópicos mais avançados, como paginação, uso de sessões e tratamento de erros.



Configuração

Antes de começar, certifique-se de que o pacote rvest esteja instalado e carregado:

#| label: install-rvest
# Instalar o pacote
install.packages("rvest")

# Carregar o pacote
library(rvest)

Exemplo básico de raspagem da Web

Vamos começar com um exemplo simples: buscar uma página da Web e extrair seu título.

#| label: basic-scraping
# Defina a URL a ser raspada
url <- "https://www.worldometers.info/world-population/population-by-country/"

# Ler o conteúdo HTML do URL
page <- read_html(url)

# Extraia o título da página usando um seletor CSS
page_title <- page %>% html_node("title") %>% html_text()
print(paste("Page Title:", page_title))

Resultados:

[1] "Page Title: Population by Country (2025) - Worldometer"

Extraindo tabelas

Muitos sites exibem dados em tabelas. Use o rvest para extrair e converter tabelas em quadros de dados:

#| label: extract-tables
# Localizar a primeira tabela na página
table_node <- page %>% html_node("table")
# Converta a tabela em um quadro de dados
table_data <- table_node %>% html_table(fill = TRUE)
print(head(table_data))

Resultados:

Tabela extraída

Tratamento de paginação

Para sites que dividem dados em várias páginas, você pode automatizar a paginação. O código a seguir extrai títulos de posts de blogs e URLs de um site paginado por meio da iteração em um conjunto de números de páginas e, em seguida, combina os resultados em um quadro de dados.

#| label: pagination-example
library(rvest)
library(dplyr)
library(purrr)
library(tibble)

# Defina uma função para extrair uma página com seu URL
scrape_page <- function(url) {
  tryCatch({
    read_html(url)
  }, error = function(e) {
    message("Error accessing URL: ", url)
    return(NULL)
  })
}

# O site usa um parâmetro de consulta `#listing-listing-page=` para paginação
base_url <- "https://quarto.org/docs/blog/#listing-listing-page="
page_numbers <- 1:2  # Exemplo: raspe as duas primeiras páginas

# Inicialize um tibble vazio para armazenar posts
all_posts <- tibble(title = character(), url = character())

# Fazer um loop sobre cada número de página
for (page_number in page_numbers) {
  url <- paste0(base_url, page_number)
  page <- scrape_page(url)
  
  if (!is.null(page)) {
    # Extrair postagens de blog: cada título e URL está em uma tag <h3> com a classe 'no-anchor listing-title'
    posts <- page %>%
      html_nodes("h3.no-anchor.listing-title") %>%
      map_df(function(h3) {
        a_tag <- h3 %>% html_node("a")
        if (!is.null(a_tag)) {
          title <- a_tag %>% html_text(trim = TRUE)
          link <- a_tag %>% html_attr("href")
          tibble(title = title, url = link)
        } else {
          tibble(title = NA_character_, url = NA_character_)
        }
      })
    # Anexar as postagens dessa página à lista geral
    all_posts <- bind_rows(all_posts, posts)
  }
  
  # Atraso respeitoso entre solicitações
  Sys.sleep(1)
}

# Exibir as primeiras linhas das postagens coletadas
print(head(all_posts))

Postagens de blog extraídas

Usando sessões

O uso de sessões pode ajudar a manter o estado (por exemplo, cookies e cabeçalhos) em várias solicitações, aumentando a eficiência ao extrair várias páginas do mesmo site.

#| label: using-sessions
url <- "https://www.worldometers.info/world-population/population-by-country/"
# Crie um objeto de sessão
session <- session("https://www.worldometers.info")
# Use a sessão para navegar e fazer scraping
page <- session %>% session_jump_to(url)
page_title <- page %>% read_html() %>% html_node("title") %>% html_text()
print(paste("Session-based Page Title:", page_title))

Tratamento de erros

A integração do tratamento de erros garante que o seu script possa lidar com problemas inesperados de forma elegante.

#| label: error-handling
# Usar tryCatch para tratar erros durante a extração
safe_scrape <- function(url) {
  tryCatch({
    read_html(url)
  }, error = function(e) {
    message("Error: ", e$message)
    return(NULL)
  })
}

page <- safe_scrape("https://example.com/nonexistent")
if (is.null(page)) {
  print("Failed to retrieve the page. Please check the URL or try again later.")
}

Resultados:

Error: HTTP error 404.
[1] "Failed to retrieve the page. Please check the URL or try again later."

Melhores práticas para Web scraping

  • Respeite as políticas do site:
    Sempre verifique o arquivo robots.txt e os termos de serviço do site para garantir a conformidade com suas políticas de raspagem.
  • Implementar limitação de taxa:
    Use atrasos (por exemplo, Sys.sleep()) entre as solicitações para evitar sobrecarregar o servidor.
  • Monitoramento de alterações:
    Os sites podem mudar sua estrutura ao longo do tempo. Atualize regularmente seus seletores e o tratamento de erros para acomodar essas alterações.
  • Documente seu código:
    Comente seus scripts e estruture-os claramente para facilitar a manutenção e a reprodutibilidade.

Conclusão

Expandindo os conceitos básicos, este tutorial aborda técnicas avançadas de raspagem da Web com o rvest, incluindo o tratamento da paginação, o uso de sessões e a implementação do tratamento de erros. Com essas ferramentas e práticas recomendadas, você pode criar fluxos de trabalho robustos de extração de dados para seus projetos de ciência de dados.

Leitura adicional

Boa codificação e divirta-se explorando a Web com o rvest!

Explore mais artigos

Nota

Aqui estão mais artigos da mesma categoria para ajudá-lo a se aprofundar no tópico.

De volta ao topo

Reuso

Citação

BibTeX
@online{kassambara2024,
  author = {Kassambara, Alboukadel},
  title = {Web scraping com rvest},
  date = {2024-02-10},
  url = {https://www.datanovia.com/pt/learn/programming/r/tools/web-scraping-with-rvest.html},
  langid = {pt}
}
Por favor, cite este trabalho como:
Kassambara, Alboukadel. 2024. “Web scraping com rvest.” February 10, 2024. https://www.datanovia.com/pt/learn/programming/r/tools/web-scraping-with-rvest.html.