library(RSelenium)
#Open a firefox driver
<- rsDriver(browser = "firefox")
rD <- rD[["client"]] remDr
Aujourd’hui, je vais vous montrer comment récupérer les prix des produits sur le site Aliexpress.
Quelques mots sur le web scraping
Avant de plonger dans le sujet, vous devez savoir que le web scraping n’est pas autorisé sur certains sites web. Pour savoir si cela s’applique au site que vous souhaitez scraper, je vous invite à vérifier la page robots.txt qui devrait se trouver à la racine de l’adresse du site. Pour Aliexpress, cette page se trouve ici : www.aliexpress.com/robots.txt.
Cette page indique que le web scraping et le crawling ne sont pas autorisés sur plusieurs catégories de pages telles que /bin/*
, /search/*
, /wholesale*
par exemple. Heureusement pour nous, la catégorie /item/*
, où les pages des produits sont stockées, peut être scrappée.
RSelenium
Installation pour Ubuntu 18.04 LTS
L’installation de RSelenium n’a pas été aussi simple que prévu et j’ai rencontré deux erreurs.
La première erreur que j’ai obtenue après avoir installé le package et essayé la fonction Rsdriver était :
Error in curl::curl_fetch_disk(url, x$path, handle = handle) :
Unrecognized content encoding type. libcurl understands deflate, gzip content encodings.
Grâce à ce post, j’ai installé le package manquant : stringi.
Une fois cette erreur corrigée, j’en ai rencontré une autre :
Error: Invalid or corrupt jarfile /home/aurelien/.local/share/binman_seleniumserver/generic/4.0.0-alpha-2/selenium-server-standalone-4.0.0-alpha-2.jar
Cette fois-ci, le problème venait d’un fichier corrompu. Grâce à ce post, j’ai su que je devais simplement télécharger ce fichier selenium-server-standalone-4.0.0-alpha-2.jar depuis le site officiel de Selenium et remplacer le fichier corrompu par celui-ci.
J’espère que cela aidera certains d’entre vous à installer RSelenium sur Ubuntu 18.04 LTS !
Connexion à Aliexpress
La première étape pour récupérer les prix des produits sur Aliexpress est de se connecter à son compte :
<- "Your_mail_adress"
log_id <- "Your_password"
password
# Navigate to aliexpress login page
$navigate("https://login.aliexpress.com/")
remDr
# Fill the form with mail address
$findElement(using = "id", "fm-login-id")$sendKeysToElement(list(log_id))
remDr
# Fill the form with password
$findElement(using = 'id', "fm-login-password")$sendKeysToElement(list(password))
remDr
#Submit the login form by clicking Submit button
$findElement("class", "fm-button")$clickElement() remDr
Version Phantomjs
Si vous exécutez le code ci-dessus, vous devriez voir un navigateur Firefox s’ouvrir et naviguer à travers la liste que vous avez fournie. Dans le cas où vous ne souhaitez pas une fenêtre active, vous pouvez remplacer Firefox par le navigateur phantomjs, qui est un navigateur sans interface graphique (headless).
Je ne sais pas pourquoi, mais l’utilisation de rsDriver(browser = "phantomjs")
ne fonctionne pas pour moi. J’ai trouvé cet article qui propose de démarrer le navigateur phantomjs avec le package wdman :
library(wdman)
library(RSelenium)
# start phantomjs instance
<- wdman::phantomjs(port = 4680L)
rPJS
# is it alive?
$process$is_alive()
rPJS
#connect selenium to it?
<- RSelenium::remoteDriver(browserName="phantomjs", port=4680L)
remDr
# open a browser
$open()
remDr
$navigate("http://www.google.com/")
remDr
# Screenshot of the headless browser to check if everything is working
$screenshot(display = TRUE)
remDr
# Don't forget to close the browser when you are finished !
$close() remDr
Conclusion
Une fois que l’on comprend les bases de RSelenium et comment sélectionner des éléments dans des pages HTML, c’est assez facile d’écrire un script pour extraire des données sur le web. Cet article est un exemple simple d’extraction du prix des produits sur les pages Aliexpress, mais le script peut être étendu pour extraire plus de données sur chaque page, telles que le nom de l’article, sa note, etc. Il est même possible d’automatiser ce script pour qu’il s’exécute quotidiennement afin de suivre l’évolution des prix au fil du temps. Les possibilités sont infinies !