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 und html_nodes Funktionen unter Verwendung von CSS- oder XPath-Selektoren subset werden, und
  • In R-Objekten mit Funktionen wie html_text und html_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.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow