Quora est l'un des plus grands sites publics de questions-réponses sur le web, et les questions et réponses publiques qu'il héberge constituent un signal utile pour la recherche de contenu et de sujets. La formulation d'une vraie question, le nombre de réponses qu'elle a suscitées et les réponses ayant reçu le plus de votes positifs vous indiquent ensemble ce que les gens demandent réellement sur un sujet et quelles formulations trouvent un écho. Cela fait des fils Quora publics un apport pratique pour la planification SEO, l'idéation de contenu et la recherche d'audience.

Ce guide vous montre comment scraper Quora avec JavaScript et Node.js en utilisant cheerio. Vous construisez un petit scraper fonctionnel qui récupère une page de question Quora publique via la Crawling API avec le rendu activé, analyse le texte de la question, les corps de réponse, ainsi que le nombre de réponses et de votes positifs, puis exporte le résultat au format JSON et CSV. L'ensemble du guide se limite aux données Q&R publiques. Nous traitons les noms d'auteurs comme des données personnelles et agrégeons plutôt que nous ne créons de profils, et la section sur la légalité vers la fin n'est pas un texte boilerplate, alors lisez-la avant de l'utiliser à grande échelle.

Ce que vous allez construire

Un script Node.js qui prend une URL de question Quora publique, récupère le HTML rendu via la Crawling API, et extrait un enregistrement structuré pour la question et ses réponses visibles. Nous extrayons ces champs, portés depuis le scraper Quora original :

  • Texte de la question la question réelle, par exemple « Comment commencer à jouer aux jeux vidéo ? ».
  • Lien de la question l'URL canonique de la page de la question.
  • Nombre de réponses le nombre total de réponses que la question signale, plus combien étaient présentes sur la page que vous avez scrapée.
  • Texte de la réponse le corps de chaque réponse visible, capturé pour une analyse thématique agrégée plutôt que pour republication.
  • Nombre de votes positifs le total de votes positifs affiché sur chaque réponse, votre principal signal de popularité.
  • Position de la réponse l'ordre dans lequel la réponse est apparue, afin que vous puissiez pondérer par classement.

Les noms d'auteurs apparaissent dans le balisage, et le scraper hérité les capturait. Nous ne construisons délibérément pas de profil par auteur à partir d'eux. La section confidentialité explique comment garder les noms agrégés, et pourquoi cela est important ici.

Pourquoi une requête simple échoue sur Quora

Si vous demandez une URL de question Quora avec un client HTTP brut, vous obtenez en retour une coquille légère plutôt que le fil. Quora rend la question, les réponses et le nombre de réponses dans le navigateur avec JavaScript, de sorte que le HTML initial arrive en grande partie vide jusqu'à ce que les scripts de la page s'exécutent. Par-dessus cela, Quora soumet le trafic automatisé à des défis : les adresses IP de centre de données et les schémas de requêtes qui ne ressemblent pas à un vrai navigateur sont redirigés vers une connexion ou un mur de contenu avant même d'atteindre les réponses.

Un scraper Quora fonctionnel a donc besoin de deux choses en une seule requête : un navigateur qui rend effectivement le fil, et une IP que la plateforme reconnaît comme un vrai visiteur. Vous pouvez assembler cela vous-même avec un navigateur sans interface et un pool de proxies résidentiels rotatifs, mais les assembler et les maintenir en bon état représente l'essentiel du travail. La Crawling API réunit les deux en un seul appel : vous lui envoyez l'URL avec un token JavaScript, elle rend la page derrière une IP de confiance et retourne le HTML finalisé que vous pouvez analyser avec cheerio.

Pourquoi le token JS

Crawlbase propose deux types de tokens. Le token normal récupère le HTML statique ; le token JavaScript (JS) rend la page dans un vrai navigateur d'abord. Quora charge le corps de la question et chaque réponse côté client, donc le token JS est ce qui vous donne une page complète ici. Le token normal tend à retourner un cadre vide sans réponses à analyser.

