← Tous les articles

Comment Extraire les Résultats Google Avec les Annonces Grâce à une SERP API

Demandez à un développeur de “scraper Google” et il pense en général aux dix liens bleus organiques. Mais une page de résultats moderne, c’est bien plus que cela. Au-dessus et en dessous des liens organiques se trouvent des annonces payantes, et pour les requêtes commerciales ces annonces sont souvent les données les plus précieuses de la page. Elles vous disent qui enchérit sur un mot-clé, quels textes sont diffusés et vers quelles pages de destination le trafic est dirigé. Si votre scraper les ignore, il vous manque la moitié de l’histoire.

Capturer les annonces de façon fiable est plus difficile que capturer les résultats organiques, et la plupart des outils de SERP les passent sous silence - surtout parce que Google ne montre les annonces qu’aux visiteurs qu’il considère comme de vraies personnes. Cet article explique pourquoi les résultats payants sont si insaisissables, ce que devrait contenir une réponse SERP complète et comment récupérer à la fois les résultats organiques et les annonces sous forme de JSON propre - tels qu’une personne dans un pays donné les verrait réellement.

Pourquoi les Annonces Sont Plus Difficiles à Extraire Que les Résultats Organiques

Les résultats organiques sont relativement stables. Les positions bougent, mais la même requête depuis deux machines similaires renvoie généralement une liste comparable. Les annonces ne se comportent pas ainsi, et il y a plusieurs raisons à cela.

Google ne diffuse tout simplement pas d’annonces à un visiteur en qui il n’a pas confiance. C’est de loin la raison principale, et c’est celle que presque personne ne mentionne. Chaque impression publicitaire coûte de l’argent à un annonceur, donc Google protège son inventaire publicitaire bien plus agressivement que les résultats organiques. Si la session ne ressemble pas à celle d’un vrai humain - empreinte du navigateur, réputation de l’IP, cookies, timings, signaux d’interaction -, l’enchère publicitaire est discrètement ignorée. Vous n’obtenez ni page de blocage, ni captcha, ni erreur. Vous obtenez une page de résultats d’apparence parfaitement normale, avec tous les liens organiques présents et aucun bloc sponsorisé.

Cette distinction est essentielle : passer le blocage n’est pas la même chose qu’être jugé digne de confiance. Beaucoup de configurations automatisées chargent Google sans problème, obtiennent un HTTP 200 propre, parsent les résultats organiques sans accroc et ne voient pourtant jamais une seule annonce - pour aucun mot-clé, dans aucun pays. Les équipes en concluent alors “il n’y avait pas d’annonces pour cette requête” alors qu’un vrai utilisateur sur le même marché en voit quatre. Comme il n’y a aucune erreur à intercepter, cet échec reste invisible tant que vous ne comparez pas à la main avec un vrai navigateur.

Gagner cette confiance n’est pas un problème de parsing, c’est un problème d’infrastructure : un vrai navigateur avec une empreinte cohérente, une sortie résidentielle correspondant au pays visé, un comportement de session et de timing crédible, et aucun des signaux d’automatisation que Google apprend à repérer depuis des années. C’est exactement la couche que gère ScrapeUnblocker : les requêtes arrivent comme celles d’un utilisateur authentique depuis le pays de votre choix, l’enchère publicitaire se déroule donc normalement et les blocs sponsorisés reviennent en entier - les mêmes qu’une personne installée sur ce marché verrait.

Les annonces sont fortement personnalisées selon la localisation. L’enchère publicitaire de Google se déroule par requête, par région, parfois par ville. Une recherche “assurance auto” depuis une IP américaine fait apparaître un ensemble d’annonceurs complètement différent de la même recherche depuis l’Allemagne ou le Royaume-Uni. Si votre scraper sort par une IP de centre de données aléatoire dans le mauvais pays, vous voyez soit les mauvaises annonces, soit aucune.

