Guide d’utilisation de la Google Search Console

Le métier de consultant SEO nécessite de posséder ou maîtriser de nombreux outils. Les outils les plus complets sont malheureusement les outils les plus chers. Il existe cependant quelques outils Google à destination des webmasters et des SEO. Je vais m’intéresser aujourd’hui à la Google Search Console (GSC) nommée par le passé Google Webmaster Toos (GWT). Cet outil étant un des seuls leviers de communication entre le propriétaire d’un site et Google ; il est important d’en comprendre son fonctionnement.

Comment exploiter les données de la Search Console comme un Pro ?

google-search-console

L’accès à l’information est gratuite, suffit de suivre les instructions Google https://www.google.com/webmasters/tools/home?hl=fr. Je ne souhaite pas passer en revue toutes les fonctionnalités, je vous laisse lire les dossiers existants sur Internet comme http://www.webrankinfo.com/dossiers/gwt. Je veux juste partager ma vision et mon mode de consommation des données de la Search Console. L’outil n’est pas toujours pertinent pour un petit site, mais devient une véritable pépite sur des gros sites.

En fonction de la taille du site, l’usage de la Search Console est totalement différent. Avec des données et un historique important l’outil devient pertinent.


Analyse de la recherche

Avec l’arrivée du « Not Provided » dans Google Analytics, la Search Console est désormais l’unique source crédible d’information pour analyser la performance de vos mots clés dans les pages de Google.
Sur une période limitées malheureusement aux 3 derniers mois, l’analyse de la recherche présente les performances du couple expressions / url au sein des SERPS. Il est ainsi possible d’avoir accès aux données d’impressions, clics, CTR, position moyenne de votre URL au sein de la page de résultat de Google.

Ce qu’il faut savoir avec l’analyse de recherche :

  • Les données sont limitées aux 5000 plus grosses requêtes par répertoire / compte Search Console
  • La position SEO affichée tient compte de la personnalisation et l’historique de recherche des internautes
  • La position SEO est calculée selon la moyenne des positions de toutes vos pages positionnées dans les résultats de Google
  • Il est impossible de connaitre le mode d’intégration de votre lien au sein de la page ; pas de différenciation entre un lien basique, un lien Google Images, un lien Google Actu … Encore moins de savoir si la page contient 0,n campagnes adwords.

Exploitation concrète des données de la Search Console

Ces données sont précieuses, mais méritent d’être historisées et retraitées pour devenir pleinement exploitables. En effet, les données affichées sont brutes, il est assez compliqué voir impossible de déterminer un plan d’amélioration continu à partir du tableau. Une récupération mensuelle via l’API Search Console et un petit traitement permet d’avoir des données exploitables dans une stratégie d’optimisation sémantique.

Il suffit de récupérer par exemple mensuelle les données relatives au coupl expression / URL pour obtenir un suivi de la progression des positions et du CTR dans les SERPS :

Il devient alors aisé de calculer la progression des actions menées par la SEO. Du fait de la saisonnalité sur certaines requêtes, nous pouvons parfois avoir des conclusions trompeuse si on se limite à regarder l’audience générée sur Google Analytics.

Exploitation et historisation des données de la Search Console

Evolution du CTR au sein de la Search Console

Evolution du CTR au sein de la Search Console


Analyse de la fragmentation mobile / desktop au sein d’une niche

Un autre usage de ces données consiste à différencier et analyser le positionnement du site et son écosystème mobile vs desktop.

Comparaison de la tendance de recherche mobile et desktop

Vue de la Search Console : performance SEO mobile versus desktop


Mot clés de contenu

Cette section semble anodine pour beaucoup de SEO, il s’agit pourtant de la représentation par Google du champs lexical de votre site. Vous avez ainsi accès au dictionnaire dédié à votre site.

mots clés de contenu - Google Search Console

Exemple Mots clés de contenu – Google Search Console

Dans l’exemple ci-contre, j’ai sélectionné une vue prise sur un site de recettes de cuisine. Au premier regard, le dictionnaire est cohérent avec la thématique du site, nous parlons en effet de ‘recettes’, ‘cuisine’, ‘gâteaux’, ‘chocolat’ …

Cette liste contient également des mots clés que je considère comme polluants pour le champs lexical ciblé : les expressions ‘facebook’, ‘partage’ sont sémantiquement trop valorisés. Il convient de réduire la visibilité de ces mots clés. En fonction de vos compétences, de votre typologie de page et message souhaité vous adopterez alors une stratégie compatible avec votre business pour éviter de diluer votre information.
Plusieurs solutions et implémentations sont possibles :

  • Supprimer le texte de la page
  • Vérifier si l’expression n’est pas présente dans le DOM via un composant en display:none
  • Remplacer les textes par des images
  • Obfusquer les lies liens
  • Faire une injection conditionnelle (loggé ou non, google ou non …)
  • Ajouter plus de contenu pertinent

Si vous avez fragmentez votre configuration de la Search Console par dossiers, le dictionnaire thématisé par répertoire prend alors tout son sens pour analyser la pertinence et la prise en compte d’un cocon par Google.


Erreurs d’exploration

Il est assez courant et logique d’avoir des erreurs sur son site Internet, il y a des aléas techniques, des redirections au fil du temps ou une non maîtrise des liens vers votre site. Tout cela conduit à des erreurs 404 ou 500 sur votre site.

Si vous avez les moyens et êtes suffisamment outillés, vous aurez un analyseur de logs qui permettra de remonter en temps réel la gestion des codes http. (Nous aborderons l’analyse des logs serveurs dans un prochain billet). Avoir trop de pages en erreur sur son site est considéré selon moi comme de la dette technique SEO qu’il est impératif de minimiser et réduire dans le temps. Unitairement, une visite qui arrive sur une page en erreur, aura tendance à faire fuir votre internaute. De façon plus globale, un nombre important de pages 500 (Internal Server Error) démontre des problématiques de stabilité de l’applicatif : il peut s’agir de problèmes d’hébergement, de développement, de failles de sécurités … Un nombre important de pages 404 (Not Found) constitue une perte d’efficience : soit le contenu a effectivement disparut ou migré et il faut dans ce cas proposer une alternative, soit le lien est erroné ou cassé et il est préférable de détecter le pattern ou l’origine du lien pour procéder a sa correction.

Dans tous les cas de figures, il faudra différencier les liens et pages sur lesquelles vous avez la main et corriger tous les liens qui ne dirigent pas vers une page en code 200. Il est primordial pour moi de faire la chasse aux liens en 3xx, 4xx et 5xx dans votre navigation interne. Pour les liens dont la source est externe, il faudra mettre en place des redirections 301 thématisées pour récupérer et transmettre les indices de popularité comme le PR ou TF.

Si vous travaillez un site {petit|moyen|nouveau} vous n’aurez certainement pas de problèmes à gérer les erreurs, mais si votre site à un historique de plus de 10 ans et plus de 100 000 pages, la gestion manuelle devient fastidieuse voir impossible car extrêmement chronophage. En lançant un crawler sur vos pages, vous allez détecter et pouvoir corriger les soucis de navigation interne actuellement en ligne mais vous n’aurez pas l’historique. Avec la Search Console, vous aurez accès en différé à l’historique des passages de GoogleBot. Dans l’interface ou en travaillant avec l’API, vous ne pourrez accéder qu’aux 1000 dernières pages en erreur classées par date de découverte. En procédant à un export CSV, vous aurez accès à l’intégralité des URLs en erreurs, ce qui est un bon point pour détecter les patterns de pages à fixer.

Gestion des erreurs dans le Search Console

Gestion des erreurs dans le Search Console

Pour être efficace et pertinent, il conviendra de marquer les URL en erreurs comme résolues, pour purger la liste. Si vous avez la chance de travailler sur un site dont les données de la Search Console n’ont pas été exploitée ou sont difficilement exploitables en raison d’une forte volumétrie, cette tâche de nettoyage de la GSC s’apparente comme une tâche insurmontable. Beaucoup vont procéder à la technique temporaire du RAZ des erreurs pour attendre les prochains updates avant d’engager des actions. Jusqu’au début de l’année 2016, c’était encore possible d’exécuter une tâche automatisée pour procéder au nettoyage, en passant par Zeno ou Selenium la mise en place était assez simple. Puis Google a décidé d’intégrer des Captchas …


