R Language
Skrobanie i analizowanie stron internetowych
Szukaj…
Uwagi
Skrobanie odnosi się do korzystania z komputera w celu pobrania kodu strony internetowej. Po uzyskaniu kodu należy go przeanalizować w użyteczną formę do dalszego użycia w języku R.
Baza R nie ma wielu narzędzi wymaganych do tych procesów, więc skrobanie i parsowanie odbywa się zwykle za pomocą pakietów. Niektóre pakiety są najbardziej przydatne do skrobania ( RSelenium
, httr
, curl
, RCurl
), niektóre do parsowania ( XML
, xml2
), a niektóre do obu ( rvest
).
Pokrewnym procesem jest skrobanie interfejsu API sieci Web, który w przeciwieństwie do strony zwraca dane przeznaczone do odczytu maszynowego. Wiele takich samych pakietów jest używanych dla obu.
Legalność
Niektóre strony internetowe sprzeciwiają się zeskrobaniu z powodu zwiększonego obciążenia serwera lub obaw związanych z własnością danych. Jeśli strona internetowa zabrania skrobania w niej warunków użytkowania, skrobanie jest nielegalne.
Podstawowe skrobanie za pomocą rvestu
rvest
to pakiet do skrobania i analizowania stron WWW autorstwa Hadleya Wickhama zainspirowany piękną zupą Pythona. Wykorzystuje on powiązania libxml2
pakietu xml2
Hadleya do analizowania HTML.
W ramach tidyverse, rvest
jest rurami . To używa
-
xml2::read_html
aby zeskrobać kod HTML strony internetowej, - które można następnie
html_nodes
funkcjehtml_node
ihtml_nodes
za pomocą selektorów CSS lub XPath, oraz - parsowane do obiektów R z funkcjami takimi jak
html_text
ihtml_table
.
Aby zeskrobać tabelę kamieni milowych ze strony Wikipedii na R , wyglądałby kod
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
Zwraca to ramkę data.frame, ale należy pamiętać, że jak to zwykle jest w przypadku danych zeskrobanych, należy jeszcze wyczyścić dane: tutaj, formatowanie dat, wstawianie NA
i tak dalej.
Zauważ, że dane w mniej spójnym formacie prostokątnym mogą wymagać zapętlenia lub innego dalszego mungowania, aby pomyślnie parsować. Jeśli strona korzysta z jQuery lub innych środków do wstawiania treści, read_html
może być niewystarczający do zeskrobywania i może być konieczna bardziej niezawodna skrobak, taki jak RSelenium
.
Używanie rvest, gdy wymagane jest logowanie
Często spotykanym problemem podczas złomowania sieci jest wprowadzenie identyfikatora użytkownika i hasła w celu zalogowania się na stronie internetowej.
W tym przykładzie, który utworzyłem, aby śledzić moje odpowiedzi zamieszczone tutaj, aby przepełnić stos. Ogólnym przepływem jest logowanie, przejście do strony internetowej, zebranie informacji, dodanie ramki danych, a następnie przejście do następnej strony.
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)
Pętla w tym przypadku jest ograniczona tylko do 5 stron, należy ją zmienić, aby pasowała do Twojej aplikacji. Zastąpiłem wartości specyficzne dla użytkownika ******, mam nadzieję, że dostarczy to wskazówek dla twojego problemu.