Les annonces se chargent tardivement. De nombreux emplacements publicitaires sont remplis par du JavaScript côté client un instant après le chargement de la page principale. Une requête HTTP naïve qui récupère le HTML initial capture souvent la page avant que l’enchère publicitaire ne se soit affichée, si bien que les résultats semblent sans annonces alors qu’ils en contiennent.

Les annonces sont conçues pour ressembler à des résultats organiques. Google a passé des années à rendre le libellé “Sponsorisé” discret. Pour un parseur, un bloc d’annonce et un bloc organique peuvent sembler quasi identiques dans le DOM, ce qui signifie que des sélecteurs fragiles écrits à la main les manquent ou les classent mal en permanence.

Le balisage des annonces change souvent. Google réorganise fréquemment la mise en page de ses SERP. Des sélecteurs qui fonctionnaient le mois dernier renvoient silencieusement des tableaux vides ce mois-ci, et vous ne le découvrez que lorsque votre tableau de bord se vide.

Mis bout à bout, ces facteurs expliquent pourquoi tant de scrapers de SERP ne renvoient que des données organiques. Obtenir aussi les annonces, c’est d’abord ressembler à un vrai utilisateur, puis résoudre par-dessus le ciblage géographique, le rendu JavaScript et une classification robuste.

Ce Que Devrait Contenir une Réponse SERP Complète

Une SERP API qui en vaut la peine devrait vous livrer la page entière, déjà découpée dans les parties qui vous intéressent. Au minimum, cela signifie trois groupes :

  • topAds - les résultats sponsorisés affichés au-dessus des liens organiques.
  • organic - les résultats standards, non payants.
  • bottomAds - les résultats sponsorisés affichés en dessous des liens organiques.

Chaque résultat, payant ou organique, devrait porter la même structure propre : un titre, l’URL de destination réelle, l’URL affichée (celle qui est lisible), un extrait de description et une position. Quand les annonces et les résultats organiques partagent un même schéma, votre code en aval reste simple : vous les parcourez de la même manière et retenez simplement de quel groupe ils proviennent.

Point essentiel : les résultats doivent refléter un vrai utilisateur dans le pays choisi. Vous choisissez le pays, et l’API renvoie la page telle que la verrait quelqu’un qui navigue depuis là-bas - les mêmes annonceurs, le même ordre, les mêmes nuances locales. C’est la différence entre “quelques résultats Google” et “les résultats que votre audience voit vraiment”.

Faire la Requête

Le point de terminaison est un unique appel POST. Le seul champ obligatoire est votre keyword de recherche ; tout le reste est optionnel et vous donne le contrôle sur la profondeur et la localisation.

  • keyword (obligatoire) - la requête de recherche, par exemple best running shoes.
  • proxy_country - le code pays ISO pour le ciblage géographique, comme us ou de.
  • pages_to_check - le nombre de pages de SERP à collecter, de 1 à 10 (1 par défaut).
  • wait_after_load - secondes d’attente après le chargement de la page pour que les annonces à rendu tardif apparaissent.
  • captcha_pause - secondes de pause si un défi est rencontré.

Voici l’appel le plus simple possible avec curl :

curl -X POST "https://api.scrapeunblocker.com/serpApi" \
  -H "x-scrapeunblocker-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "keyword": "best running shoes",
    "proxy_country": "us",
    "pages_to_check": 1,
    "wait_after_load": 3
  }'

Les deux paramètres qui comptent le plus pour capturer les annonces sont proxy_country et wait_after_load. Réglez le pays sur celui de votre audience et accordez à la page quelques secondes pour que les emplacements publicitaires finissent de s’afficher avant que les données ne soient lues. En omettre un est la raison la plus courante pour laquelle on obtient des données d’annonces incomplètes.

Le même appel en Python est tout aussi court :

import requests

resp = requests.post(
    "https://api.scrapeunblocker.com/serpApi",
    headers={"x-scrapeunblocker-key": "YOUR_API_KEY"},
    json={
        "keyword": "best running shoes",
        "proxy_country": "us",
        "pages_to_check": 1,
        "wait_after_load": 3,
    },
)

data = resp.json()
print(f"{len(data['topAds'])} top ads, {len(data['organic'])} organic results")

La Réponse

La réponse est un unique objet JSON. Le niveau supérieur vous indique ce qui a été recherché et depuis où, et les tableaux topAds, bottomAds et organic contiennent les résultats. Voici un exemple avec des données fictives :

{
  "keyword": "best running shoes",
  "proxy_country": "us",
  "totalResults": 128000000,
  "topAds": [
    {
      "title": "SwiftSole Pro 2026 - Free 60-Day Returns",
      "url": "https://www.swiftsole.example/pro-running",
      "displayedUrl": "swiftsole.example/pro",
      "description": "Lightweight carbon-plate trainers built for race day. Free shipping both ways.",
      "position": 1
    },
    {
      "title": "PaceRunner Outlet - Up to 40% Off",
      "url": "https://shop.pacerunner.example/sale",
      "displayedUrl": "shop.pacerunner.example/sale",
      "description": "Last-season road and trail shoes at clearance prices. Sizes selling fast.",
      "position": 2
    }
  ],
  "bottomAds": [
    {
      "title": "TrailheadGear - Trail Running Specialists",
      "url": "https://www.trailheadgear.example/shoes",
      "displayedUrl": "trailheadgear.example",
      "description": "Grippy, waterproof trail shoes tested on real mountain routes.",
      "position": 1
    }
  ],
  "organic": [
    {
      "title": "The 12 Best Running Shoes of 2026, Tested",
      "url": "https://www.runreview.example/best-running-shoes",
      "displayedUrl": "runreview.example > gear > shoes",
      "description": "We logged 400 miles in this year's top trainers. Here is what held up.",
      "position": 1
    },
    {
      "title": "How to Choose Running Shoes - A Beginner's Guide",
      "url": "https://www.stridelab.example/guides/choose-shoes",
      "displayedUrl": "stridelab.example/guides",
      "description": "Pronation, drop, cushioning: the three things that actually matter.",
      "position": 2
    }
  ]
}

Comme chaque entrée - annonce ou organique - utilise les mêmes cinq champs, l’itération est triviale. Vous pouvez aplatir les trois tableaux, étiqueter chaque ligne avec sa source et les verser directement dans une table :

rows = []
for bucket in ("topAds", "bottomAds", "organic"):
    for item in data[bucket]:
        rows.append({"source": bucket, **item})

Ce Que Vous Pouvez Construire Avec des Données SERP Complètes

Une fois que vous avez ensemble les données organiques et les données d’annonces, plusieurs cas d’usage s’ouvrent, que les scrapers uniquement organiques ne peuvent pas couvrir :

  • Surveillance des annonces concurrentes. Suivez quelles entreprises enchérissent sur vos mots-clés phares, observez l’évolution de leurs textes publicitaires dans le temps et repérez les nouveaux arrivants le jour même où ils commencent à faire de la publicité.
  • Suivi de position qui reflète la réalité. La position organique qui compte est celle que voit un utilisateur après que les annonces ont repoussé les liens vers le bas. Capturer les annonces vous permet de mesurer la visibilité réelle, pas un classement théorique.
  • Protection de la marque. Détectez les concurrents ou affiliés qui enchérissent sur le nom de votre marque dans des pays précis, ce qui est souvent le premier signe d’un usage abusif de la marque.
  • Étude de marché et de prix. Le texte des annonces est un flux en direct des promotions, remises et messages que diffuse votre marché en ce moment.
  • Analyse de l’intention locale. Comme vous choisissez le pays, vous pouvez comparer l’apparence d’une même requête d’un marché à l’autre et adapter vos campagnes par région.