Statistiques sur l’exploration

Cette vue est assez simple à comprendre et possède pourtant une mine d’information sur les aspects techniques et la santé de vos pages.

Temps de chargement des pages au passage de Google dans la Search Console

Temps de chargement des pages au passage de Google dans la Search Console

Un des premiers critères à regarder est le temps moyen de crawl: il doit être inférieur à 500 ms.
Et assez souvent dans mes discussions, j’ai découvert que les collègues SEO s’arrêtent à cette lecture.
Certains iront s’aventurer à calculer un ratio de crawl avec les données de ressources explorées et le nombres de pages indexées. Sur le principe je valide la démarche intellectuelle, mais cela se fait à partir de l’analyse de logs.

Enfin, par expérience, peu de SEO vont faire l’assossiation entre les pages explorées et la consommation de la bande passante. Si le courbe bleu et rouge suivent la même tendance cela implique la non implémentation des 304 au niveau des ressources URL.

Vue Search Console : Analyse des ressources explorées lors du crawl de Google

Vue Search Console : Analyse des ressources explorées lors du crawl de Google


Gestion des sitemaps

L’enregistrement des sitemaps dans la Search Console n’est pas un critère favorisant l’indexation ou le positionnement d’une page dans Google. C’est avant tout un outil de monitoring de l’indexation. En effet, si vous catégorisez bien vos pages : vous aurez des répertoires dédiés et pourrez générer des sitemaps dédiés. Vous pourrez très facilement analyser le ratio entre le nombre de pages existantes et le nombre de pages indexées.

Monitoring de l'indexation via les sitempas de la Search Console

Monitoring de l’indexation via les sitempas de la Search Console

S’il est possible de renseigner aux bots l’existence de vos sitemaps dans le robots.txt, je n’ai pas pris cette habitude dans l’unique but de ne pas simplifier la découverte de mes pages par la concurrence.

Utilisez les API de la Search Console

J’ai beaucoup parlé dans ce billet des fonctionnalités offertes par l’API de la Google Search Console, je me dois désormais de vous expliquer un peu son mode de fonctionnement et sa mise en oeuvre. Par affinité technique, et intégration à l’existant j’ai privilégié un développement en Java, il est cependant possible de décliner mon code en Python.

En premier lieu, il est nécessaire d’activer via un compte google l’API souhaitée et générer un couple login/email et clé P12 nécessaire à l’identification du webservice. Vous devrez ensuite ajouter dans la Search Console de votre site les privilèges nécessaires à cet email personnalisé. Selon moi, après cette étape, vous avez déjà réalisé le plus dur.

Il n’est reste désormais plus qu’à jouer avec l’API

Exemple de code d’identification à l’API Google Search Console en Java

protected final String EMAIL = "abcdefghijklmnopqrstuvwxyz@azertyui-1234.iam.gserviceaccount.com";

protected final String APPLICATION = « application_name »; protected final File P12 = new File(« key.p12 »); protected final Webmasters getWebmastersClientService() throws Exception { HttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance(); GoogleCredential credential = new GoogleCredential.Builder().setTransport(HTTP_TRANSPORT) .setJsonFactory(JSON_FACTORY).setServiceAccountId(EMAIL).setServiceAccountPrivateKeyFromP12File(P12) .setServiceAccountScopes(Collections.singletonList(WebmastersScopes.WEBMASTERS)).build(); return new Webmasters.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential).setApplicationName(APPLICATION).build(); }

Exemple de code de récupération des mots clés à l’API Google Search Console en Java

TODO

Exemple de code de récupération dernières pages en erreur et nettoyage de ces dernières à l’API Google Search Console en Java

