R Language
Web Scraping und Parsing
Suche…
Bemerkungen
Scraping bezieht sich auf die Verwendung eines Computers zum Abrufen des Codes einer Webseite. Nachdem der Code erhalten wurde, muss er in eine nützliche Form zur weiteren Verwendung in R geparst werden.
In Base R sind nicht viele der für diese Prozesse erforderlichen Tools vorhanden, sodass das Scraping und die Analyse normalerweise mit Paketen durchgeführt werden. Einige Pakete sind am nützlichsten für das Scraping ( RSelenium
, httr
, curl
, RCurl
), einige für die Analyse ( XML
, xml2
) und einige für beide ( rvest
).
Ein verwandter Prozess ist das Scraping einer Web-API, die im Gegensatz zu einer Webseite Daten zurückgibt, die maschinenlesbar sein sollen. Viele der gleichen Pakete werden für beide verwendet.
Rechtmäßigkeit
Einige Websites lehnen Scrap ab, sei es aufgrund einer erhöhten Serverauslastung oder aufgrund von Bedenken hinsichtlich des Dateneigentums. Wenn eine Website das Scraping in den Nutzungsbedingungen verbietet, ist das Scrapfen illegal.
Grundschaben mit Rvest
rvest
ist ein Paket für Web Scraping und Parsing von Hadley Wickham, inspiriert von Pythons Beautiful Soup . Es nutzt die libxml2
Bindungen des Hadley- xml2
Pakets für die HTML-Analyse.
Als Teil des Tidyverse wird die rvest
geleitet . Es verwendet
-
xml2::read_html
um den HTML-xml2::read_html
einer Webseite zu kratzen, - das kann dann mit seinen
html_node
undhtml_nodes
Funktionen unter Verwendung von CSS- oder XPath-Selektoren subset werden, und - In R-Objekten mit Funktionen wie
html_text
undhtml_table
.
Um die Tabelle der Meilensteine von der Wikipedia-Seite zu R zu kratzen, würde der Code aussehen
library(rvest)
url <- 'https://en.wikipedia.org/wiki/R_(programming_language)'
# scrape HTML from website
url %>% read_html() %>%
# select HTML tag with class="wikitable"
html_node(css = '.wikitable') %>%
# parse table into data.frame
html_table() %>%
# trim for printing
dplyr::mutate(Description = substr(Description, 1, 70))
## Release Date Description
## 1 0.16 This is the last alpha version developed primarily by Ihaka
## 2 0.49 1997-04-23 This is the oldest source release which is currently availab
## 3 0.60 1997-12-05 R becomes an official part of the GNU Project. The code is h
## 4 0.65.1 1999-10-07 First versions of update.packages and install.packages funct
## 5 1.0 2000-02-29 Considered by its developers stable enough for production us
## 6 1.4 2001-12-19 S4 methods are introduced and the first version for Mac OS X
## 7 2.0 2004-10-04 Introduced lazy loading, which enables fast loading of data
## 8 2.1 2005-04-18 Support for UTF-8 encoding, and the beginnings of internatio
## 9 2.11 2010-04-22 Support for Windows 64 bit systems.
## 10 2.13 2011-04-14 Adding a new compiler function that allows speeding up funct
## 11 2.14 2011-10-31 Added mandatory namespaces for packages. Added a new paralle
## 12 2.15 2012-03-30 New load balancing functions. Improved serialization speed f
## 13 3.0 2013-04-03 Support for numeric index values 231 and larger on 64 bit sy
Während dies eine data.frame zurückgibt, beachten Sie, dass für geschabt Daten typisch ist, gibt es noch die Reinigung weiterer Daten ist zu tun: hier, Termine Formatierung, Einfügen NA
s, und so weiter.
Beachten Sie, dass Daten in einem weniger konsistenten rechteckigen Format möglicherweise durchlaufen werden müssen, um erfolgreich analysiert zu werden. Wenn auf der Website jQuery oder andere Mittel zum Einfügen von Inhalten verwendet werden, reicht read_html
möglicherweise nicht aus, um einen RSelenium
, und ein robusterer RSelenium
wie RSelenium
kann erforderlich sein.
Verwendung von rvest, wenn ein Login erforderlich ist
Bei der Verschrottung eines Web tritt häufig das Problem auf, wie Sie eine Benutzer-ID und ein Kennwort eingeben, um sich bei einer Website anzumelden.
In diesem Beispiel, das ich erstellt habe, um meine Antworten zu verfolgen, die hier zum Stack-Überlauf gepostet wurden. Der gesamte Ablauf besteht darin, sich anzumelden, zu einer Webseite zu gelangen, Informationen zu sammeln, einen Datenrahmen hinzuzufügen und dann zur nächsten Seite zu gelangen.
library(rvest)
#Address of the login webpage
login<-"https://stackoverflow.com/users/login?ssrc=head&returnurl=http%3a%2f%2fstackoverflow.com%2f"
#create a web session with the desired login address
pgsession<-html_session(login)
pgform<-html_form(pgsession)[[2]] #in this case the submit is the 2nd form
filled_form<-set_values(pgform, email="*****", password="*****")
submit_form(pgsession, filled_form)
#pre allocate the final results dataframe.
results<-data.frame()
#loop through all of the pages with the desired info
for (i in 1:5)
{
#base address of the pages to extract information from
url<-"http://stackoverflow.com/users/**********?tab=answers&sort=activity&page="
url<-paste0(url, i)
page<-jump_to(pgsession, url)
#collect info on the question votes and question title
summary<-html_nodes(page, "div .answer-summary")
question<-matrix(html_text(html_nodes(summary, "div"), trim=TRUE), ncol=2, byrow = TRUE)
#find date answered, hyperlink and whether it was accepted
dateans<-html_node(summary, "span") %>% html_attr("title")
hyperlink<-html_node(summary, "div a") %>% html_attr("href")
accepted<-html_node(summary, "div") %>% html_attr("class")
#create temp results then bind to final results
rtemp<-cbind(question, dateans, accepted, hyperlink)
results<-rbind(results, rtemp)
}
#Dataframe Clean-up
names(results)<-c("Votes", "Answer", "Date", "Accepted", "HyperLink")
results$Votes<-as.integer(as.character(results$Votes))
results$Accepted<-ifelse(results$Accepted=="answer-votes default", 0, 1)
Die Schleife ist in diesem Fall auf nur 5 Seiten begrenzt, dies muss sich ändern, um zu Ihrer Anwendung zu passen. Ich habe die benutzerspezifischen Werte durch ****** ersetzt, hoffentlich gibt dies einige Hinweise für Ihr Problem.