Utiliser R pour le SEO : Guide de survie

U
Formation Data SEO Labs

Si vous avez déjà entendu parler du langage R et que vous prenez les SEO qui l’utilisent pour des extraterrestres, vous n’avez pas tout à fait tort.

Initialement destiné aux data scientists et aux statisticiens, le langage R a depuis quelques années atterri chez des publics insoupçonnés, et la raison est simple :

Automatiser des actions, récupérer des données via des API et les agréger, scraper des pages web, croiser plusieurs fichiers (de mots-clés par exemple) ou encore faire du text mining et des analyses sémantiques, les possibilités qu’offrent le R et ses nombreux packages pour le SEO sont nombreuses.

Cependant, entendons-nous bien :

R ne vous fera pas devenir premier sur Google !

R n’est pas non plus un secret SEO !

Ce que je sais par contre, après plusieurs mois d’utilisation, c’est que R révolutionne l’approche SEO en apportant de nouvelles idées et méthodes de travail.

Si vous avez déjà rêvé de créer vos propres outils SEO, ou de passer du traditionnel SEO empirique à une approche pilotée par les données, vous êtes en passe de devenir vous aussi un extraterRestre.

Commencer avec R

Fraichement débarqué dans l’entreprise OVH, Vincent Terrasi, qui fait partie des pionniers de la « Data SEO« , a donné à l’équipe SEO une formation éclair au langage R. J’ai pour ma part commencé le R à partir de 0, et décidé d’approfondir avec une formation généraliste en ligne sur le célèbre site de formation en ligne Coursera.org, depuis le début d’année 2017.

La formation Data Science de la Johns Hopkins University inclue plusieurs modules et coûte 45€ / mois.

Je vous conseille principalement les cours suivants :
The Data Scientist’s Toolbox
R Programming
Getting and Cleaning Data

Après quelques semaines d’apprentissage à raison d’une heure par jour en moyenne, je suis aujourd’hui capable de gagner un temps considérable dans mes projets SEO en créant mes premiers scripts.

De nombreuses tâches SEO manuelles, répétitives et souvent chronophages, sont progressivement remplacées par des scripts R.

Cette nouvelle façon de faire du SEO vous intéresse ? Vous trouverez ici tout ce dont vous avez besoin pour vous y mettre : des ressources, des lignes de commandes utiles (à utiliser comme un « cheat sheet R »), quelques scripts R que vous pourrez utiliser pour vos projets et des tutos R pour le SEO.


Une formation à R pour le SEO
Si vous souhaitez accélérer votre apprentissage de R et plus globalement des data sciences pour vos projets SEO, je vous invite à vous inscrire à la prochaine formation Data SEO Labs. Notez qu’aucune connaissance technique n’est nécessaire pour participer à la formation.

Où écrire le R ?

Commencez par :

r langage seo data science
Aperçu de l’interface de R Studio avec un script qui permet de récupérer des données de SEMrush

Une fois R Studio installé, vous pourrez tester directement les scripts R suivants dans la console (partie inférieure gauche) ou les copier-coller dans un nouveau script : File > New File > R Script

Fonctions de base

sessionInfo() #Afficher les infos sur l'environnement
??read #Afficher l'aide
getwd()   #Connaitre le répertoire de travail
setwd("/Users/remi/dossier/") #Spécifier un répertoire de travail
list.files()    #Voir le contenu du répertoire
dir.create("nomdudossier") #Créer un dossier dans le répertoire

Les packages R

R dispose de plein de packages (des « fonctionnalités » en plus à télécharger), dont vous trouverez la liste sur le site cran-r.

install.packages("nomdupackage") #Installer un package
install.packages(c("packageA", "packageB", "packageC"))#Installer plusieurs packages en une seule fois
if(!require(packageA)){install.packages("packageA")}#Installer un package si il n'est pas déjà installé

library("nomdupackage") #Appeler un package installé
?nomdupackage #Afficher la documentation du package
packageVersion("nomdupackage") #Connaitre la version d'un package

