SEO & Référencement

Tutoriel : Auditer votre SEO technique en 10 étapes

13 min de lecture

Pourquoi auditer techniquement ?

L’audit technique vérifie ce que Google voit réellement de votre site : HTTPS, sitemap, canonical, structured data, mobile-friendly, performance. Sans audit régulier, des erreurs silencieuses (canonical pointant à côté, liens rompus en cascade, JS qui bloque l’indexation) érodent votre SEO sans alerte.

Ce que vous saurez faire

  1. Audit SEO technique en 10 étapes
  2. Crawl avec Screaming Frog
  3. Core Web Vitals et mobile
  4. Checklist de livraison

Vue d’ensemble 1 — HTTPS + HSTS

curl -sI https://example.sn | grep -iE '^(strict-transport-security|content-security-policy)'
# strict-transport-security: max-age=31536000; includeSubDomains; preload

openssl s_client -connect example.sn:443 -showcerts < /dev/null 2>/dev/null \
  | openssl x509 -noout -dates -subject -issuer

Vue d’ensemble 2 — robots.txt

curl https://example.sn/robots.txt
# Vérifier:
# - Pas Disallow: / involontaire
# - Sitemap déclaré
# - Aucun CSS/JS bloqué (Google en a besoin)

Vue d’ensemble 3 — Sitemap XML

curl -s https://example.sn/sitemap.xml | grep -c '<loc>'
curl -s https://example.sn/sitemap.xml | xmllint --schema sitemap.xsd - --noout

# Chaque URL: 200, pas noindex, canonical

Vue d’ensemble 4 — Canonical

import requests
from bs4 import BeautifulSoup

for url in urls:
    h = requests.get(url).text
    soup = BeautifulSoup(h, "html.parser")
    canonical = soup.find("link", rel="canonical")
    if not canonical:
        print("MANQUE:", url)
    elif canonical.get("href") != url:
        print("DIVERGENCE:", url, "→", canonical.get("href"))

Vue d’ensemble 5 — hreflang multilingue

<link rel="alternate" hreflang="fr-sn" href="https://example.sn/" />
<link rel="alternate" hreflang="en" href="https://example.sn/en/" />
<link rel="alternate" hreflang="x-default" href="https://example.sn/" />

Vue d’ensemble 6 — Core Web Vitals

npx lighthouse https://example.sn --only-categories=performance --output=json --output-path=report.json
jq '.audits | to_entries[] | select(.value.score < 0.9) | {id: .key, score: .value.score}' report.json

# Cibles: LCP < 2.5s, INP < 200ms, CLS < 0.1

Vue d’ensemble 7 — Mobile-friendly

<meta name="viewport" content="width=device-width, initial-scale=1">
body { font-size: 16px; line-height: 1.5; }
button, a.btn { min-height: 48px; min-width: 48px; padding: 12px 20px; }
img, video { max-width: 100%; height: auto; }

Vue d’ensemble 8 — Données structurées

curl -s https://example.sn/ | grep -A200 'application/ld+json' | head -100

# Test officiel: https://search.google.com/test/rich-results

Vue d’ensemble 9 — Maillage interne

import requests
from bs4 import BeautifulSoup
from collections import defaultdict

urls = open("urls.txt").read().splitlines()
inbound = defaultdict(int)

for u in urls:
    h = requests.get(u).text
    soup = BeautifulSoup(h, "html.parser")
    for a in soup.find_all("a", href=True):
        if a["href"].startswith("https://example.sn"):
            inbound[a["href"]] += 1

# Orphelines (< 2 liens entrants)
orphelines = [url for url in urls if inbound[url] < 2]
print("Orphelines:", orphelines)

Vue d’ensemble 10 — Erreurs crawl Googlebot

grep -E '"Mozilla.*Googlebot"' /var/log/nginx/access.log \
  | awk '{print $9, $7}' \
  | sort | uniq -c | sort -rn | head -20

# Cibler 4xx/5xx en priorité

Vue d’ensemble 11 — Crawler maison Python

import requests, re
from urllib.parse import urljoin, urlparse
from collections import deque

def crawl(start, max_pages=500):
    visited, queue = set(), deque([start])
    host = urlparse(start).netloc
    results = []
    while queue and len(visited) < max_pages:
        url = queue.popleft()
        if url in visited: continue
        visited.add(url)
        try:
            r = requests.get(url, timeout=10)
            title = re.search(r'<title[^>]*>([^<]+)</title>', r.text, re.I)
            results.append({
                "url": url, "status": r.status_code,
                "title": title.group(1).strip() if title else "",
                "size": len(r.content),
            })
            for href in re.findall(r'href="([^"]+)"', r.text):
                u = urljoin(url, href).split("#")[0]
                if urlparse(u).netloc == host and u not in visited:
                    queue.append(u)
        except: pass
    return results

Vue d’ensemble 12 — Screaming Frog

screamingfrog.co.uk (gratuit <= 500 URLs)

Rapports:
- Tous titles & meta descriptions
- Erreurs 4xx / 5xx
- Redirections et chaînes
- Images sans alt
- Liens rompus
- Temps de réponse par URL

Checklist finale

✓ Titles uniques 30-60 car
✓ Meta descriptions 120-160 car
✓ 1 H1 par page
✓ Alt 100% images
✓ 5+ liens internes par page importante
✓ Sitemap à jour avec lastmod
✓ Pas chaîne redirect > 1 saut
✓ Structured data sans erreur
✓ Mobile-friendly 100%
✓ CWV vert sur 75% URLs

Sur le même thème

L’audit SEO technique, fondation oubliee du referencement

Aux Almadies, une PME de e-learning a investi 2 millions de FCFA en redaction d’articles sans jamais voir grimper son trafic organique. Le diagnostic technique a revele un robots.txt qui bloquait /wp-content/, des redirections en cascade et un Largest Contentful Paint a 7,2 secondes. Avant tout effort de contenu, l’audit technique est le passage oblige : il identifie les freins structurels qui empechent Googlebot de crawler, indexer et restituer correctement votre site.

Cet audit se decompose en 10 etapes ordonnees, du plus bloquant au plus fin. Chacune produit une liste de correctifs concrets, mesurables, avec les outils Lighthouse, Search Console, Screaming Frog et PageSpeed Insights.

Etape 1 : Verifier l’accessibilite via robots.txt

Le fichier robots.txt est le premier filtre lu par les robots. Une seule directive Disallow mal placee peut effacer un site entier de l’index. Ouvrez https://votresite.sn/robots.txt et inspectez chaque ligne. Cherchez les patterns dangereux : Disallow: / qui bloque tout, Disallow: /wp-content/ qui empeche le rendu CSS et JS, ou User-agent: Googlebot suivi d’un Disallow restrictif.

User-agent: *
Allow: /
Disallow: /wp-admin/
Allow: /wp-admin/admin-ajax.php
Sitemap: https://votresite.sn/sitemap_index.xml

Apres correction, utilisez l’outil Tester le robots.txt dans Search Console (menu Anciens outils). Saisissez quelques URLs critiques et confirmez qu’elles sont autorisees. Une autorisation explicite sur admin-ajax.php evite les warnings de rendu.

Etape 2 : Auditer la couverture d’indexation dans Search Console

Search Console > Pages affiche le rapport de couverture. Quatre categories existent : Indexee, Indexee malgre blocage, Non indexee, et Avec avertissements. Concentrez-vous sur Pages non indexees, qui se subdivise en Decouverte non indexee, Exploree non indexee, Page avec redirection, Bloquee par robots.txt, Erreur 404, Soft 404 et Dupliquee canonique non choisie.

Pour chaque categorie, cliquez et exportez les exemples. Une categorie Decouverte non indexee qui depasse 30 % du total signale souvent un manque de signaux de qualite : peu de liens entrants, contenu mince, ou architecture trop plate. Les pages en Erreur 404 doivent soit etre redirigees en 301, soit acceptees comme telles via une suppression d’URL.

Etape 3 : Tester l’experience mobile et le rendu

Google indexe en mobile-first depuis 2021. Lancez le Test des resultats enrichis sur search.google.com/test/rich-results, saisissez une URL representative, et examinez la capture d’ecran rendue. Si vos titres apparaissent rognes, si les CTA debordent, ou si la navigation est inutilisable au pouce, vous avez identifie une priorite immediate.

Le Mobile-Friendly Test, retire en decembre 2023, a ete remplace par le rapport Experience sur la page de Search Console et par les audits Lighthouse en mode mobile. Visez un score Mobile au-dessus de 90/100, sans erreurs de viewport ni de tap targets trop rapproches.

Etape 4 : Mesurer les Core Web Vitals avec Lighthouse

Les Core Web Vitals constituent un signal de classement officiel : Largest Contentful Paint sous 2,5 s, Interaction to Next Paint sous 200 ms, Cumulative Layout Shift sous 0,1. Ouvrez Chrome DevTools, onglet Lighthouse, mode Mobile, categorie Performance, et lancez le scan.

npm install -g lighthouse
lighthouse https://votresite.sn --preset=desktop --output=html --output-path=./audit.html

Le rapport HTML genere identifie precisement les ressources qui retardent le LCP : images sans dimensions, polices web bloquantes, scripts tiers synchrones. Chaque opportunite est chiffree en millisecondes economisables. Vous pouvez approfondir avec notre tutoriel dedie a l’optimisation de la vitesse de chargement.

Etape 5 : Crawler le site avec Screaming Frog ou Sitebulb

Un crawl complet revele les elements invisibles a l’oeil nu : titles dupliques, meta descriptions manquantes, balises H1 absentes ou multiples, images sans attribut alt, redirections en chaine. Screaming Frog SEO Spider crawle gratuitement jusqu’a 500 URLs ; au-dela, la licence annuelle vaut environ 200 GBP.

Lancez le crawl en User-agent Googlebot, activez le rendu JavaScript si votre site est en React ou Vue, puis exportez les onglets Page Titles, Meta Descriptions, H1, Images > Missing Alt Text. Triez par doublons et corrigez en priorite les pages a fort trafic potentiel.

Etape 6 : Verifier les balises canonicales

La balise <link rel= »canonical »> indique aux moteurs quelle version d’une page consolider. Une canonical incorrecte peut faire disparaitre une URL strategique de l’index. Dans Screaming Frog, ouvrez l’onglet Canonicals et filtrez sur Canonicalised, Self-referencing, et Missing.

Chaque page doit pointer vers elle-meme en canonical, sauf en cas de duplication intentionnelle (paginations, filtres, parametres). Les pages canonicalisees vers une autre URL doivent avoir une raison documentee : variante avec parametres, AMP, version imprimable.

Etape 7 : Auditer hreflang pour les sites multilingues

Si votre site cible plusieurs marches (Senegal, Cote d’Ivoire, Cameroun en francais ; ou versions anglaise et arabe), hreflang signale aux moteurs la correspondance entre versions. Une erreur hreflang frequente : une page FR-SN qui declare une alternative EN-US sans reciprocite cote anglais.

<link rel="alternate" hreflang="fr-sn" href="https://exemple.sn/page" />
<link rel="alternate" hreflang="fr-ci" href="https://exemple.ci/page" />
<link rel="alternate" hreflang="x-default" href="https://exemple.com/page" />

Search Console > Anciens outils > Ciblage international affiche les erreurs de reciprocite. La balise x-default est obligatoire pour la version par defaut.

Etape 8 : Inspecter les donnees structurees Schema.org

Les rich snippets (FAQ, HowTo, Article, Recipe, LocalBusiness) augmentent le taux de clic de 20 a 35 % en SERP. Validez vos schemas via search.google.com/test/rich-results. Saisissez une URL d’article, et le testeur affiche les schemas detectes plus les erreurs eventuelles.

Les erreurs frequentes : champ obligatoire manquant (datePublished, author), URL d’image cassee, ou schema HowTo sur du contenu non procedural. Sur WordPress, Rank Math et Yoast injectent automatiquement Article et BreadcrumbList ; les schemas HowTo et FAQ se configurent au niveau du bloc.

Etape 9 : Verifier le sitemap et les soumissions IndexNow

Le sitemap doit contenir uniquement des URLs canoniques en 200, sans noindex. Comparez le compteur Search Console (URLs decouvertes dans le sitemap) avec le nombre reel d’articles publies. Un ecart superieur a 10 % indique un probleme de generation. Notre guide sitemap XML couvre la configuration complete.

IndexNow accelere l’indexation : sur Bing en moyenne 24 a 48 heures, sur Google le signal est integre au planning de crawl mais sans garantie. Activez l’extension Rank Math IndexNow et verifiez dans les logs que les pings partent bien apres chaque publication.

Etape 10 : Mettre en place un monitoring continu

L’audit n’a de valeur que repete. Configurez un check mensuel avec Search Console, un crawl Screaming Frog trimestriel, et un suivi Lighthouse hebdomadaire via PageSpeed Insights API. Documentez chaque correctif dans un journal partage avec l’equipe technique.

Apres trois mois de cycle, le site doit afficher une reduction des erreurs de couverture, une amelioration des Core Web Vitals, et une augmentation des impressions dans Search Console. Ces 10 etapes constituent la grille de reference pour tout audit serieux, du blog perso a la plateforme e-commerce de 50 000 references.

Lighthouse CI : auditer chaque deploiement avant Dakar et Abidjan

Lighthouse Continuous Integration transforme l’audit ponctuel en garde-fou automatique. Au lieu de lancer Lighthouse a la main une fois par mois, vous integrez l’outil dans votre pipeline GitHub Actions ou GitLab CI et chaque pull request est notee sur cinq dimensions : performance, accessibilite, bonnes pratiques, SEO et PWA. Si la note baisse sous un seuil que vous fixez, le merge est bloque. C’est la meilleure facon d’eviter qu’un developpeur junior a Yopougon ou aux Almadies ne casse les Core Web Vitals en ajoutant un script tiers mal optimise.

