Buscar..


Observaciones

El raspado se refiere al uso de una computadora para recuperar el código de una página web. Una vez que se obtiene el código, se debe analizar en una forma útil para su uso posterior en R.

Base R no tiene muchas de las herramientas requeridas para estos procesos, por lo que el raspado y el análisis generalmente se realizan con paquetes. Algunos paquetes son más útiles para raspar ( RSelenium , httr , curl , RCurl ), algunos para analizar ( XML , xml2 ) y algunos para ambos ( rvest ).

Un proceso relacionado es raspar una API web, que a diferencia de una página web devuelve datos destinados a ser legibles por una máquina. Muchos de los mismos paquetes se utilizan para ambos.

Legalidad

Algunos sitios web se oponen a ser rastreados, ya sea por el aumento de las cargas del servidor o por preocupaciones sobre la propiedad de los datos. Si un sitio web prohíbe raspar los Términos de uso, es ilegal.

Raspado basico con rvest

rvest es un paquete para raspado y análisis web de Hadley Wickham inspirado en Python's Beautiful Soup . Aprovecha los xml2 paquete libxml2 de libxml2 para el análisis de HTML.

Como parte del tidyverse, rvest se canaliza . Usa

  • xml2::read_html para raspar el HTML de una página web,
  • que luego puede ser subconjunto con sus funciones html_node y html_nodes utilizando los selectores CSS o XPath, y
  • analizó los objetos R con funciones como html_text y html_table .

Para raspar la tabla de hitos de la página de Wikipedia en R , el código se vería como

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

Si bien esto devuelve un data.frame, tenga en cuenta que, como es típico de los datos raspados, aún queda por hacer una limpieza adicional de los datos: aquí, fechas de formateo, inserción de NA , etc.

Tenga en cuenta que los datos en un formato rectangular menos consistente pueden tomar bucles u otros movimientos adicionales para analizar con éxito. Si el sitio web utiliza jQuery u otros medios para insertar contenido, read_html puede ser insuficiente para raspar, y puede ser necesario un raspador más robusto como RSelenium .

Uso de rvest cuando se requiere inicio de sesión

Un problema común que surge cuando se desecha un sitio web es cómo ingresar un ID de usuario y una contraseña para iniciar sesión en un sitio web.

En este ejemplo, que creé para rastrear mis respuestas publicadas aquí para apilar el desbordamiento. El flujo general es iniciar sesión, ir a una página web, recopilar información, agregar un marco de datos y luego pasar a la página siguiente.

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)

El bucle en este caso está limitado a solo 5 páginas, esto debe cambiar para adaptarse a su aplicación. Reemplacé los valores específicos del usuario con ******, espero que esto proporcione alguna guía para su problema.



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow