R Language
Web grattage et analyse
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
pourxml2::read_html
le code HTML d'une page Web, - qui peut ensuite être sous-ensemble avec ses fonctions
html_node
ethtml_nodes
utilisant des sélecteurs CSS ou XPath, et - analysé en objets R avec des fonctions telles que
html_text
ethtml_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.