Scraping

Le coût d'un User-Agent obsolète : mesurer le décalage des versions de navigateur

Les scrapers codent souvent en dur une version de navigateur et l'oublient. Nous avons interrogé 397 sites majeurs en déclarant des versions de Chrome vieilles de jusqu'à 6,5 ans. Les refus ont augmenté chaque année.

Chris Collins

5 octobre 2026 · 9 min de lecture

Chaque scraper qui définit un en-tête User-Agent choisit une version de navigateur, et presque aucun ne la change jamais. La chaîne de caractères entre dans un fichier de configuration le jour où le projet démarre, et le projet continue de s’annoncer comme ce navigateur pendant des années. Pendant ce temps, les vrais navigateurs évoluent : Chrome a publié 13 versions majeures entre fin septembre 2025 et fin septembre 2026.

Ce décalage a-t-il de l’importance ? Les systèmes anti-bot savent quelles versions de navigateur les vrais visiteurs utilisent, donc une version que personne n’a utilisée depuis des années se démarque. Nous avons mesuré dans quelle proportion, en demandant les pages d’accueil de 397 sites majeurs tout en déclarant cinq versions différentes de Chrome, de la version actuelle à une version vieille de six ans et demi.

Points clés à retenir

  • Les versions déclarées plus anciennes ont été refusées plus souvent, systématiquement. 17,1% des pages d’accueil ont contesté ou bloqué la version actuelle de Chrome ; 19,9% ont refusé une version vieille d’un an et 22,7% une version vieille de six ans et demi.
  • L’effet n’allait que dans un seul sens. 22 sites qui servaient la version actuelle ont refusé la plus ancienne ; aucun site n’a refusé la version actuelle tout en servant une ancienne.
  • Deux requêtes identiques pour la version actuelle ont produit des résultats identiques sur les 397 sites, donc les différences observées ne sont pas du bruit.
  • Les sites protégés par Akamai ont réagi en premier : 9 des 11 sites qui ont refusé une version vieille d’à peine un an étaient protégés par Akamai. Les sites protégés par Cloudflare ne réagissaient pour la plupart qu’à la version la plus ancienne.
  • Maintenez la version à jour, assurez sa cohérence avec le reste de la requête, et vérifiez-la selon un calendrier régulier, comme vous le feriez pour toute dépendance.

Comment nous avons mesuré

Nous avons pris 400 sites au hasard parmi les pages d’accueil de notre précédente analyse de la pile anti-bot des 1 000 domaines les mieux classés dans le classement Tranco. Le 5 octobre 2026, nous avons demandé chaque page d’accueil six fois, à une seconde d’intervalle et dans un ordre aléatoire par site, avec une chaîne User-Agent Chrome Windows standard déclarant ces versions :

Version déclaréeVersion stable publiéeÂge au moment du test
Chrome 154, demandé deux fois22 septembre 2026Actuelle
Chrome 14130 septembre 2025Environ 1 an
Chrome 12917 septembre 2024Environ 2 ans
Chrome 1107 février 2023Environ 3,5 ans
Chrome 804 février 2020Environ 6,5 ans

La requête répétée pour la version actuelle sert de contrôle : si un site varie de lui-même, cela apparaît comme une différence entre ces deux requêtes. Toutes les requêtes provenaient du même client HTTP Python et de la même connexion ; seul le numéro de version dans le User-Agent changeait. Trois sites n’ont pas répondu à au moins une requête et ont été exclus, laissant 397 sites.

Ce que nous avons trouvé

Version déclaréeServiContestéBloquéContesté ou bloqué
Chrome 154, première requête329422617,1%
Chrome 154, répétition329422617,1%
Chrome 141318433619,9%
Chrome 129315433920,7%
Chrome 110314434020,9%
Chrome 80307523822,7%

Les deux requêtes pour la version actuelle concordaient sur chaque site sans exception, ce qui rend le reste du tableau facile à interpréter : chaque différence provient du numéro de version.

En ne comptant que les sites qui ont servi la version actuelle les deux fois, le nombre de sites ayant refusé la version plus ancienne augmentait régulièrement avec son âge :

Version déclaréeSites qui ont servi la version actuelle mais refusé celle-ci
Chrome 141, vieille d’1 an11
Chrome 129, vieille de 2 ans14
Chrome 110, vieille de 3,5 ans15
Chrome 80, vieille de 6,5 ans22

Aucun site n’a fait l’inverse. Une version obsolète n’a jamais aidé.

Qui réagit, et comment

Le croisement des sites avec la protection détectée dans l’analyse précédente montre que les fournisseurs ne fixent pas la limite au même endroit :

  • Un an suffisait pour Akamai. Sur les 11 sites qui ont refusé Chrome 141, 9 étaient protégés par Akamai ; les 11 ont répondu par un HTTP 403, et 10 d’entre eux étaient de simples blocages plutôt que des contestations.
  • Cloudflare réagissait à la version très ancienne. Sur les 22 sites qui ont refusé Chrome 80, 10 étaient protégés par Cloudflare et ont renvoyé une contestation ; 9 autres étaient protégés par Akamai.
  • Les pages informaient rarement le visiteur. Seuls deux sites ont affiché un message du type « mettez à jour votre navigateur » à Chrome 80 qu’ils n’affichaient pas à la version actuelle. La plupart se contentaient de refuser.

Ceci est cohérent avec le fonctionnement de la gestion des bots. Un vrai visiteur utilisant un navigateur vieux d’un an est peu courant, et un navigateur vieux de six ans, rare, de sorte qu’une version ancienne constitue à elle seule un signal faible, mais un signal plus fort combiné à tout autre élément inhabituel de la requête.

Le code

La fonction ci-dessous exécute la même comparaison sur n’importe quelle URL : elle demande la page en déclarant chaque version, dans un ordre aléatoire, et renvoie le statut, le résultat et la taille pour chacune, ainsi que si la page indique au visiteur que son navigateur est obsolète. Listez une version deux fois pour obtenir un contrôle de bruit.

import random
import re
import time

import requests

CHROME = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/{v}.0.0.0 Safari/537.36"
OUTDATED = re.compile(r"(browser (is|you are using is) (not supported|out of date|outdated|no longer supported)"
                      r"|update your browser|upgrade your browser|unsupported browser|outdated browser)", re.I)


def classify(response):
    """served, challenged or blocked, from the status and well-known challenge markers."""
    body = response.text[:20000].lower()
    if (response.headers.get("cf-mitigated", "").lower() == "challenge"
            or response.headers.get("x-amzn-waf-action", "").lower() == "challenge"
            or "captcha-delivery.com" in body):
        return "challenged"
    if response.status_code in (401, 403, 405, 429) or response.status_code >= 500:
        return "blocked"
    return "served"


def ua_drift_check(url, versions, pause=1.0, seed=None):
    """Request the same URL claiming each Chrome version, in random order, and compare what comes back.
    A version may be listed twice, as a control for how much the site varies on its own."""
    order = list(enumerate(versions))
    random.Random(seed).shuffle(order)
    results = [None] * len(versions)
    for i, v in order:
        headers = {"User-Agent": CHROME.format(v=v), "Accept": "text/html,*/*;q=0.8", "Accept-Language": "en-US,en;q=0.9"}
        try:
            r = requests.get(url, headers=headers, timeout=20)
            results[i] = {"version": v, "status": r.status_code, "outcome": classify(r), "bytes": len(r.content),
                          "outdated_notice": bool(OUTDATED.search(r.text))}
        except requests.RequestException as e:
            results[i] = {"version": v, "error": type(e).__name__}
        time.sleep(pause)
    return results

Exécutez-le sur les sites dont vous dépendez avant et après un changement de User-Agent, et conservez les résultats : si une cible commence à refuser la version que vous envoyez, vous saurez si la version en est la cause.

Limites de la mesure

  • Pages d’accueil, un seul réseau, un seul moment. Des pages plus profondes, d’autres pays et d’autres moments pourraient se comporter différemment.
  • Pas un navigateur. Notre client a envoyé un User-Agent Chrome depuis une bibliothèque HTTP Python, donc chaque requête présentait déjà une empreinte réseau qui ne correspondait pas à Chrome, comme expliqué dans TLS and HTTP/2 fingerprinting. La comparaison isole l’effet du numéro de version ; elle ne montre pas comment un vrai navigateur de chaque version se comporterait.
  • La base de référence n’est pas zéro. 17% des pages d’accueil ont refusé même la version actuelle provenant de ce client, ce qui rappelle qu’un User-Agent correct est nécessaire, mais pas suffisant.

Nous devons aussi reconnaître un constat qui nous concerne. Notre analyse anti-bot plus tôt dans la semaine utilisait un User-Agent Chrome 129 : une chaîne vieille de deux ans, copiée depuis un script plus ancien. Selon cette mesure, cela a coûté quelques points de pourcentage de pages d’accueil.

Maintenir votre User-Agent à jour

  • Traitez-le comme une dépendance. Placez la version du navigateur à un seul endroit, et mettez-la à jour selon un calendrier régulier ; Chrome publie une nouvelle version majeure environ toutes les quatre semaines.
  • Restez à quelques versions de l’actuelle. Dans nos données, une version vieille d’un an était déjà refusée plus souvent que la version actuelle.
  • Maintenez tout cohérent. Une version Chrome actuelle avec un ordre d’en-têtes ancien, des client hints manquants ou une empreinte réseau qui n’est pas celle d’un navigateur reste incohérente ; setting the right headers and User-Agent couvre l’ensemble complet.
  • Utilisez une seule identité par session. Faire varier les versions au sein d’une même session est plus suspect que n’importe quelle version prise isolément.
  • Testez en CI. Une vérification planifiée des cibles clés avec la configuration actuelle et la précédente permet de détecter le décalage avant qu’il n’apparaisse dans vos données ; running scrapers in CI/CD montre comment mettre cela en place.
  • Surveillez le taux de refus. Une augmentation lente des 403 et des contestations est le symptôme typique du décalage ; cela a sa place dans un target health score.

En résumé

Une version de navigateur n’est pas un paramètre que l’on choisit une seule fois. Dans notre mesure sur 397 sites majeurs, chaque année de décalage dans la version de Chrome déclarée ajoutait des refus, l’effet n’est jamais allé dans l’autre sens, et certains services de protection ont réagi à une version vieille d’à peine un an.

Maintenez la version à jour, assurez sa cohérence avec le reste de la requête, et mesurez l’effet sur les cibles qui comptent pour vous. C’est l’une des améliorations de fiabilité les moins coûteuses qu’un projet de scraping puisse apporter.

Sources et références

  • Chromium Dash, calendrier de publication, pour les dates de publication stables et la version actuelle.
  • Tranco, liste Q2K34.
  • Requêtes effectuées par Shifter le 5 octobre 2026 à l’aide du code ci-dessus.

Prêt à commencer ?

Essayez les proxies résidentiels de Shifter, 205M+ IPs, 195+ pays, à partir de 0,75 $/GB.

Commencer