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
<- "https://www.worldometers.info/world-population/population-by-country/"
url
# Ler o conteúdo HTML do URL
<- read_html(url)
page
# Extraia o título da página usando um seletor CSS
<- page %>% html_node("title") %>% html_text()
page_title print(paste("Page Title:", page_title))
Resultados:
[1] "Page Title: Population by Country (2025) - Worldometer"
Extração de links e texto
Você pode extrair hiperlinks e seus textos de uma página da Web:
#| label: extract-links
# Extrair todos os nós de hiperlink
<- page %>% html_nodes("a")
links
# Extrair texto e URLs para os primeiros 5 links
for (i in 1:min(5, length(links))) {
<- links[i] %>% html_text(trim = TRUE)
link_text <- links[i] %>% html_attr("href")
link_href print(paste("Link Text:", link_text, "- URL:", link_href))
}
Resultados:
[1] "Link Text: - URL: /"
[1] "Link Text: Population - URL: /population/"
[1] "Link Text: CO2 emissions - URL: /co2-emissions/"
[1] "Link Text: Coronavirus - URL: /coronavirus/"
[1] "Link Text: Countries - URL: /geography/countries-of-the-world/"
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
<- page %>% html_node("table")
table_node # Converta a tabela em um quadro de dados
<- table_node %>% html_table(fill = TRUE)
table_data print(head(table_data))
Resultados:
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
<- function(url) {
scrape_page 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
<- "https://quarto.org/docs/blog/#listing-listing-page="
base_url <- 1:2 # Exemplo: raspe as duas primeiras páginas
page_numbers
# Inicialize um tibble vazio para armazenar posts
<- tibble(title = character(), url = character())
all_posts
# Fazer um loop sobre cada número de página
for (page_number in page_numbers) {
<- paste0(base_url, page_number)
url <- scrape_page(url)
page
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'
<- page %>%
posts html_nodes("h3.no-anchor.listing-title") %>%
map_df(function(h3) {
<- h3 %>% html_node("a")
a_tag if (!is.null(a_tag)) {
<- a_tag %>% html_text(trim = TRUE)
title <- a_tag %>% html_attr("href")
link tibble(title = title, url = link)
else {
} tibble(title = NA_character_, url = NA_character_)
}
})# Anexar as postagens dessa página à lista geral
<- bind_rows(all_posts, posts)
all_posts
}
# Atraso respeitoso entre solicitações
Sys.sleep(1)
}
# Exibir as primeiras linhas das postagens coletadas
print(head(all_posts))
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
<- "https://www.worldometers.info/world-population/population-by-country/"
url # Crie um objeto de sessão
<- session("https://www.worldometers.info")
session # Use a sessão para navegar e fazer scraping
<- session %>% session_jump_to(url)
page <- page %>% read_html() %>% html_node("title") %>% html_text()
page_title 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
<- function(url) {
safe_scrape tryCatch({
read_html(url)
error = function(e) {
}, message("Error: ", e$message)
return(NULL)
})
}
<- safe_scrape("https://example.com/nonexistent")
page 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 arquivorobots.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
- Automatizando relatórios com RMarkdown
- Painéis interativos com Shiny
- Tidyverse para ciência de dados
Boa codificação e divirta-se explorando a Web com o rvest!
Explore mais artigos
Aqui estão mais artigos da mesma categoria para ajudá-lo a se aprofundar no tópico.
Reuso
Citação
@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}
}