Prérequis

Vous avez besoin de quelques éléments en place avant d'écrire du code. Aucun d'eux ne prend longtemps.

Connaissances de base en JavaScript et Node.js. Vous devez être à l'aise pour écrire et exécuter un script Node, installer des packages avec npm et travailler avec des promesses et des fonctions async. Si les sélecteurs et le DOM sont nouveaux pour vous, toute ressource JavaScript pour débutants couvre les bases supposées par ce tutoriel. Pour un guide plus complet du workflow, consultez notre guide sur la façon de construire un scraper web avec Node.js.

Node.js 16 ou version ultérieure. Confirmez votre version avec node --version. Si vous ne l'avez pas, installez-le depuis le site web de Node.js ou via un gestionnaire de versions comme nvm.

Un compte Crawlbase et un token JS. Inscrivez-vous, ouvrez votre tableau de bord et copiez votre token JavaScript (JS) depuis la page de documentation du compte. Crawlbase vous donne jusqu'à 20 000 requêtes gratuites pour commencer, et vous ne payez que pour les requêtes réussies. Traitez le token comme un mot de passe : il authentifie vos requêtes, gardez-le donc en dehors du contrôle de version.

Configurer le projet

Créez un dossier de projet, initialisez-le et installez les deux bibliothèques dont le scraper a besoin.

bash
node --version

mkdir quora-scraper && cd quora-scraper
npm init -y

npm install crawlbase cheerio

Deux dépendances font le travail : crawlbase est le client Node officiel pour la Crawling API, et cheerio analyse le HTML retourné avec une API de style jQuery afin que vous puissiez extraire des champs individuels par sélecteur CSS. Si les sélecteurs sont nouveaux pour vous, le guide sur comment crawler des sites web JavaScript est un bon complément pour les cibles à rendu intensif comme celle-ci.

Étape 1 : Récupérer la page de question rendue

Commencez par obtenir la page finalisée. Importez la classe CrawlingAPI, initialisez-la avec votre token JS et demandez l'URL de la question. Vérifier le code de statut avant d'analyser permet de rendre les échecs visibles plutôt que silencieux.

javascript
const { CrawlingAPI } = require('crawlbase');

const api = new CrawlingAPI({ token: 'YOUR_CRAWLBASE_TOKEN' });

async function crawl(pageUrl) {
  const options = { ajax_wait: 'true', page_wait: 6000 };
  const response = await api.get(pageUrl, options);
  if (response.statusCode === 200) {
    return response.body;
  }
  console.error(`Request failed: ${response.statusCode}`);
  return null;
}

const quoraUrl = 'https://www.quora.com/How-do-I-start-playing-video-games';
crawl(quoraUrl).then((html) => {
  console.log(html ? html.slice(0, 500) : 'No HTML returned');
});

Les deux options d'attente importent pour une cible rendue côté client comme celle-ci. ajax_wait indique à l'API d'attendre que le contenu asynchrone finisse de se charger, et page_wait maintient un nombre fixe de millisecondes après le chargement afin que les réponses à rendu tardif apparaissent avant que la page ne soit capturée. Six secondes est un bon point de départ ; augmentez-le si la liste de réponses revient courte. Exécutez le script avec node scraper.js et vous devriez voir du vrai balisage de question, pas une coquille dépouillée. Cela confirme que le rendu fonctionne avant d'écrire un seul sélecteur.

Crawlbase Quora Scraper

Quora a besoin d'un fil rendu derrière une IP de confiance, en un seul appel, ce qui est exactement ce que vous venez de voir faire la fonction crawl. La Crawling API prend un token JS, exécute la page dans un vrai navigateur, fait tourner des IPs résidentielles côté serveur et vous remet le HTML finalisé, vous évitant ainsi de gérer vous-même une flotte de navigateurs sans interface et un pool de proxies. Pointez-la vers une page de question publique sur le niveau gratuit d'abord.

Étape 2 : Analyser la question et les réponses avec cheerio

Avec le HTML rendu en main, chargez-le dans cheerio et lisez les champs. Le texte et le lien de la question se trouvent en haut de la page ; chaque réponse est un bloc répétitif plus bas. Quora organise les réponses dans des conteneurs div.q-box, vous sélectionnez donc les blocs de réponses, puis lisez le texte du corps et le nombre de votes positifs depuis l'intérieur de chacun. Lire chaque champ de manière défensive évite qu'une valeur manquante ne fasse planter l'exécution.

javascript
const cheerio = require('cheerio');

function parseQuestion(html, pageUrl) {
  const $ = cheerio.load(html);

  const questionText = $('div.puppeteer_test_question_title')
    .first()
    .text()
    .trim() || $('title').text().trim();

  const answers = [];
  $('div.q-box.qu-borderAll').each((i, el) => {
    const block = $(el);
    const answerText = block.find('.q-text').first().text().trim();
    if (!answerText) return;

    const upvoteRaw = block
      .find('.q-click-wrapper')
      .first()
      .text()
      .trim();

    answers.push({
      answerText,
      answerUpvoteCount: upvoteRaw || null,
      answerPosition: i + 1,
    });
  });

  return {
    question: {
      text: questionText,
      link: pageUrl,
      answerCountScraped: answers.length,
      answers,
    },
  };
}

Les noms de champs ici sont portés directement depuis la sortie du scraper Quora original : question.text, question.link, answerCountScraped, answers, answerText, answerUpvoteCount et answerPosition. Nous lisons le corps de la réponse depuis .q-text et le total des votes depuis le contrôle de vote, puis indexons chaque réponse par position pour que vous puissiez pondérer les réponses populaires plus tard. Nous ne capturons délibérément pas le nom de l'auteur ni le lien de profil dans l'enregistrement ; la prochaine section explique ce choix.

Les sélecteurs évoluent

Les noms de classes de Quora (q-box, q-text, q-click-wrapper, et les marqueurs puppeteer_test_) sont obscurcis et changent sans préavis. Traitez les sélecteurs ci-dessus comme un modèle de départ, pas comme un contrat. Lorsqu'un champ revient vide, réinspectez la page en direct dans les outils de développement de votre navigateur et mettez à jour le sélecteur. La maintenance périodique des sélecteurs est normale pour tout scraper en production, ce n'est pas le signe que quelque chose est cassé.

Si vous préférez éviter entièrement la maintenance des sélecteurs, la Crawling API propose également un scraper de données quora-question prêt à l'emploi. Passez { scraper: 'quora-question' } dans l'objet options et l'API retourne du JSON analysé dans response.json.body au lieu du HTML brut, vous n'écrivez donc pas de cheerio du tout. Le chemin cheerio manuel ci-dessus vaut la peine d'être appris car il vous donne le contrôle exact sur les champs que vous conservez, ce qui est l'objet des conseils de confidentialité ci-dessous.

Étape 3 : Tout assembler

Maintenant, reliez la récupération et l'analyse en un script fonctionnel. Récupérez le HTML rendu, transmettez-le au parseur et imprimez l'enregistrement structuré.

javascript
const { CrawlingAPI } = require('crawlbase');
const cheerio = require('cheerio');

const api = new CrawlingAPI({ token: 'YOUR_CRAWLBASE_TOKEN' });

async function crawl(pageUrl) {
  const options = { ajax_wait: 'true', page_wait: 6000 };
  const response = await api.get(pageUrl, options);
  if (response.statusCode === 200) return response.body;
  console.error(`Request failed: ${response.statusCode}`);
  return null;
}

function parseQuestion(html, pageUrl) {
  const $ = cheerio.load(html);
  const questionText = $('div.puppeteer_test_question_title')
    .first().text().trim() || $('title').text().trim();

  const answers = [];
  $('div.q-box.qu-borderAll').each((i, el) => {
    const block = $(el);
    const answerText = block.find('.q-text').first().text().trim();
    if (!answerText) return;
    const upvoteRaw = block.find('.q-click-wrapper').first().text().trim();
    answers.push({
      answerText,
      answerUpvoteCount: upvoteRaw || null,
      answerPosition: i + 1,
    });
  });

  return {
    question: {
      text: questionText,
      link: pageUrl,
      answerCountScraped: answers.length,
      answers,
    },
  };
}

async function main() {
  const quoraUrl = 'https://www.quora.com/How-do-I-start-playing-video-games';
  const html = await crawl(quoraUrl);
  if (!html) return;
  const data = parseQuestion(html, quoraUrl);
  console.log(JSON.stringify(data, null, 2));
}

main();

À quoi ressemble la sortie

Exécutez le script complet avec node scraper.js et vous obtenez un enregistrement structuré pour la question et ses réponses visibles, prêt à écrire en JSON ou CSV.

json
{
  "question": {
    "text": "How do I start playing video games?",
    "link": "https://www.quora.com/How-do-I-start-playing-video-games",
    "answerCountScraped": 3,
    "answers": [
      {
        "answerText": "Playing video games is simple, the game will give you some rules, and you play by them.",
        "answerUpvoteCount": "7",
        "answerPosition": 1
      },
      {
        "answerText": "Start with a genre you already enjoy, then pick a beginner-friendly title and learn the controls slowly.",
        "answerUpvoteCount": "3.7K",
        "answerPosition": 2
      }
    ]
  }
}

Notez que l'enregistrement ne contient aucun nom d'auteur ni lien de profil. Le nombre de votes reste une chaîne car Quora abrège les grands nombres (« 3.7K »), et garder l'étiquette brute évite une conversion avec perte. Pour la recherche thématique, le texte de la question plus le classement par votes est généralement tout ce dont vous avez besoin.

Exporter en JSON et CSV

Pour la recherche de contenu, vous souhaitez généralement les données sur le disque, pas seulement dans la console. Le module fs intégré de Node écrit du JSON en une ligne, et un petit assistant aplatit les réponses en lignes CSV pour que vous puissiez les ouvrir dans un tableur et les trier par votes. Chaque ligne CSV est une réponse, avec le texte de la question répété comme contexte.

javascript
const fs = require('fs');

function saveJson(data, file) {
  fs.writeFileSync(file, JSON.stringify(data, null, 2));
}