detach("package:dplyr", unload=TRUE)#Forcer la fermeture d'un package sans fermer R Studio

Voici quelques-uns des packages R que vous utiliserez le plus pour le SEO :

  • dplyr : Manipuler les données d’un dataframe (filtrer, trier, sélectionner, résumer, etc)
  • kwClustersR : Clusteriser une liste de mots-clés (mon 1er package !)
  • duplicateContentR : Calculer un score de similarité entre 2 pages pour détecter le duplicate content (mon 2ème package !)
  • text2vec : Extraire les n grams
  • eVenn : Créer des diagrammes de Venn (utile pour faire des audits sémantiques)
  • tm : Traiter les accents et les mots-creux
  • ggplot : Faire des graphes
  • shiny : Créer une application à partir de vos scripts
  • searchConsoleR : Utiliser l’API de Google Search Console
  • httr : Faire des requêtes GET, POST, PUT, DELETE
  • Rcurl : Également pour faire des requêtes, plus complet que httr
  • XML : Pour parser les pages web
  • jsonlite : Récupérer du json
  • googleAuthR : Pour gérer l’authentification aux APIs de Google
  • googleAnalyticsR : Travailler avec l’API de Google Analytics
  • searchConsoleR : Télécharger des données Search Console dans R
  • urltools : Effectuer des traitements dans les URLs

Traiter des gros volumes de données

L’utilisation de données est systématique dans tout projet SEO : qu’il soit question de données issues de Screaming Frog, SEMrush, Search Console, de votre outil de Web Analyse ou autre. Elles peuvent provenir des API directement, ou d’exports réalisés à la main.

Vous trouverez dans les parties suivantes des astuces pour traiter ces datasets (traduction littérale de « jeux de données »).

Ouvrir et enregistrer un dataset

mondataframe <- data.frame() #Créer un dataframe (permet de mixer des données numériques et des données texte)
merge <- data.frame(df1, df2) #Mixer 2 dataframes

#Ouvrir un TXT
Fichier_txt <- read.table("nomdufichier.txt",header=FALSE, col.names = c("nomcolonne1", "nomcolonne2", "nomcolonne3"))
#Ouvrir un XLS
library(readxl)
Fichier_xls <- read_excel("cohorte.xls", sheet = 1, col_names = FALSE, col_types = NULL, skip = 1)
#Ouvrir un CSV
Fichier_csv <- read.csv2("df.csv", header = TRUE, sep=";", stringsAsFactors = FALSE)

#Sauvegarder votre dataset
write.csv() #créer un csv
write.table() #créer un txt

#Changer les intitulés des colonnes
cnames <- c("keywords", "searchvolume", "competition", "CPC") #on défini des noms pour les 4 colonnes du dataframe
> colnames(mydataset) <- cnames #on attribue les noms des colonnes au dataframe

Mieux connaitre son dataset

object.size(dataset) #Combien d'espace occupe l'objet en bytes

head(dataset) #Voir les premières lignes
tail(dataset) #Voir les dernières lignes

colnames(dataset) #Connaitre le nom des colonnes
apply(dataset, 2, function(x) length(unique(x))) #Savoir combien il y a de valeurs différentes dans chaque colonne du dataset

summary(dataset) #Avoir un résumé de chaque colonne du dataset (valeur minimum, médiane, moyenne, maximum, etc)
summary(dataset$colonne) #Même chose pour une colonne en particulier
dim(dataset) #Dimensions du dataset (nombre de colonnes et de lignes)
str(dataset) #Plus complet que dim() : Dimensions du dataset + Type de données dans chaque colonne

which(dataset$Colonne == "seo") #Chercher les lignes de la colonne "Colonne" qui contiennent la valeur "seo"

Zoom sur le package DPLYR

DPLYR est LE package qu’il faut impérativement connaitre. Grâce à lui vous allez pouvoir effectuer de nombreux traitements dans vos fichiers : sélection, filtre, tri, classement, etc.

library("dplyr")

#Sélectionner des colonnes et des lignes
select(df,colA,colB)  #Sélectionner colA et colB dans le dataset df
select(df, colA:colG) #Sélectionner de colA à colG
select(df, -colD)  #Supprimer la colonne colD
select(df, -(colC:colH))  #Supprimer une suite de colonnes
slice(df, 18:23)  #Sélectionner des lignes 18 à 23

#Créer un filtre
filter(df, country=="FR" & page=="home")  #Filtrer les lignes qui contiennent FR (colonne country) et home (colonne page)
filter(df, country=="US" | country=="IN") #filtrer de ligne dont le pays est US ou IN
filter(df, size>100500, r_os=="linux-gnu")
filter(cran, !is.na(r_version)) #filtrer les lignes de la colonne r_version qui ne sont pas vides

#Classer et trier
arrange(keywordDF, volume) #classer le dataset en fonction des valeurs de la colonne volume (classement ascendant)
arrange(keywordDF, desc(volume)) #classer le dataset dans l'ordre descendant
arrange(keywordDF, concurrece, volume) #trier les données selon plusieurs variables (plusieurs colonnes)
arrange(keywordDF, concurrece, desc(volumes), prixAdwords)

D’autres traitements à connaitre

Les lignes suivantes sont des commandes que j’utilise très souvent pour faire des opérations dans des datasets volumineux de mots-clés, notamment issues de SEMrush, Ranxplorer ou encore des exports Screaming Frog.

Ces opérations me permettent d’accélérer mes recherches d’opportunités SEO. Il s’agit par exemple de classer les mots-clés en thématiques, dé-dupliquer les mots-clés après avoir fait un merge de plusieurs listes, supprimer les cellules vides et diviser mon datasets en plusieurs petit datasets correspondant chacun à une sous-thématique à exploiter.

Concernant les export Screaming Frog, vous trouverez ici des commandes pour y compter des éléments comme le nombre d’URL crawlées, le nombre de cellules vides dans une colonne et le nombre d’URL pour chaque status code.

#Convertir une colonne au format numérique
keywords$Volume <- as.numeric(as.character(keywords$Volume))

#Ajouter une colonne avec une valeur par défaut
keywordDF$nouvellecolonne <- 1 #créer une nouvelle colonne avec la valeur 1

#Ajouter une colonne dont la valeur est basée sur une opération
mutate(keywordDF, TraficEstime = keywordDF$CTRranking * keywordDF$volume) #créer une nouvelle colonne (TraficEstime) basée sur 2 autres (CTRranking et volume)
mutate(keywordDF, volumereel = volume / 2)

#Ajouter une colonne dont la valeur est basée sur des conditions
Fichier_xls$nouvellecolonne <- 1 #On commence par créer une colonne avec une valeur par défaut
Fichier_xls$nouvellecolonne[which(Fichier_xls$`Size (Bytes)` <= 200000 & Fichier_xls$`Status Code` >= 301)] <- "super" #On assigne la valeur "super" selon les conditions

#Afficher les valeurs différentes
Ici on affiche les thématiques différentes d'un dataset de mots-clés
unique(keywords$thematics)
#On peut aussi voir les champs uniques à l'échelle d'un dataset complet
(= voir les valeurs uniques de chacune des colonnes du dataset)
sapply(dataset, FUN = unique)

#Compter le nombre de valeurs différentes dans une colonne
#ici on calcule le nombre d'URL crawlées par Screaming Frog
length(unique(Fichier_xls$Source))
#Compter le nombre de cellules vides dans une colonne
#ici on calcule combien il y a de balises alt non-remplies
sum(is.na(Fichier_xls$`Alt Text`))
#Compter le nombre d'éléments avec la même valeur
Par exemple le nombre d'URL par status code (200, 301, 302, 404, 500, etc)
table(Fichier_xls$`Status Code`)

