Recherche…


Remarques

Le raclage fait référence à l'utilisation d'un ordinateur pour récupérer le code d'une page Web. Une fois le code obtenu, il doit être analysé sous une forme utile pour une utilisation ultérieure dans R.

Base R ne possède pas beaucoup des outils requis pour ces processus, de sorte que l'analyse et l'analyse sont généralement effectuées avec des packages. Certains paquets sont particulièrement utiles pour le raclage ( RSelenium , httr , curl , RCurl ), d'autres pour l'analyse ( XML , xml2 ) et certains pour les deux ( rvest ).

Un processus connexe consiste à rechercher une API Web qui, contrairement à une page Web, renvoie des données destinées à être lisibles par une machine. Beaucoup des mêmes paquets sont utilisés pour les deux.

Légalité

Certains sites Web refusent d'être analysés, que ce soit en raison de charges de serveur accrues ou de problèmes de propriété de données. Si un site Web interdit de rayer les conditions d'utilisation, le rayer est illégal.

Raclage de base avec rvest

rvest est un package pour le web scraping et l'analyse par Hadley Wickham inspiré par Beautiful Soup de Python. Il exploite les xml2 libxml2 du package xml2 d'Hadley pour l'analyse HTML.

Dans le cadre de la tidyverse, rvest est canalisé . Il utilise

  • xml2::read_html pour xml2::read_html le code HTML d'une page Web,
  • qui peut ensuite être sous-ensemble avec ses fonctions html_node et html_nodes utilisant des sélecteurs CSS ou XPath, et
  • analysé en objets R avec des fonctions telles que html_text et html_table .

Pour gratter la table des jalons de la page Wikipedia sur R , le code ressemblerait à

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

Bien que ceci renvoie un data.frame, notez que, comme c'est généralement le cas pour les données grattées, il reste encore à nettoyer les données: ici, les dates de mise en forme, l'insertion de NA , etc.

Notez que les données dans un format rectangulaire moins cohérent peuvent nécessiter un bouclage ou une autre opération pour analyser avec succès. Si le site Web utilise jQuery ou d'autres moyens pour insérer du contenu, read_html peut être insuffisant pour le racler, et un racleur plus robuste comme RSelenium peut être nécessaire.

Utilisation de rvest lorsque la connexion est requise

Le problème le plus courant lors de la mise au rebut d’un site Web consiste à saisir un identifiant et un mot de passe pour se connecter à un site Web.

Dans cet exemple que j'ai créé pour suivre mes réponses affichées ici pour empiler les débordements. Le flux global consiste à se connecter, à accéder à une page Web pour collecter des informations, à ajouter un fichier de données, puis à passer à la page suivante.

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)

La boucle dans ce cas est limitée à 5 pages, cela doit changer pour s'adapter à votre application. J'ai remplacé les valeurs spécifiques à l'utilisateur par ******, en espérant que cela vous aidera à résoudre votre problème.



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow