Le guide ultime du Web Scraping avec C++
Raluca Penciuc le 05 Jul 2021
Il y a deux millions d'années, une bande d'hommes des cavernes a compris qu'un caillou sur un bâton pouvait être utile. Les choses n'ont fait que s'emballer à partir de là. Aujourd'hui, nos problèmes concernent moins la fuite devant les tigres à dents de sabre que le fait que des coéquipiers nomment leurs engagements "did sutff".
Si les difficultés ont changé, notre obsession pour la création d'outils permettant de les surmonter est restée la même. Les racleurs de sites web en sont la preuve. Ce sont des outils numériques conçus pour résoudre des problèmes numériques.
Aujourd'hui, nous allons construire un nouvel outil à partir de zéro, mais au lieu d'utiliser des pierres et des bâtons, nous allons utiliser le C++, qui est sans doute plus difficile. Alors, restez à l'écoute pour apprendre comment créer un scraper web en C++ et comment l'utiliser !
Comprendre le web scraping
Quel que soit le langage de programmation que vous choisissez, vous devez comprendre comment fonctionnent les scrappeurs de sites web. Ces connaissances sont essentielles pour écrire le script et disposer d'un outil fonctionnel à la fin de la journée.
Les avantages du web scraping
Il n'est pas difficile d'imaginer qu'un robot effectuant toutes vos recherches à votre place est bien plus efficace que de copier des informations à la main. Les avantages augmentent de façon exponentielle si vous avez besoin de grandes quantités de données. Si vous formez un algorithme d'apprentissage automatique, par exemple, un scraper web peut vous épargner des mois de travail.

Par souci de clarté, passons en revue toutes les façons dont les scrappeurs web peuvent vous aider :
- Passer moins de temps sur des tâches fastidieuses - c'est l'avantage le plus évident. Les scrappers extraient les données aussi rapidement que le chargement de la page par votre navigateur. Donnez au robot une liste d'URL et vous obtiendrez instantanément leur contenu.
- Une plus grande précision des données - la main de l'homme conduit inévitablement à des erreurs humaines. En revanche, le robot récupérera toujours toutes les informations, exactement comme elles sont présentées, et les analysera conformément à vos instructions.
- Conserver une base de données organisée - au fur et à mesure que vous recueillez des données, il peut devenir de plus en plus difficile d'en assurer le suivi. Le scraper ne se contente pas d'obtenir du contenu, il le stocke également dans le format qui vous facilite la vie.
- Utilisez des informations actualisées - dans de nombreuses situations, les données changent d'un jour à l'autre. Il suffit de regarder les marchés boursiers ou les listes de magasins en ligne pour s'en convaincre. Avec quelques lignes de code, votre robot peut explorer les mêmes pages à intervalles fixes et mettre à jour votre base de données avec les informations les plus récentes.
WebScrapingAPI existe pour vous apporter tous ces avantages tout en naviguant autour des différents obstacles que les scrappeurs rencontrent souvent sur le web. Tout cela semble très bien, mais comment cela se traduit-il dans des projets concrets ?
Cas d'utilisation du scraping web
Il existe de nombreuses façons d'utiliser les web scrapers. Les possibilités sont infinies ! Toutefois, certains cas d'utilisation sont plus courants que d'autres.

Détaillons chaque situation :
- Optimisation des moteurs de recherche - L'analyse des pages de résultats de recherche pour vos mots clés est un moyen facile et rapide de déterminer qui vous devez dépasser dans le classement et quel type de contenu peut vous aider à y parvenir.
- Étude de marché - Après avoir vérifié les résultats de vos concurrents dans les recherches, vous pouvez aller plus loin et analyser l'ensemble de leur présence numérique. Utilisez le web scraper pour voir comment ils utilisent le PPC, décrivent leurs produits, quel type de modèle de tarification ils utilisent, etc. En fait, toutes les informations publiques sont à portée de main.
- Protection de la marque - Les gens parlent de votre marque. Dans l'idéal, il s'agit de bonnes choses, mais ce n'est pas une garantie. Un robot est bien équipé pour naviguer sur les sites d'évaluation et les plateformes de médias sociaux et vous signaler chaque fois que votre marque est mentionnée. Quoi qu'ils disent, vous serez prêt à représenter les intérêts de votre marque.
- Génération de leads - Il est rarement facile de combler le fossé qui sépare votre équipe de vente de vos clients potentiels sur l'internet. En revanche, cela devient beaucoup plus facile lorsque vous utilisez un robot de raclage web pour collecter des informations de contact dans des registres d'entreprises en ligne tels que les Pages Jaunes ou Linkedin.
- Marketing de contenu - La création d'un contenu de haute qualité demande beaucoup de travail, cela ne fait aucun doute. Vous devez non seulement trouver des sources crédibles et une mine d'informations, mais aussi apprendre le type de ton et d'approche qui plaira à votre public. Heureusement, ces étapes deviennent triviales si vous avez un robot pour faire le gros du travail.
Il existe de nombreux autres exemples. Bien entendu, vous pouvez également développer une toute nouvelle façon d'utiliser l'extraction de données à votre avantage. Nous encourageons toujours l'utilisation créative de notre API.
Les défis du web scraping
Aussi précieux que soient les web scrapers, tout n'est pas rose et arc-en-ciel. Certains sites web n'aiment pas être visités par des robots. Il n'est pas difficile de programmer votre scraper pour éviter de mettre à rude épreuve le site web visité, mais leur vigilance à l'égard des bots est justifiée. Après tout, le site n'est peut-être pas en mesure de faire la différence entre un robot bien élevé et un robot malveillant.
C'est pourquoi les gratte-papiers doivent faire face à un certain nombre de défis lorsqu'ils sont en déplacement.