#Moyenne des éléments d'une colonne
Ici on calcule par exemple le poids moyen des pages d'un site
mean(Fichier_xls$`Size (Bytes)`)
#Faire le même calcul pour plusieurs valeurs d'une colonnes
#On aura ici le poids moyen par type de fichier (HREF, CSS, JS, IMG)
tapply(Fichier_xls$`Size (Bytes)`, Fichier_xls$Type, mean)

#Découper un dataset en plusieurs datasets
#Très utile pour diviser une liste de mots-clés par thématiques
split(keywords, keywords$Thematique)

Scraper et Extraction de contenu

La création d’un crawler est très utile pour récupérer rapidement des éléments précis d’une page. Cela vous servira par exemple à suivre les évolutions d’un site concurrent : sa stratégie de prix, ses mises à jour de contenus, etc.

Scraper du XML

Avec le script suivant, vous pourrez télécharger un fichier XML, le parser et récupérer certaines variables qui vous intéressent. Vous verrez aussi comment le convertir en un dataframe.

#1. Charger les packages
library(RCurl)
library(XML)

#2. Récupérer le code source
url <- "https://www.w3schools.com/xml/simple.xml"
xml <- getURL(url,followlocation = TRUE, ssl.verifypeer = FALSE)

#3. Mettre en forme le code et récupérer le noeud XML racine
doc <- xmlParse(xml)
rootNode <- xmlRoot(doc)

#3.1 Enregistrer le code source dans un fichier html afin de le voir en entier
capture.output(doc, file="file.html")

#4. Récupérer des éléments de la page
xmlName(rootNode) #Le nom du XML (1er nœud)
rootNode[[1]] #Tout le contenu du premier nœud
rootNode[[2]][[1]] #Le 1er élément du 1er nœud
xmlSApply(rootNode, xmlValue) #Enlever les balises
xpathSApply(rootNode,"//name",xmlValue) #Certains nœud avec xPath
xpathSApply(rootNode,"/breakfast_menu//food[calories=900]",xmlValue) #Filter des nœuds XML par valeur (ici les recettes avec 900 calories)

#5. Créer un data frame ou une liste
menusample <- xmlToDataFrame(doc)
menusample <- xmlToList(doc)

Scraper du HTML

Récupérer des liens dans une page, récupérer une liste d’articles, voilà quelques exemples de ce vous pourrez faire avec le script suivant.

#1. Charger les packages
library(httr)
library(XML)

#2. Récupérer le code source
url <- "https://remibacha.com"
request <- GET(url)
doc <- htmlParse(request, asText = TRUE)

#3. Récupérer le title et compter le nombre de caractères
PageTitle <- xpathSApply(doc, "//title", xmlValue)
nchar(PageTitle)

#4. Récupérer les noms des articles
PostTitles <- data.frame(xpathSApply(doc, "//h2[@class='entry-title h1']", xmlValue))
PostTitles <- data.frame(xpathSApply(doc, "//h2", xmlValue))

#5. Récupérer tous les liens de la page et en faire une liste
hrefs <- xpathSApply(doc, "//div/a", xmlGetAttr, 'href')
hrefs <- data.frame(matrix(unlist(hrefs), byrow=T))

#6. Récupérer les liens du menu
liensmenu <- xpathSApply(doc, "//ul[@id='menu-menu']//a", xmlGetAttr, 'href')
liensmenu <- data.frame(matrix(unlist(liensmenu), byrow=T))

#7. Récupérer le status code et le header
status_code(request)
header <- headers(request)
header <- data.frame(matrix(unlist(header), byrow=T))

Scraper du JSON

#1. Charger le package
library(jsonlite)

#2. Récupérer le JSON
jsonData <- fromJSON("https://api.github.com/users/jtleek/repos")

#3. Récupérer les noms de tous les nœuds
names(jsonData)

#4. Récupérer les noms de tous les nœuds dans le nœud "owner"
names(jsonData$owner)

#5. Récupérer les valeurs dans le nœud login
jsonData$owner$login

Télécharger un fichier sur le web

#1. Définir le répertoire de travail
setwd("~/Documents/R")