Le fil conducteur, c’est la géographie. Rien de tout cela ne fonctionne si vous ne pouvez pas voir de façon fiable la page comme la voit un utilisateur local, et c’est précisément pourquoi le ciblage par pays et la capture complète des annonces vont de pair.

Foire aux Questions

Pourquoi mon scraper ne renvoie-t-il aucune annonce, même pour des mots-clés commerciaux ? Le plus souvent parce que Google n’a pas considéré la session comme celle d’un vrai utilisateur et a purement et simplement sauté l’enchère publicitaire : la page se charge quand même et les résultats organiques se parsent quand même, donc rien ne semble cassé. Les deux autres causes habituelles sont une sortie par le mauvais pays, donc aucune annonce locale n’est diffusée, et une lecture de la page avant que les emplacements publicitaires n’aient fini de s’afficher. Réglez proxy_country sur votre marché cible et ajoutez un bref wait_after_load, mais la couche de confiance doit être résolue en premier, et ce n’est pas quelque chose que des sélecteurs ou des délais peuvent corriger.

Mon scraper n’est pas bloqué du tout - pourquoi ne vois-je toujours aucune annonce ? Parce qu’éviter le blocage et être traité comme un vrai visiteur sont deux barres différentes, et les annonces se trouvent derrière la plus haute. Google donnera volontiers à un client d’allure automatisée un HTTP 200 propre avec toute la liste organique, en laissant simplement les blocs sponsorisés de côté. C’est pourquoi une réponse sans annonces ne prouve pas que le mot-clé n’a pas d’annonceurs : vérifiez la même requête dans un navigateur normal depuis le même pays et vous les trouverez généralement. Les requêtes ScrapeUnblocker passent pour de vrais utilisateurs, donc les annonces sont bien là.

Puis-je collecter des annonces au-delà de la première page ? Oui. Utilisez pages_to_check pour récupérer jusqu’à dix pages de SERP en un seul appel. Les annonces de bas de page et les liens organiques plus profonds apparaissent à mesure que vous descendez dans les résultats.

Comment distinguer les annonces des résultats organiques ? La réponse les sépare déjà pour vous. Les résultats sponsorisés arrivent dans topAds et bottomAds, et les résultats non payants dans organic, donc vous n’avez jamais à deviner à partir du balisage ou d’un libellé “Sponsorisé”.

Les résultats correspondront-ils à ce que voit un vrai utilisateur ? C’est l’objectif. En sélectionnant un proxy_country, vous obtenez la page telle que la verrait un véritable visiteur de ce pays - les mêmes annonceurs, le même ordre et les mêmes résultats localisés, plutôt qu’une vue générique ou biaisée par le centre de données.

En Résumé

Des données de recherche complètes, cela signifie la page entière : les liens organiques et les annonces qui les entourent, vus depuis le pays qui compte pour vous. Cette combinaison est ce qui transforme un scraper de SERP d’une curiosité en quelque chose sur quoi vous pouvez bâtir un produit d’intelligence concurrentielle ou de suivi de position.

Si vous préférez ne pas maintenir vous-même la logique de ciblage géographique, de rendu JavaScript et de classification des annonces, la SERP API de ScrapeUnblocker renvoie les résultats organiques et les deux blocs d’annonces sous forme de JSON structuré en un seul appel, avec le pays de sortie de votre choix. Vous pouvez consulter la référence complète des paramètres et de la réponse dans la documentation développeur et commencer à tester des requêtes depuis le tableau de bord. Quel que soit l’outil que vous choisissez, le principe reste le même : si vous voulez la vérité sur une page de résultats de recherche, capturez-la en entier - annonces comprises.

Essayez ScrapeUnblocker gratuitement

Taux de réussite de plus de 95 % · à partir de 0,55 € pour 1 000 appels · 500 requêtes gratuites à l'inscription.

Essayer gratuitement → Voir les tarifs