En premier il est important de savoir quelles sont les possibilités, l’API n’étant peu typée car utilisant des String, j’ai crée pour la réutilisation des enum : (cf (plus d’infos https://developers.google.com/webmaster-tools/v3/urlcrawlerrorssamples)

public enum GSCAPICrawlErrorsCategory {
  authPermissions,
  flashContent,
  manyToOneRedirect,
  notFollowed,
  notFound,
  other,
  roboted,
  serverError,
  soft404;
}

public enum SearchConsoleAPICrawlPlateform {
  mobile,
  smartphoneOnly,
  web;
}

Récupérer la liste des URLs en erreur : (limité aux 1000 résultats dans l’interface)

Dans l’exemple ci-dessous, je parcours plusieurs répertoires à la recherche des pages en 404 (notFound) et 500 (serverError).

private List<UrlCrawlErrorsSample> getErrors(Webmasters service, String dossier, SearchConsoleAPICrawlErrorsCategory category, SearchConsoleAPICrawlPlateform plateform) throws IOException {
  return service.urlcrawlerrorssamples().list(dossier, category.toString(), plateform.toString()).execute().getUrlCrawlErrorSample();
}

Je check ensuite si le code retour de mon URL est toujours en 4xx ou 5xx. Si ma page retourne un code 200, on peut alors ‘marquer comme résolue’ notre URL pour nettoyer le listing des erreurs.

public void execute() throws Exception {
    Webmasters service = getWebmastersClientService();
    List<String> dossiers =  Lists.newArrayList("https://www.architecteseo.com", "https://www.architecteseo.com/blog");
    
    for (String dossier : dossiers){

      List<UrlCrawlErrorsSample> crawlNotfound = getErrors(service, dossier, GSCAPICrawlErrorsCategory.notFound, SearchConsoleAPICrawlPlateform.web);
      Collections.shuffle(crawlNotfound);
      System.err.println("-- Il existe " + crawlNotfound.size() + " pages 4xx dans le site : " + dossier);
      for (UrlCrawlErrorsSample error : crawlNotfound) {
        String pageUrl = error.getPageUrl();
        String mapage = dossier + "/" + pageUrl;
        if (still404(mapage)) {
          markAsFixed(service, pageUrl, dossier, GSCAPICrawlErrorsCategory.notFound, SearchConsoleAPICrawlPlateform.web);
        }
      }

      List<UrlCrawlErrorsSample> crawlErrors = getErrors(service, dossier, GSCAPICrawlErrorsCategory.serverError, SearchConsoleAPICrawlPlateform.web);
      Collections.shuffle(crawlErrors);
      System.err.println("-- Il existe " + crawlErrors.size() + " pages 5xx dans le site : " + dossier);
      for (UrlCrawlErrorsSample error : crawlErrors) {
        String pageUrl = error.getPageUrl();
        String mapage = dossier + "/" + pageUrl;
        if (!still500(mapage)) {
          markAsFixed(service, pageUrl, dossier, GSCAPICrawlErrorsCategory.serverError, SearchConsoleAPICrawlPlateform.web);
        }
      }
      
    }
  }

Tester le code de retour de l’URL donnée :

private boolean still404(String url) {
    try {
      URL u = new URL(url);
      HttpURLConnection conn = (HttpURLConnection) u.openConnection();
      conn.setRequestMethod("GET");
      conn.setConnectTimeout(3 * 60000);
      conn.setReadTimeout(3 * 60000);
      conn.connect();
      return (conn.getResponseCode() == 404);
    } catch (Exception ex) {
      System.out.println("Error: " + ex.getMessage() + " > " + url);
      return true;
    }
  }

Marquer une URL comme résolue :

private void markAsFixed(Webmasters service, String pageUrl, String dossier, SearchConsoleAPICrawlErrorsCategory category, SearchConsoleAPICrawlPlateform plateform) {
  try {
    service.urlcrawlerrorssamples().markAsFixed(dossier, pageUrl, category.toString(), plateform.toString()).execute();
    System.out.println("--- "+category.toString() + " > Marked as fixed : " + pageUrl + " appartenant au site : " + dossier);
  } catch (Exception e) {
    System.out.println("Error: " + e.getMessage());
  }
}

 

Ces fragments de code prennent alors une autre dimension lorsqu’ils sont schedulés et couplés avec les autres API Google Adwords / Google Analytics ou encore les données métiers de votre backoffice …