#2. Spécifier l'URL
fileURL<- "https://url_du_fichier_a_telecharger"

#3. Télécharger le fichier (curl permet de télécharger un fichier en https)
download.file(fileURL, destfile = "~/Documents/R/nom_du_fichier.csv", method = "curl")

#4. Vérifier que le fichier a bien été téléchargé
list.files()

#5. Garder une trace de la date du téléchargement
dateDownloaded <- date()

J’espère que ces quelques exemples d’utilisation de R pour vos traitements de fichiers SEO vous auront donné envie d’aller plus loin !

N’hésitez pas à garder cet article dans vos favoris et à le partager sur vos réseaux sociaux pour l’avoir sous le coude quand vous aurez besoin d’anti-sèches pour créer vos scripts.

Comme sur Skyrock à la fin du freestyle, je voudrais maintenant lâcher quelques plates dédicaces aux aficionados de data qui m’ont appris R ou donné envie de m’y mettre grâce à leurs idées.

Les meilleurs tuto SEO avec R

Vous trouverez ci-dessous des tutos très complets que je vous invite à tester :

Améliorer vos données Google Analytics avec R et Shiny par Vincent Terrasi. Voir l’article

Gérer le maillage interne sémantique avec R par Vincent Terrasi. Voir l’article

Créer un moteur de recommandation de contenus avec R et GTM par Vincent Terrasi. Voir l’article

Google Analytics R Tutorial par Ryan Praski. Voir l’article

R Heatmap Tutorial for Google Analytics par Ryan Praski. Voir l’article

Conversion Attribution: a Markov model (using Google Analytics and the R ChannelAttribution package) par Jules Stuifbergen. Voir l’article

SEO keyword research using searchConsoleR and googleAnalyticsR par Mark Edmondson. Voir l’article

Identifier les mots clés à optimiser avec R par Grégory Florin. Voir l’article

Text mining et nuage de mots avec le logiciel R : 5 étapes simples à savoir par STHDA. Voir l’article

A propos de l'auteur

Rémi Bacha

Passionné de SEO et Data Science. Cofondateur des formations Data SEO Labs.

9 Commentaires

  • Merci pour l’article et les astuces Remi 😉
    Pour les install perso, je profite d’ajouter un dependencies = TRUE, qui permet d’installer le package et les packages liés.

    Exemple pour « dplyr » :
    install.packages("dplyr", dependencies = TRUE)

    Sinon pour vérifier que les packages sont à jour, au début j’utilisais update.packages(), mais ça devient long parfois, donc maintenant j’ai un fichier par typo de package (exemple SEO) et je relance la listes avec install.packages("{nom du package}", dependencies = TRUE)

    Autre package que je recommande : stringi (dispo sur CRAN ou https://github.com/Rexamine/stringi) qui permet de récupérer des données et de les extraires dans une chaîne de caractères :
    stri_sub("abcde",1,3)
    [1] "abc"
    stri_sub("abcde",1,1)
    [1] "a"
    stri_sub("abcde",-3,-1)
    [1] "cde"

    Top tes sources et tuto, merci 🙂

    • Hello Arthur,

      merci pour ton retour et ces supers astuces (je ne connaissais pas dependencies = TRUE ;-)) !
      Tu utilises aussi R dans tes projets SEO ?

      • Je l’ai découvert en faisant quelques recherches pour aller « plus vite » dans les mises à jour.
        Sur certains projets SEO oui et Analytics pour agréger des données « de manière automatique »

  • Hello Rémi,
    pour le scrap html, il est aussi possible de passer Rvest, qui est plus simple et plus facile à traiter si l’on souhaite extraire qu’un morceau du code (via attribut CSS, Xpath ou Nthchild.

    En tout cas, super base pour commencer R

Articles récents

Rémi Bacha

Passionné de SEO et Data Science. Cofondateur des formations Data SEO Labs.

Restons en contact

RDV sur les réseaux sociaux pour discuter et être informé de mes prochains articles :