Les obstacles les plus problématiques sont les suivants :
- Blocage des adresses IP - Il existe plusieurs façons de déterminer si un visiteur est un humain ou une machine. La marche à suivre après l'identification d'un robot est toutefois beaucoup plus simple : le blocage des adresses IP. Bien que cela ne se produise pas souvent si vous prenez les précautions nécessaires, il est conseillé de préparer un pool de serveurs mandataires afin de pouvoir continuer à extraire des données même si une IP est bloquée.
- Empreinte du navigateur - Chaque requête que vous envoyez à un site web divulgue également certaines de vos informations. L'adresse IP est l'exemple le plus courant, mais les en-têtes de requête indiquent également au site votre système d'exploitation, votre navigateur et d'autres petits détails. Si un site web utilise ces informations pour identifier l'expéditeur des requêtes et se rend compte que vous naviguez beaucoup plus vite qu'un être humain ne le devrait, vous pouvez vous attendre à être rapidement bloqué.
- Rendu Javascript - La plupart des sites web modernes sont dynamiques. En d'autres termes, ils utilisent du code javascript pour personnaliser les pages en fonction de l'utilisateur et offrir une expérience plus personnalisée. Le problème est que les robots simples restent bloqués sur ce code car ils ne peuvent pas l'exécuter. Résultat : le scraper récupère le code javascript au lieu du code HTML qui contient les informations pertinentes.
- Captchas - Lorsque les sites web ne sont pas sûrs de savoir si un visiteur est un humain ou un robot, ils le redirigent vers une page Captcha. Pour nous, il s'agit au mieux d'un léger désagrément, mais pour les robots, c'est généralement un arrêt complet, à moins qu'ils n'aient inclus des scripts de résolution de Captcha.
- Limitation des requêtes - Le moyen le plus simple d'empêcher les visiteurs de submerger le serveur du site web est de limiter le nombre de requêtes qu'une seule adresse IP peut envoyer pendant une période déterminée. Une fois ce nombre atteint, le scrapeur peut être contraint d'attendre la fin de la temporisation ou de résoudre un Captcha. Dans tous les cas, ce n'est pas bon pour votre projet d'extraction de données.
Comprendre le web
Si vous voulez construire un scraper web, vous devez connaître quelques concepts clés du fonctionnement de l'internet. Après tout, votre robot n'utilisera pas seulement l'internet pour collecter des données, mais il devra aussi se fondre dans la masse des milliards d'utilisateurs.
Nous aimons considérer les sites web comme des livres, et lire une page signifie seulement la feuilleter jusqu'au bon numéro et la regarder. En réalité, il s'agit plutôt de télégrammes envoyés entre vous et le livre. Vous demandez une page et elle vous est envoyée. Puis vous commandez la suivante, et la même chose se produit.
Tout ce va-et-vient se fait par l'intermédiaire du protocole HTTP (Hypertext Transfer Protocol). Pour que vous, le visiteur, puissiez voir une page, votre navigateur envoie une requête HTTP et reçoit une réponse HTTP du serveur. Le contenu que vous souhaitez sera inclus dans cette réponse.
Les requêtes HTTP sont composées de quatre éléments :
- L'URL (Uniform Resource Locator) est l'adresse à laquelle vous envoyez des requêtes. Elle mène à une ressource unique qui peut être une page web entière, un fichier unique ou tout ce qui se trouve entre les deux.
- La méthode indique le type d'action que vous souhaitez entreprendre. La méthode la plus courante est GET, qui permet de récupérer des données sur le serveur. Voici une liste des méthodes les plus courantes.
- Les en-têtes sont des métadonnées qui donnent forme à votre demande. Par exemple, si vous devez fournir un mot de passe ou des informations d'identification pour accéder à des données, ils sont placés dans un en-tête spécifique. Si vous souhaitez recevoir des données au format JSON, vous le mentionnez dans un en-tête. User-Agent est l'un des en-têtes les plus connus dans le domaine du web scraping, car les sites web l'utilisent pour identifier les visiteurs.
- Le corps est la partie générale de la demande qui stocke les données. Si vous obtenez du contenu, cette partie sera probablement vide. En revanche, si vous souhaitez envoyer des informations au serveur, vous les trouverez ici.
Après avoir envoyé la demande, vous obtiendrez une réponse même si la demande n'a pas reçu de données. La structure se présente comme suit :
- Le code d'état est un code à trois chiffres qui vous indique d'un coup d'œil ce qui s'est passé. En bref, un code commençant par "2" signifie généralement un succès, tandis qu'un code commençant par "4" signale un échec.
- Les en-têtes ont la même fonction que leurs homologues. Par exemple, si vous recevez un type de fichier spécifique, un en-tête vous indiquera le format.
- Le corps est également présent. Si vous avez demandé un contenu avec GET et que cela a réussi, vous trouverez les données ici.
Les API REST utilisent les protocoles HTTP, tout comme les navigateurs web. Ainsi, si vous décidez que les web scrapers C++ représentent trop de travail, ces informations vous seront également utiles si vous choisissez d'utiliser WebScrapingAPI, qui gère déjà tous les défis liés à l'extraction de données.
Comprendre le C++
En termes de langages de programmation, on ne peut pas faire plus vieux jeu que le C et le C++. Le langage est apparu en 1985 comme la version perfectionnée du "C avec des classes".
Bien que le C++ soit utilisé pour la programmation générale, ce n'est pas vraiment le premier langage que l'on envisagerait pour un scraper web. Il présente certains inconvénients, mais l'idée n'est pas dénuée d'avantages. Explorons-les, d'accord ?
Le C++ est orienté objet, ce qui signifie qu'il utilise des classes, l'abstraction de données et l'héritage pour rendre votre code plus facile à réutiliser et à adapter à différents besoins. Les données étant traitées comme des objets, il est plus facile de les stocker et de les analyser.
De nombreux développeurs connaissent au moins un peu le langage C++. Même si vous ne l'avez pas appris à l'université, vous (ou un coéquipier) connaissez probablement un peu de C++. Cette connaissance s'étend à l'ensemble de la communauté des développeurs de logiciels, de sorte qu'il ne vous sera pas difficile d'obtenir un deuxième avis sur le code.
Le C++ est très évolutif. Si vous commencez par un petit projet et que vous décidez que le web scraping est fait pour vous, la majeure partie du code est réutilisable. Quelques ajustements ici et là, et vous serez prêt à traiter des volumes de données beaucoup plus importants.
D'autre part, le C++ est un langage de programmation statique. Bien qu'il garantisse une meilleure intégrité des données, il n'est pas aussi utile que les langages dynamiques lorsqu'il s'agit d'Internet.
De plus, le C++ n'est pas bien adapté à la construction de crawlers. Ce n'est peut-être pas un problème si vous ne voulez qu'un scraper. Mais si vous souhaitez ajouter un crawler pour générer des listes d'URL, le C++ n'est pas un bon choix.
Ok, nous avons parlé de beaucoup de choses importantes, mais venons-en à l'essentiel de l'article - coder un scraper web en C++.
Construire un scraper web avec C++
Conditions préalables
- IDE C++. Dans ce guide, nous utiliserons Visual Studio.
- vcpkg est un gestionnaire de paquets en C/C++ créé et soutenu par Windows
- cpr est une bibliothèque C/C++ pour les requêtes HTTP, construite comme une enveloppe pour le classique cURL et inspirée par la bibliothèque de requêtes de Python.
- gumbo est un analyseur HTML entièrement écrit en C, qui fournit des wrappers pour de nombreux langages de programmation, y compris C++.
Mise en place de l'environnement
1. Après avoir téléchargé et installé Visual Studio, créez un projet simple en utilisant le modèle Console App.

2. Nous allons maintenant configurer notre gestionnaire de paquets. Vcpkg fournit un tutoriel bien écrit pour vous permettre de démarrer aussi rapidement que possible.
Remarque : une fois l'installation terminée, il serait utile de définir une variable d'environnement afin de pouvoir exécuter vcpkg à partir de n'importe quel endroit de l'ordinateur.
3. Il est maintenant temps d'installer les bibliothèques dont nous avons besoin. Si vous avez défini une variable d'environnement, ouvrez un terminal et exécutez les commandes suivantes :
> vcpkg install cpr
> vcpkg install gumbo
> vcpkg integrate install
Si vous n'avez pas défini de variable d'environnement, naviguez simplement jusqu'au dossier dans lequel vous avez installé vcpkg, ouvrez une fenêtre de terminal et exécutez les mêmes commandes.
Les deux premières commandes installent les paquets dont nous avons besoin pour construire notre scraper, et la troisième nous aide à intégrer les bibliothèques dans notre projet sans effort.
Choisissez un site web et inspectez le code HTML
Et maintenant, nous sommes prêts ! Avant de construire le web scraper, nous devons choisir un site web et inspecter son code HTML.
Nous sommes allés sur Wikipédia et avons choisi une page au hasard dans la section "Saviez-vous que...". La page scrappée aujourd'hui sera donc l'article de Wikipédia sur la défense des graines de pavot, et nous en extrairons certains composants. Mais d'abord, jetons un coup d'œil à la structure de la page. Cliquez avec le bouton droit de la souris n'importe où dans l'article, puis sur "Inspecter l'élément" et voilà ! Le HTML est à nous.

Extraire le titre
Nous pouvons maintenant commencer à écrire le code. Pour extraire les informations, nous devons télécharger le HTML localement. Tout d'abord, importez les bibliothèques que nous venons de télécharger :
#include <iostream>
#include <fstream>
#include "cpr/cpr.h"
#include "gumbo.h"
Nous envoyons ensuite une requête HTTP au site web cible pour récupérer le code HTML.
std::string extract_html_page()
{
cpr::Url url = cpr::Url{"https://en.wikipedia.org/wiki/Poppy_seed_defence"};
cpr::Response response = cpr::Get(url);
return response.text;
}
int main()
{
std::string page_content = extract_html_page();
}
La variable page_content contient maintenant le code HTML de l'article, et nous allons l'utiliser pour extraire les données dont nous avons besoin. C'est là que la bibliothèque gumbo s'avère utile.
Nous utilisons la méthode gumbo_parse pour convertir la chaîne de contenu de la page précédente en un arbre HTML, puis nous appelons notre fonction Search_for_title pour le nœud racine.
int main()
{
std::string page_content = extract_html_page();
GumboOutput* parsed_response = gumbo_parse(page_content.c_str());
search_for_title(parsed_response->root);
// free the allocated memory
gumbo_destroy_output(&kGumboDefaultOptions, parsed_response);
}
The called function will traverse the HTML tree in-depth to look for the <h1> tag by making recursive calls. When it finds the title, it’s displaying it in the console and will exit the execution.
void search_for_title(GumboNode* node)
{
if (node->type != GUMBO_NODE_ELEMENT)
return;
if (node->v.element.tag == GUMBO_TAG_H1)
{
GumboNode* title_text = static_cast<GumboNode*>(node->v.element.children.data[0]);
std::cout << title_text->v.text.text << "\n";
return;
}
GumboVector* children = &node->v.element.children;
for (unsigned int i = 0; i < children->length; i++)
search_for_title(static_cast<GumboNode*>(children->data[i]));
}
Extraire les liens
Le même principe est appliqué pour le reste des balises, en parcourant l'arbre et en obtenant ce qui nous intéresse. Récupérons tous les liens et extrayons leur attribut href.
void search_for_links(GumboNode* node)
{
if (node->type != GUMBO_NODE_ELEMENT)
return;
if (node->v.element.tag == GUMBO_TAG_A)
{
GumboAttribute* href = gumbo_get_attribute(&node->v.element.attributes, "href");
if (href)
std::cout << href->value << "\n";
}
GumboVector* children = &node->v.element.children;
for (unsigned int i = 0; i < children->length; i++)
{
search_for_links(static_cast<GumboNode*>(children->data[i]));
}
}
Vous voyez ? C'est à peu près le même code, à l'exception de la balise que nous recherchons. La méthode gumbo_get_attribute peut extraire n'importe quel attribut que nous nommons. Vous pouvez donc l'utiliser pour rechercher des classes, des ID, etc.
Il est essentiel de vérifier la valeur nulle de l'attribut avant de l'afficher. Dans les langages de programmation de haut niveau, cette vérification n'est pas nécessaire, car elle affichera simplement une chaîne vide, mais en C++, le programme se bloquera.
Écriture dans un fichier CSV
Il y a de nombreux liens, tous mélangés dans le contenu. Et il s'agit d'un article très court. Sauvegardons-les donc tous en externe et voyons comment nous pouvons les distinguer.
Tout d'abord, nous créons et ouvrons un fichier CSV. Nous le faisons en dehors de la fonction, juste à côté des importations. Notre fonction est récursive, ce qui signifie que nous aurons BEAUCOUP de fichiers si elle crée un nouveau fichier à chaque fois qu'elle est appelée.
std::ofstream writeCsv("links.csv") ;
Ensuite, dans notre fonction principale, nous écrivons la première ligne du fichier CSV juste avant d'appeler la fonction pour la première fois. N'oubliez pas de fermer le fichier une fois l'exécution terminée.
writeCsv << "type,link" << "\n";
search_for_links(parsed_response->root);
writeCsv.close();
Now, we write its content. In our search_for_links function, when we find a <a> tag, instead of displaying in the console now we do this:
if (node->v.element.tag == GUMBO_TAG_A)
{
GumboAttribute* href = gumbo_get_attribute(&node->v.element.attributes, "href");
if (href)
{
std::string link = href->value;
if (link.rfind("/wiki") == 0)
writeCsv << "article," << link << "\n";
else if (link.rfind("#cite") == 0)
writeCsv << "cite," << link << "\n";
else
writeCsv << "other," << link << "\n";
}
}
Nous prenons la valeur de l'attribut href avec ce code et la plaçons dans 3 catégories : articles, citations, et le reste.

Bien entendu, vous pouvez aller beaucoup plus loin et définir vos propres types de liens, comme ceux qui ressemblent à un article mais qui sont en fait un fichier, par exemple.
Alternatives au scraping web
Vous savez maintenant comment construire votre propre scraper web en C++. Sympa, non ?
Pourtant, vous vous êtes peut-être dit à un moment donné : "Ça commence à être plus compliqué que ça n'en vaut la peine", et nous comprenons tout à fait. À vrai dire, coder un scraper est une excellente expérience d'apprentissage, et les programmes sont adaptés à de petits ensembles de données, mais c'est à peu près tout.
Une API de scraping web est votre meilleure option si vous avez besoin d'un outil d'extraction de données rapide, fiable et évolutif. En effet, elle est dotée de toutes les fonctionnalités dont vous avez besoin, telles qu'un pool de proxy rotatif, un rendu Javascript, des résolveurs Captcha, des options de géolocalisation, et bien d'autres encore.
Vous ne me croyez pas ? Alors vous devriez voir par vous-même ! Commencez votre essai gratuit de WebScrapingAPI et découvrez à quel point le web scraping peut être accessible !
Nouvelles et mises à jour
Restez au courant des derniers guides et nouvelles sur le web scraping en vous inscrivant à notre lettre d'information.
We care about the protection of your data. Read our <l>Privacy Policy</l>.Privacy Policy.

Articles connexes

Apprenez quel est le meilleur navigateur pour contourner les systèmes de détection de Cloudflare lorsque vous faites du web scraping avec Selenium.


Découvrez comment extraire et organiser efficacement des données pour le web scraping et l'analyse de données grâce à l'analyse de données, aux bibliothèques d'analyse HTML et aux métadonnées schema.org.


Les sélecteurs XPath sont-ils meilleurs que les sélecteurs CSS pour le web scraping ? Découvrez les points forts et les limites de chaque méthode et faites le bon choix pour votre projet !