L’installation est simple. Le package npm @lhci/cli s’installe en moins de 30 secondes et un fichier lighthouserc.json a la racine du projet declare les URL a auditer, les seuils, et l’endpoint de stockage des rapports. Pour un site WordPress hebergee chez Hostinger ou OVH, configurez 5 a 8 URL representatives : la page d’accueil, un article long, une categorie, une page de contact, et eventuellement un panier WooCommerce. Lighthouse CI execute trois passes par defaut et garde la mediane pour lisser les variations reseau, ce qui evite les faux positifs.

{
  "ci": {
    "collect": {
      "url": [
        "https://itskillscenter.io/",
        "https://itskillscenter.io/categorie/seo/",
        "https://itskillscenter.io/article-pilier/"
      ],
      "numberOfRuns": 3
    },
    "assert": {
      "assertions": {
        "categories:performance": ["error", {"minScore": 0.85}],
        "categories:seo": ["error", {"minScore": 0.95}],
        "first-contentful-paint": ["warn", {"maxNumericValue": 2000}]
      }
    }
  }
}

Le seuil performance a 0,85 est realiste pour un site WordPress mature avec Cloudflare et un theme optimise. Sur un theme bourre de page builders et de scripts tiers, vous tomberez sous 0,60 et il faudra arbitrer : retirer Elementor au profit de blocs Gutenberg natifs, alleger les sliders, ou differer le chargement des polices Google Fonts. Le seuil SEO a 0,95 est facile a tenir si Rank Math ou Yoast est correctement configure (meta description sur chaque page, balises H1 uniques, alt sur les images). Le first-contentful-paint sous 2 secondes oblige a optimiser le TTFB serveur, ce qui passe souvent par un upgrade vers un VPS a 8 EUR par mois (5 250 FCFA) plutot qu’un mutualise a 2 EUR (1 312 FCFA).

Search Console API et dashboard Looker Studio pour le suivi quotidien

La Search Console fournit gratuitement les donnees de performance organique : impressions, clics, position moyenne, CTR par requete et par page. L’interface web est correcte mais limitee a 1 000 lignes par export et a 16 mois d’historique. L’API Search Console leve ces limites et permet d’archiver les donnees en BigQuery ou en Google Sheets pour un suivi long terme. Pour un blog tech francophone qui vise les marches senegalais, ivoirien et beninois, c’est indispensable des que vous depassez 1 000 visites organiques par jour.

L’authentification passe par un compte de service Google Cloud, gratuit jusqu’a un certain quota d’appels API (100 requetes par seconde, 50 000 par jour). Vous creez un projet dans la console Google Cloud, activez la Search Console API, generez une cle JSON, et ajoutez l’email du compte de service comme utilisateur restreint sur la propriete Search Console. Ensuite un script Python ou Node.js de 50 lignes extrait les donnees quotidiennement.

from google.oauth2 import service_account
from googleapiclient.discovery import build

creds = service_account.Credentials.from_service_account_file(
    "key.json",
    scopes=["https://www.googleapis.com/auth/webmasters.readonly"]
)
service = build("searchconsole", "v1", credentials=creds)

request = {
    "startDate": "2026-04-01",
    "endDate": "2026-05-05",
    "dimensions": ["query", "page"],
    "rowLimit": 25000
}

response = service.searchanalytics().query(
    siteUrl="https://itskillscenter.io/",
    body=request
).execute()

La sortie est un JSON avec une ligne par couple requete-page, contenant clics, impressions, CTR et position. Stockez le resultat dans BigQuery (la facturation est de 0,02 USD par Go scanne, donc moins d’un dollar par mois pour un blog moyen) et connectez Looker Studio (anciennement Data Studio) en quelques clics. Looker Studio est gratuit et permet de creer un tableau de bord par categorie de contenu : evolution des positions sur les requetes Mixx by Yas, Wave, Orange Money, comparaison entre Senegal et Cote d’Ivoire via le filtre pays, etc.

Le piege classique sur Looker Studio est de tirer plusieurs millions de lignes a chaque chargement. Limitez les requetes BigQuery par des filtres date et par des extrats agreges, sinon les couts montent vite et le dashboard devient lent. Pour un dashboard mensuel pour la direction, une vue agregee par semaine suffit largement et reduit le volume scanne d’un facteur 50. Voir notre guide audit SEO pour les outils complementaires.

Service ITSkillsCenter

Application mobile Android et iOS

Création d'application mobile Android et iOS. À partir de 350 000 FCFA.

Démarrer mon projet
Publicité