function csvCell(value) {
  const text = (value == null ? '' : String(value)).replace(/"/g, '""');
  return `"${text}"`;
}

function saveCsv(data, file) {
  const header = ['question', 'answerText', 'answerUpvoteCount', 'answerPosition'];
  const rows = data.question.answers.map((a) =>
    [data.question.text, a.answerText, a.answerUpvoteCount, a.answerPosition]
      .map(csvCell)
      .join(','),
  );
  fs.writeFileSync(file, [header.join(','), ...rows].join('\n'));
}

// In main(), after building `data`:
saveJson(data, 'quora_scraped.json');
saveCsv(data, 'quora_scraped.csv');

Les colonnes CSV sont la question, le texte de la réponse, le nombre de votes et la position, exactement les champs dont une analyse de contenu ou de sujet a besoin. L'identité de l'auteur est intentionnellement absente des deux exports.

Passer à l'échelle avec de nombreuses questions

Une question est une démonstration ; la recherche thématique signifie généralement une liste de questions sur un sujet. Collectez les URL de questions qui vous intéressent (depuis une recherche Quora, un sitemap ou votre propre liste), puis bouclez sur elles, récupérez chacune via la Crawling API, analysez avec la même fonction, et concaténez les enregistrements. Comme chaque page de question partage la même structure, le parseur que vous avez déjà écrit fonctionne sur toutes sans modification.

javascript
async function scrapeMany(urls) {
  const all = [];
  for (const url of urls) {
    const html = await crawl(url);
    if (html) all.push(parseQuestion(html, url).question);
  }
  return all;
}

const questions = [
  'https://www.quora.com/How-do-I-start-playing-video-games',
  'https://www.quora.com/What-is-Quora',
];

scrapeMany(questions).then((rows) => {
  console.log(`Collected ${rows.length} questions`);
});

Espacez la boucle et gardez votre volume modeste. Quora surveille le trafic ressemblant à des scrapers, donc espacer les requêtes et les router via des IPs résidentielles rotatives, ce que la Crawling API gère pour vous, maintient une exécution saine. Pour le guide général, consultez comment scraper des sites web sans être bloqué. Si vous transformez les classements de votes en carte de mots-clés ou de sujets, le workflow dans comment extraire et analyser les données SEO Google s'associe bien à cette sortie.

Est-il légal de scraper Quora ?

Savoir si le scraping de Quora est autorisé dépend des Conditions d'utilisation de Quora, de votre juridiction et de ce que vous faites avec les données. Les conditions de Quora restreignent l'accès automatisé et la collecte en masse, donc le scraping peut aller à l'encontre de ces conditions quel que soit le soin apporté à votre outillage. Lisez les Conditions d'utilisation de Quora et son robots.txt, respectez les limites de débit qu'ils impliquent, et traitez les deux comme la limite de ce que vous collectez. Aucun code ici ne change cela ; il rend seulement la partie technique fonctionnelle, et uniquement sur les pages de questions publiques que tout le monde peut lire sans compte.

La question majeure sur une plateforme comme Quora est la donnée personnelle. Les noms d'auteurs, les liens de profil et les références que les gens attachent à leurs réponses sont des données personnelles, et la réponse écrite d'un utilisateur est son contenu. C'est pourquoi le scraper dans ce guide ne conserve que le texte de la question, les corps de réponses pour l'analyse agrégée, les nombres de votes et la position de la réponse, et abandonne délibérément les noms d'auteurs et les liens de profil. Utilisez la sortie pour les tendances, la fréquence des sujets et quelles formulations suscitent de l'engagement. Ne créez pas de profils de personnes identifiables, ne republiez pas la réponse d'un individu liée à son nom, et n'assemblez pas un jeu de données qui isole quelqu'un. Si vous êtes dans l'UE ou en Californie, le RGPD et le CCPA s'appliquent dès que des données personnelles sont impliquées : vous avez besoin d'une base légale pour les traiter et vous devez honorer les demandes de suppression, ce qui est une raison majeure d'agréger et de supprimer les noms plutôt que de les stocker.

Pour un accès structuré et sanctionné, préférez une voie officielle. Ce guide se limite délibérément aux pages de questions et réponses publiques car c'est la ligne qui rend le travail défendable. Il ne couvre rien derrière une connexion, les détails d'auteur privés ou anonymes, les messages directs, ni aucune tentative de contourner l'authentification ou un mur de contenu. Si votre projet nécessite des données d'utilisateurs identifiables ou des volumes au-delà d'une recherche publique légère, la bonne voie est un accord de données formel ou un partenariat avec la plateforme, pas un scraper plus sophistiqué.

Récapitulatif

Points clés

  • Quora rend les fils côté client. Une simple récupération retourne un cadre vide, donc vous devez rendre la page avec le token JS avant de l'analyser.
  • Un appel fait le rendu et une IP de confiance. La Crawling API avec un token JS gère les deux ; ajax_wait et page_wait contrôlent le temps qu'elle attend pour que les réponses se chargent.
  • cheerio extrait les champs. Lisez le texte de la question, puis mappez chaque bloc de réponse vers son corps, son nombre de votes et sa position, et attendez-vous à ce que les sélecteurs obscurcis évoluent.
  • Agrégez, ne profilez pas. Conservez le texte de la question, les corps de réponses et les nombres de votes pour la recherche thématique ; abandonnez les noms d'auteurs et les liens de profil pour ne pas créer de profils de personnes identifiables.
  • Restez sur les données publiques. Respectez les CGU et robots.txt de Quora, gardez le volume modeste, respectez le RGPD et le CCPA lorsque des données personnelles sont impliquées, et préférez un accord officiel pour tout ce qui dépasse une recherche publique légère.

Foire aux questions

Pourquoi une simple récupération retourne-t-elle une page vide depuis Quora ?

Parce que Quora rend la question et chaque réponse côté client avec JavaScript. Le HTML initial est presque vide jusqu'à ce que les scripts de la page s'exécutent dans un navigateur, et les requêtes automatisées non authentifiées sont souvent redirigées vers une connexion ou un mur de contenu. Pour obtenir un fil complet, vous devez le rendre derrière une IP de confiance, ce que le token JS de la Crawling API gère pour vous.

Ai-je besoin du token normal ou du token JS pour Quora ?

Utilisez le token JS. Le token normal récupère le HTML statique, qui sur Quora revient comme un cadre vide sans réponses. Le token JS rend la page dans un vrai navigateur avant de retourner le HTML, de sorte que le corps de la question, les réponses et les nombres de votes sont présents lorsque cheerio les analyse.

Puis-je utiliser le scraper de données Quora prêt à l'emploi au lieu d'écrire cheerio ?

Oui. La Crawling API propose un scraper de données quora-question. Passez { scraper: 'quora-question' } dans l'objet options et l'API retourne du JSON analysé dans response.json.body au lieu du HTML brut, vous évitez donc entièrement cheerio. Écrire votre propre parseur vaut toujours la peine lorsque vous voulez un contrôle précis sur les champs que vous conservez, ce qui est important pour garder les données personnelles des auteurs hors de votre jeu de données.

Mes sélecteurs retournent des valeurs vides. Qu'est-ce qui a changé ?

Presque certainement le balisage de Quora. Ses noms de classes sont obscurcis (q-box, q-text, les marqueurs puppeteer_test_) et changent sans préavis, donc des sélecteurs qui fonctionnaient le mois dernier peuvent se casser. Réinspectez une page de question en direct dans les outils de développement de votre navigateur et mettez à jour les sélecteurs. La maintenance périodique des sélecteurs est normale pour tout scraper en production.

Est-il acceptable de stocker les noms d'auteurs que je vois dans les réponses ?

Traitez les noms d'auteurs, les liens de profil et les références comme des données personnelles et évitez de les stocker. Le scraper dans ce guide les abandonne délibérément et ne conserve que la question, le texte de la réponse pour l'analyse agrégée et les nombres de votes. Si vous devez toucher des données personnelles, le RGPD et le CCPA s'appliquent : vous avez besoin d'une base légale et devez honorer les demandes de suppression, donc agréger et supprimer les identités est la valeur par défaut la plus sûre.

Comment éviter d'être bloqué lors du scraping de Quora ?

Gardez votre débit de requêtes bas, espacez les requêtes au lieu de boucler à pleine vitesse, et routez via des IPs résidentielles rotatives de sorte qu'aucune adresse ne déclenche une limite de débit. La Crawling API gère la rotation et un pool d'IPs de confiance pour vous ; si vous construisez votre propre pile, c'est la partie dans laquelle investir. Surveillez les codes de statut et reculez lorsque vous commencez à voir des redirections ou des défis.

Commencer à construire

Crawlez n'importe quel site à grande échelle, sans combattre l'infrastructure.

Crawlbase gère les proxies, les empreintes et les CAPTCHA afin que votre équipe livre des pipelines de données au lieu de maintenir la plomberie de crawl. 1 000 requêtes gratuites, sans carte requise.

En libre-service · Sans appel commercial requis · Volumes de crawl entreprise disponibles