Ce script SEO était mort depuis des années. Je l'ai ressuscité en 2 prompts sans coder.

Partager
Ce script SEO était mort depuis des années. Je l'ai ressuscité en 2 prompts sans coder.
Photo by Aron Visuals / Unsplash

Un script culte de 2023 pour scraper les "People Also Ask" de Google. Mort, comme finissent tous les scripts gratuits. Je l'ai ressuscité en une demi-heure, sans écrire une ligne de code, et je te le donne plus bas, entier. Installe-toi.

Hello,

Nous sommes le mercredi 8 juillet 2026. Fin de matinée.

Je retombe sur un vieux bookmark. Un tweet de juin 2023, trois ans d'âge. Sylvain Laneyrie qui partage un script de Natzir, un SEO espagnol, lui-même inspiré d'un script initial de Carlos Ortega.

https://x.com/SylvainL/status/1672168030137372672

Le pitch de ce script est magnifique.

Tu ouvres une recherche Google. Tu colles le script dans la console. Et il t'aspire toutes les questions "People Also Ask", ces fameuses questions que Google affiche au milieu des résultats. La question, la réponse, l'URL de la source, le tout dans un tableau propre avec un bouton pour télécharger le CSV.

Gratuit. En un clic. Pas d'abonnement, pas de compte, pas de limite.

J'ouvre Google. Je colle le script. Entrée.

Rien.

Enfin si : un spinner qui tourne dans le vide, pour toujours. La page qui scrolle toute seule comme un fantôme. Et aucune donnée à l'arrivée.

Le script est mort. Comme des centaines d'autres avant lui.

Le web est un cimetière de scripts gratuits.

Tu les connais, ces morts. Le bookmarklet que tu adorais. L'extension abandonnée. Le bout de code d'un blog de 2019 qui a sauvé ta semaine, une fois, et qui ne sauvera plus rien. Ils meurent tous de la même chose : l'outil dépend d'un site qui change, et l'auteur est passé à autre chose. Normal, c'était gratuit.

Avant, à ce moment précis de l'histoire, tu avais deux options.

Option un : attendre que l'auteur le répare. Spoiler : jamais.

Option deux : sortir la carte bleue. Il existe des SaaS très bien qui font exactement ça, par abonnement mensuel.

J'ai choisi la troisième option.

L'autopsie

J'ouvre Claude Code. Et je lui pose le cadavre sur la table.

  • Moi : "Ce script scrapait les People Also Ask de Google depuis la console. Il ne marche plus. Ouvre Chrome, va sur une vraie recherche Google, regarde le DOM réel, et dis-moi ce qui est cassé."
  • Claude Code : ouvre une SERP, dissèque la page, clique sur des questions, observe ce qui se passe, et revient avec le rapport d'autopsie.

Trois causes de décès. Je te les traduis en français.

Un. Le chemin de clic. L'ancien script cliquait à l'aveugle : "prends le parent de cet élément, puis son premier enfant, puis son premier enfant, puis le deuxième...". Le jour où Google a déplacé une div, le script s'est mis à cliquer dans le vide. C'est comme donner une adresse en disant "troisième porte à gauche après la boulangerie" : la boulangerie a fermé, tu es perdu.

Deux. Le scroll infini. Le script scrollait la page en boucle pour charger plus de résultats. Sauf que Google a supprimé le scroll continu en 2024. La page ne grandit plus jamais. Le script attendait un événement qui ne peut plus arriver. Il attendait pour rien, pour l'éternité.

Trois. L'alignement des données. Il récupérait trois listes séparées (les questions, les réponses, les URLs) et les mariait par position : question numéro 4 avec réponse numéro 4. Une seule réponse manquante et tout se décale. Tes questions se retrouvent avec les réponses des voisines.

La résurrection

Et c'est là que ça devient intéressant, parce que la machine n'a pas deviné. Elle a regardé.

Elle a ouvert la vraie page, cliqué sur une vraie question, observé ce qui changeait dans le DOM. Et elle a trouvé le truc que je veux que tu retiennes, même si tu ne touches jamais à du code.

Les classes CSS de Google changent tout le temps. Elles sont volontairement illisibles, des trucs du genre CSkcDe, régénérées régulièrement. S'accrocher à ça, c'est construire sur du sable.

Mais il y a une partie de la page que Google ne peut pas toucher : les attributs d'accessibilité. Le role="button", le aria-expanded. C'est ce que lisent les lecteurs d'écran des personnes malvoyantes.

Google peut obfusquer ses classes autant qu'il veut. Il ne peut pas obfusquer ce que lisent les lecteurs d'écran.

Le nouveau script s'accroche donc à ça. Et à la place du scroll infini défunt, il fait des "tours d'expansion" : il clique toutes les questions fermées, ce qui charge les réponses et fait apparaître de nouvelles questions, puis il recommence. Profondeur 2 = deux tours.

Le test réel, sur la requête "qu'est ce qu'un backlink", profondeur 2 :

4 questions visibles au départ. 33 questions extraites à l'arrivée.

Avec la réponse complète, l'URL de la source, et le type de réponse (paragraphe, liste ou tableau). CSV téléchargé. Durée totale de l'opération, autopsie comprise : une grosse demi-heure. Le temps d'un café et deux mails.

À quoi ça sert, concrètement

Si tu fais du contenu, du SEO ou de l'affiliation, les People Also Ask sont une mine que tout le monde regarde et que presque personne n'exploite.

Ce sont les vraies questions que les gens posent à Google. Pas celles que tu imagines dans ta tête. Les vraies.

Avec un CSV de 30-50 questions sur ta thématique, tu as :

  • Des idées d'articles : chaque question est un H2, parfois un article entier. Plus besoin de fixer le plafond en cherchant "quoi écrire".
  • Une FAQ prête à l'emploi pour tes pages, avec les formulations exactes des internautes.
  • Des featured snippets à viser : la colonne URL te montre qui détient la réponse actuelle. Réponds mieux, prends la place.
  • L'intention de recherche autour d'un mot-clé, avant d'écrire la moindre ligne.

Moi, tu me connais, mon métier c'est le netlinking avec Linkuma. Et les PAA, c'est la matière première des pages de contenu qui reçoivent ensuite les liens. Les deux vont ensemble.

Des outils payants vendent exactement ce service par abonnement. Là, c'est gratuit, dans ta console, en un clic.

Le script v2, réparé

Le mode d'emploi tient en cinq lignes :

  1. Ouvre une recherche Google qui affiche des questions "People Also Ask"
  2. Ouvre la console : F12, onglet "Console"
  3. La première fois, Chrome refuse le collage et te demande de taper allow pasting : c'est normal, c'est sa protection anti-arnaque, tape-le et valide
  4. Colle le script, Entrée, choisis la profondeur (2 recommandé, 3 pour ratisser large)
  5. Un nouvel onglet s'ouvre avec le tableau et le bouton de téléchargement du CSV

Crédit complet, parce que c'est important : le script original est de Natzir (@natzir9), inspiré du script initial de Carlos Ortega (@carlos_darko), et je l'avais découvert via le tweet de Sylvain (@SylvainL). Moi, je n'ai fait que la maintenance 2026. Enfin, "je" : vous avez compris.

/**
 * PAA Extractor v2 (fix 2026-07-08 par Mohamed - start-small-now.com)
 *
 * Script original de Natzir (@natzir9), inspire du script initial de
 * Carlos Ortega (@carlos_darko), decouvert via ce tweet de Sylvain
 * Laneyrie (@SylvainL) du 23 juin 2023 :
 * https://x.com/SylvainL/status/1672168030137372672
 *
 * L'original ne marchait plus (Google a change son DOM et supprime le
 * scroll continu en 2024). Cette v2 repare : selecteurs bases sur les
 * attributs d'accessibilite (role/aria-expanded), tours d'expansion a
 * la place du scroll, extraction bloc par bloc au lieu du matching par
 * index, echappement CSV propre.
 *
 * Usage : ouvrir une SERP Google, coller ce script dans la console (F12), Entree.
 * La "depth" = nombre de tours d'expansion des questions PAA (1 a 3 recommande).
 * Chaque tour clique toutes les questions fermees, ce qui charge les reponses
 * et fait apparaitre de nouvelles questions.
 */

var depth = parseInt(prompt("Profondeur de scraping (1 a 3 recommande) :", "2"), 10);

if (!Number.isInteger(depth) || depth < 1) {
    alert("Profondeur invalide, valeur par defaut : 2");
    depth = 2;
}

function sleep(ms) {
    return new Promise(function (resolve) { setTimeout(resolve, ms); });
}

/* --- Overlay de chargement avec compteur --- */
var style = document.createElement('style');
style.innerHTML = '@keyframes paa-spin {0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); }}';
document.head.appendChild(style);

var loadingOverlay = document.createElement("div");
loadingOverlay.id = "paa-loading-overlay";
loadingOverlay.style.cssText = "position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.6);display:flex;flex-direction:column;justify-content:center;align-items:center;z-index:2147483647;gap:24px;";

var spinner = document.createElement("div");
spinner.style.cssText = "border:12px solid #f3f3f3;border-top:12px solid #3498db;border-radius:50%;width:90px;height:90px;animation:paa-spin 2s linear infinite;";

var statusText = document.createElement("div");
statusText.style.cssText = "color:#fff;font-family:Arial,sans-serif;font-size:18px;";
statusText.textContent = "Demarrage...";

loadingOverlay.appendChild(spinner);
loadingOverlay.appendChild(statusText);
document.body.appendChild(loadingOverlay);

/* --- Expansion des questions PAA --- */
async function expandRound(roundNum) {
    var buttons = Array.from(document.querySelectorAll('div[data-lk] [role="button"][aria-expanded="false"]'));
    var clicked = 0;
    for (var i = 0; i < buttons.length; i++) {
        var btn = buttons[i];
        try {
            btn.scrollIntoView({ block: 'center' });
            await sleep(800);
            btn.click();
            clicked++;
            statusText.textContent = "Tour " + roundNum + "/" + depth + " : question " + clicked + "/" + buttons.length +
                " (" + document.querySelectorAll('div[data-lk]').length + " PAA au total)";
            await sleep(1200);
        } catch (e) { /* question retiree du DOM, on continue */ }
    }
    return clicked;
}

/* --- Extraction --- */
function csvEscape(value) {
    return '"' + String(value == null ? '' : value).replace(/"/g, '""').replace(/\s+/g, ' ').trim() + '"';
}

function htmlEscape(value) {
    return String(value == null ? '' : value)
        .replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
}

function extractData() {
    var uniqueQuestions = {};
    var csvContent = 'Question,Answer,URL,Type\n';

    document.querySelectorAll('div[data-lk]').forEach(function (pair) {
        var question = (pair.getAttribute('data-q') || '').trim();
        if (!question || uniqueQuestions[question]) return;

        var ansEl = pair.querySelector('[data-md]');
        var answer = ansEl ? ansEl.textContent.replace(/\s+/g, ' ').trim() : '';
        var md = ansEl ? ansEl.getAttribute('data-md') : '';
        var type = md === '83' ? 'List' : (md === '118' ? 'Table' : 'Paragraph');

        var linkEl = pair.querySelector('div.yuRUbf a') || pair.querySelector('a[href^="http"]');
        var url = linkEl ? linkEl.href.split('#:~:')[0] : '';
        if (url.indexOf('webcache.googleusercontent.com') !== -1) url = '';

        uniqueQuestions[question] = [answer, url, type];
        csvContent += [csvEscape(question), csvEscape(answer), csvEscape(url), type].join(',') + '\n';
    });

    var tableHTML = '<style>' +
        'body { font-family: Arial, sans-serif; background-color: #f3f3f3; margin: 20px; }' +
        'h1 { text-align: center; }' +
        'p { margin-bottom: 20px; }' +
        'table { width: 100%; border-collapse: collapse; background-color: #fff; box-shadow: 0 0 10px rgba(0,0,0,0.1); }' +
        'thead th { background-color: #f5f5f5; text-align: left; padding: 8px; }' +
        'tbody td { padding: 8px; border-top: 1px solid #eee; vertical-align: top; }' +
        'a.button { display: inline-block; margin: 20px 0 40px; padding: 10px 15px; background-color: #4caf50; color: #fff; text-decoration: none; border-radius: 4px; cursor: pointer; }' +
        '</style>' +
        '<title>PAA Extractor</title>' +
        '<h1>PAA Extractor</h1>' +
        '<p>' + Object.keys(uniqueQuestions).length + ' questions People Also Ask extraites (doublons supprimes). ' +
        'La colonne "Type" indique si la reponse est un paragraphe, une liste ou un tableau.</p>' +
        '<a href="#" id="download-button" class="button">Telecharger le CSV</a>' +
        '<table><thead><tr><th>Question</th><th>Answer</th><th>URL</th><th>Type</th></tr></thead><tbody>';

    for (var q in uniqueQuestions) {
        var row = uniqueQuestions[q];
        tableHTML += '<tr><td>' + htmlEscape(q) + '</td><td>' + htmlEscape(row[0]) + '</td><td>' +
            (row[1] ? '<a href="' + htmlEscape(row[1]) + '" target="_blank">' + htmlEscape(row[1]) + '</a>' : '') +
            '</td><td>' + row[2] + '</td></tr>';
    }
    tableHTML += '</tbody></table>';

    var file = new Blob([csvContent], { type: 'text/csv;charset=utf-8' });
    var fileUrl = URL.createObjectURL(file);

    var newWindow = window.open("", "_blank");
    if (newWindow) {
        newWindow.document.write(tableHTML);
        var button = newWindow.document.getElementById("download-button");
        button.href = fileUrl;
        button.download = 'PAA.csv';
    } else {
        // Popup bloquee : telechargement direct du CSV depuis la page courante
        var a = document.createElement('a');
        a.href = fileUrl;
        a.download = 'PAA.csv';
        document.body.appendChild(a);
        a.click();
        a.remove();
    }
}

/* --- Orchestration --- */
(async function run() {
    try {
        for (var round = 1; round <= depth; round++) {
            var clicked = await expandRound(round);
            if (clicked === 0) break; // plus rien a ouvrir
        }
        statusText.textContent = "Extraction en cours...";
        await sleep(2000);
        extractData();
    } finally {
        var overlay = document.getElementById("paa-loading-overlay");
        if (overlay) overlay.remove();
    }
})();

Petit avertissement d'usage, entre nous : c'est du scraping de SERP dans ton navigateur, sur ta session. Reste raisonnable sur la cadence, le script temporise déjà entre chaque clic pour ça.

La vraie leçon

La vraie leçon de cette histoire, ce n'est pas ce script.

Compte tes bookmarks morts. Les outils gratuits que tu as aimés, puis enterrés parce qu'un matin ils ne marchaient plus. Le générateur, le bookmarklet, l'extension, le bout de code magique d'un forum de 2019.

Avant, un outil mort, c'était définitif. Tu n'avais ni les compétences pour le réparer, ni le budget pour le remplacer, ni le temps d'apprendre. Alors tu faisais le deuil, et tu retournais faire le travail à la main.

Ce monde-là est terminé. La maintenance d'un outil coûte désormais une conversation.

Trente minutes. Pas de code écrit à la main. Juste : "voilà le cadavre, ouvre le navigateur, regarde ce qui a changé, répare". Et l'outil revient, plus solide qu'avant.

Tu n'es plus dépendant de la motivation d'un inconnu pour maintenir les outils dont tu te sers. Ça change silencieusement énormément de choses.

Alors voilà le devoir du jour : va chercher dans tes bookmarks le script ou l'outil mort que tu regrettes le plus. Pose-le sur la table. Demande l'autopsie.

À très vite,
Mohamed

Lire la suite