Sök…


Anmärkningar

Skrapning avser att använda en dator för att hämta koden på en webbsida. När koden har erhållits måste den analyseras i en användbar form för vidare användning i R.

Base R har inte många av de verktyg som krävs för dessa processer, så skrotning och analysering görs vanligtvis med paket. Vissa paket är mest användbara för skrapning ( RSelenium , httr , curl , RCurl ), några för att analysera ( XML , xml2 ) och några för båda ( rvest ).

En relaterad process skrapar ett webb-API, som till skillnad från en webbsida returnerar data som är avsedda att vara maskinläsbara. Många av samma paket används för båda.

Laglighet

Vissa webbplatser gör invändningar mot att skrotas, vare sig det beror på ökad serverbelastning eller oro för dataintrång. Om en webbplats förbjuder att skrapa i den Användarvillkor är skrotning olaglig.

Grundläggande skrapning med rvest

rvest är ett paket för webbskrapning och analys av Hadley Wickham inspirerad av Pythons vackra soppa . Det utnyttjar Hadleys xml2 paketets libxml2 bindningar för HTML-parsing.

Som en del av tidyverse, rvest rörs . Det använder

  • xml2::read_html att skrapa HTML på en webbsida,
  • som sedan kan delas med sina html_node och html_nodes funktioner med hjälp av CSS- eller XPath-väljare, och
  • analyserad till R-objekt med funktioner som html_text och html_table .

För att skrapa tabellen över milstolpar från Wikipedia-sidan på R skulle koden se ut

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

Medan detta returnerar en data.frame, observera att det som är typiskt för skrapad data, det fortfarande finns ytterligare datarengöring som ska göras: här, formatera datum, infoga NA och så vidare.

Observera att data i ett mindre konsekvent rektangulärt format kan ta slingor eller annan mingring för att framgångsrikt analysera. Om webbplatsen använder jQuery eller andra sätt att infoga innehåll, kan read_html vara otillräckligt för att skrapa, och en mer robust skrapa som RSelenium kan vara nödvändig.

Använda rvest när inloggning krävs

Jag har vanliga problem när jag skrotar en webb är hur man skriver in ett användarid och lösenord för att logga in på en webbplats.

I det här exemplet som jag skapade för att spåra mina svar publicerade här för att stapla överflödet. Det övergripande flödet är att logga in, gå till en webbsida samla in information, lägga till det en dataframe och sedan gå till nästa sida.

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)

I detta fall är slingan begränsad till endast 5 sidor, detta måste ändras för att passa din ansökan. Jag bytte ut användarspecifika värden med ******, förhoppningsvis kommer detta att ge lite vägledning för ditt problem.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow