Einführung
Web-Scraping ist eine unverzichtbare Technik für Datenwissenschaftler und Analysten, die Daten aus Websites für Analysen oder Forschungszwecke extrahieren müssen. In diesem Tutorial lernen Sie, wie Sie rvest, ein beliebtes R-Paket, verwenden, um HTML zu analysieren, Daten zu extrahieren und allgemeine Web-Scraping-Herausforderungen zu bewältigen. Wir beginnen mit grundlegenden Beispielen und gehen dann auf fortgeschrittenere Themen wie Paginierung, Verwendung von Sitzungen und Fehlerbehandlung ein.
Einrichten
Bevor Sie beginnen, stellen Sie sicher, dass das Paket rvest installiert und geladen ist:
#| label: install-rvest
# Installieren Sie das Paket
install.packages("rvest")
# Laden Sie das Paket
library(rvest)
Grundlegendes Web-Scraping-Beispiel
Beginnen wir mit einem einfachen Beispiel: Abrufen einer Webseite und Extrahieren ihres Titels.
#| label: basic-scraping
# Definieren Sie die zu scrappende URL
<- "https://www.worldometers.info/world-population/population-by-country/"
url
# Lesen Sie den HTML-Inhalt aus der URL
<- read_html(url)
page
# Extrahieren des Seitentitels mithilfe eines CSS-Selektors
<- page %>% html_node("title") %>% html_text()
page_title print(paste("Page Title:", page_title))
Ergebnisse:
[1] "Page Title: Population by Country (2025) - Worldometer"
Extrahieren von Links und Text
Sie können Hyperlinks und deren Text aus einer Webseite extrahieren:
#| label: extract-links
# Alle Hyperlink-Knoten extrahieren
<- page %>% html_nodes("a")
links
# Extrahieren von Text und URLs für die ersten 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))
}
Ergebnisse:
[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/"
Tabellen extrahieren
Viele Websites zeigen Daten in Tabellen an. Verwenden Sie rvest zum Extrahieren und Konvertieren von Tabellen in Datenrahmen:
#| label: extract-tables
# Suchen Sie die erste Tabelle auf der Seite
<- page %>% html_node("table")
table_node # Konvertieren Sie die Tabelle in einen Datenrahmen
<- table_node %>% html_table(fill = TRUE)
table_data print(head(table_data))
Ergebnisse:
Paginierung behandeln
Bei Websites, die Daten auf mehrere Seiten aufteilen, können Sie den Seitenumbruch automatisieren. Der folgende Code extrahiert Blogpost-Titel und URLs aus einer paginierten Website, indem er durch eine Reihe von Seitenzahlen iteriert, und kombiniert die Ergebnisse dann in einem Datenrahmen.
#| label: pagination-example
library(rvest)
library(dplyr)
library(purrr)
library(tibble)
# Definieren Sie eine Funktion zum Scrapen einer Seite mit ihrer URL
<- function(url) {
scrape_page tryCatch({
read_html(url)
error = function(e) {
}, message("Error accessing URL: ", url)
return(NULL)
})
}
# Die Website verwendet einen Abfrageparameter `#listing-listing-page=` für die Paginierung
<- "https://quarto.org/docs/blog/#listing-listing-page="
base_url <- 1:2 # Beispiel: Scraping der ersten 2 Seiten
page_numbers
# Initialisieren einer leeren Tibble zum Speichern von Beiträgen
<- tibble(title = character(), url = character())
all_posts
# Schleife über jede Seitennummer
for (page_number in page_numbers) {
<- paste0(base_url, page_number)
url <- scrape_page(url)
page
if (!is.null(page)) {
# Extrahieren von Blogbeiträgen: Jeder Titel und jede URL befindet sich in einem <h3>-Tag mit der Klasse '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_)
}
})# Hängen Sie die Beiträge dieser Seite an die Gesamtliste an
<- bind_rows(all_posts, posts)
all_posts
}
# Respektvolle Verzögerung zwischen den Anfragen
Sys.sleep(1)
}
# Zeigen Sie die ersten paar Zeilen der gesammelten Beiträge an
print(head(all_posts))
Sitzungen verwenden
Die Verwendung von Sitzungen kann dabei helfen, den Status (z. B. Cookies und Header) über mehrere Anfragen hinweg beizubehalten, was die Effizienz beim Scraping mehrerer Seiten derselben Website verbessert.
#| label: using-sessions
<- "https://www.worldometers.info/world-population/population-by-country/"
url # Ein Session-Objekt erstellen
<- session("https://www.worldometers.info")
session # Verwenden Sie die Sitzung zum Navigieren und Scrapen
<- session %>% session_jump_to(url)
page <- page %>% read_html() %>% html_node("title") %>% html_text()
page_title print(paste("Session-based Page Title:", page_title))
Fehlerbehandlung
Die Integration einer Fehlerbehandlung stellt sicher, dass Ihr Skript unerwartete Probleme problemlos bewältigen kann.
#| label: error-handling
# Verwendung von tryCatch zur Behandlung von Fehlern beim Scraping
<- 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.")
}
Ergebnisse:
Error: HTTP error 404.
[1] "Failed to retrieve the page. Please check the URL or try again later."
Best Practices für Web-Scraping
- Website-Richtlinien respektieren:
Überprüfen Sie immer dierobots.txt
-Datei und die Nutzungsbedingungen der Website, um sicherzustellen, dass die Scraping-Richtlinien eingehalten werden. - Ratenbegrenzung implementieren:
Verwenden Sie Verzögerungen (z. B.Sys.sleep()
) zwischen Anfragen, um den Server nicht zu überlasten. - Monitor für Änderungen:
Websites können ihre Struktur im Laufe der Zeit ändern. Aktualisieren Sie regelmäßig Ihre Selektoren und die Fehlerbehandlung, um diese Änderungen zu berücksichtigen. - Dokumentieren Sie Ihren Code:
Kommentieren Sie Ihre Skripte und strukturieren Sie sie klar, um die Wartung und Reproduzierbarkeit zu erleichtern.
Schlussfolgerung
Dieses Tutorial erweitert die Grundlagen und behandelt fortgeschrittene Techniken für Web-Scraping mit rvest, einschließlich Paginierung, Verwendung von Sessions und Implementierung von Fehlerbehandlung. Mit diesen Tools und bewährten Verfahren können Sie robuste Datenextraktions-Workflows für Ihre Data-Science-Projekte erstellen.
Weiterführende Literatur
- Berichte automatisieren mit RMarkdown
- Interaktive Dashboards mit Shiny
- Tidyverse für Datenwissenschaft
Viel Spaß beim Programmieren und beim Erforschen des Webs mit rvest!
Weitere Artikel erkunden
Hier finden Sie weitere Artikel aus derselben Kategorie, die Ihnen helfen, tiefer in das Thema einzutauchen.
Wiederverwendung
Zitat
@online{kassambara2024,
author = {Kassambara, Alboukadel},
title = {Web-Scraping mit rvest},
date = {2024-02-10},
url = {https://www.datanovia.com/de/learn/programming/r/tools/web-scraping-with-rvest.html},
langid = {de}
}