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

29 de abril 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.