Comprendre le web scraping
Quel que soit le langage de programmation que vous choisissez, vous devez comprendre comment fonctionnent les web scrapers. Ces connaissances sont essentielles pour écrire le script et obtenir un outil fonctionnel au final.
Les avantages du web scraping
Il n’est pas difficile d’imaginer qu’un bot effectuant toutes vos recherches à votre place est bien plus efficace que de copier des informations à la main. Les avantages sont exponentiels si vous avez besoin de grandes quantités de données. Si vous entraînez un algorithme d’apprentissage automatique, par exemple, un web scraper peut vous faire gagner des mois de travail.
Pour plus de clarté, passons en revue toutes les façons dont les scrapers web peuvent vous aider :
- Passez moins de temps sur des tâches fastidieuses — c'est l'avantage le plus évident. Les scrapers extraient les données aussi vite que votre navigateur mettrait à charger la page. Donnez au bot une liste d'URL, et vous obtenez instantanément leur contenu.
- Bénéficiez d'une plus grande précision des données — l'intervention humaine entraîne inévitablement des erreurs humaines. En comparaison, le bot extraira toujours toutes les informations, exactement telles qu'elles sont présentées, et les analysera selon vos instructions.
- Conservez une base de données organisée — à mesure que vous collectez des données, il peut devenir de plus en plus difficile de garder une trace de tout. Le scraper ne se contente pas de récupérer le contenu, il le stocke également dans le format qui vous facilite le plus la vie.
- Utilisez des informations à jour — dans de nombreux cas, les données changent d’un jour à l’autre. Prenez par exemple les marchés boursiers ou les annonces des boutiques en ligne. En quelques lignes de code, votre bot peut extraire les mêmes pages à intervalles réguliers et mettre à jour votre base de données avec les dernières informations.
WebScrapingAPI a pour but de vous offrir tous ces avantages tout en contournant les différents obstacles que les scrapers rencontrent souvent sur le Web. Tout cela semble formidable, mais comment cela se traduit-il en projets concrets ?
Cas d'utilisation du web scraping
Il existe de nombreuses façons d'utiliser les robots de scraping. Les possibilités sont infinies ! Certains cas d'utilisation sont toutefois plus courants que d'autres.
Examinons chaque situation plus en détail :
- Optimisation pour les moteurs de recherche — Le scraping des pages de résultats de recherche pour vos mots-clés est un moyen simple 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 performances de vos concurrents dans les résultats de recherche, vous pouvez aller plus loin et analyser l'ensemble de leur présence numérique. Utilisez le scraper web pour voir comment ils utilisent le PPC, comment ils décrivent leurs produits, quel type de modèle de tarification ils utilisent, etc. En gros, toutes les informations publiques sont à portée de main.
- Protection de la marque — Les gens parlent de votre marque. Idéalement, ce ne sont que des commentaires positifs, mais ce n'est pas garanti. Un bot est parfaitement équipé pour parcourir les sites d'avis et les plateformes de réseaux sociaux et vous signaler chaque fois que votre marque est mentionnée. Quoi qu'ils en disent, vous serez prêt à défendre les intérêts de votre marque.
- Génération de prospects — Il est rarement facile de faire le lien entre votre équipe commerciale et les clients potentiels sur Internet. Eh bien, cela devient beaucoup plus simple dès lors que vous utilisez un bot de web scraping pour collecter des coordonnées dans des annuaires professionnels en ligne tels que les Pages Jaunes ou LinkedIn.
- Marketing de contenu — Créer du contenu de haute qualité demande beaucoup de travail, cela ne fait aucun doute. Vous devez non seulement trouver des sources fiables et une mine d’informations, mais aussi déterminer le ton et l’approche qui plairont à votre public. Heureusement, ces étapes deviennent insignifiantes si vous disposez d’un bot pour faire le gros du travail.
Il existe de nombreux autres exemples. Bien sûr, vous pourriez é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 robots de scraping, tout n'est pas rose. Certains sites web n'apprécient pas d'être visités par des robots. Il n'est pas difficile de programmer votre robot pour éviter de surcharger le site visité, mais leur vigilance face aux robots est justifiée. Après tout, le site pourrait ne pas être en mesure de faire la différence entre un robot bien élevé et un robot malveillant.
Par conséquent, les scrapers se heurtent à quelques défis lorsqu'ils sont en activité.
Les obstacles les plus problématiques sont les suivants :
- Blocage d'IP — Il existe plusieurs façons de déterminer si un visiteur est un humain ou une machine. La marche à suivre après avoir identifié un bot est toutefois beaucoup plus simple : le blocage d'IP. Bien que cela n'arrive pas souvent si vous prenez les précautions nécessaires, il est tout de même judicieux de disposer d'un pool de proxys afin de pouvoir continuer à extraire des données même si une adresse IP est bannie.
- Empreinte digitale du navigateur — Chaque requête que vous envoyez à un site web révèle également certaines de vos informations. L'adresse IP en 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 bien plus rapidement qu'un humain ne le ferait, vous pouvez vous attendre à être rapidement bloqué.
- Rendu JavaScript — La plupart des sites web modernes sont dynamiques. Autrement dit, ils utilisent du code JavaScript pour personnaliser les pages en fonction de l'utilisateur et offrir une expérience sur mesure. Le problème est que les bots simples se bloquent sur ce code, car ils ne peuvent pas l'exécuter. Résultat : le scraper récupère du code JavaScript au lieu du code HTML prévu qui contient les informations pertinentes.
- Captchas — Lorsque les sites web ne sont pas sûrs qu’un visiteur est un humain ou un bot, ils le redirigent vers une page Captcha. Pour nous, c’est au mieux un léger désagrément, mais pour les bots, c’est généralement un arrêt complet ; à moins qu’ils ne disposent de scripts permettant de résoudre les Captchas.
- Limitation des requêtes — Le moyen le plus simple d'empêcher les visiteurs de surcharger le serveur du site web est de limiter le nombre de requêtes qu'une seule adresse IP peut envoyer dans un laps de temps donné. Une fois ce nombre atteint, le scraper devra peut-être attendre que le délai expire, ou 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 souhaitez créer un scraper web, vous devez connaître quelques concepts clés du fonctionnement d’Internet. Après tout, votre bot n’utilisera pas seulement Internet pour collecter des données, mais il devra également se fondre parmi les milliards d’autres utilisateurs.
Nous aimons comparer les sites web à des livres, et lire une page revient simplement à tourner la page au bon numéro et à la consulter. En réalité, cela s'apparente davantage à des télégrammes échangés entre vous et le livre. Vous demandez une page, et elle vous est envoyée. Puis vous commandez la suivante, et le même processus se répète.
Tout cet échange s'effectue via le 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 se composent de quatre éléments :
- L'URL (Uniform Resource Locator) est l'adresse à laquelle vous envoyez vos requêtes. Elle mène à une ressource unique qui peut être une page web entière, un fichier unique ou tout autre élément intermédiaire.
- La méthode indique le type d'action que vous souhaitez effectuer. La méthode la plus courante est GET, qui permet de récupérer des données depuis le serveur. Voici une liste des méthodes les plus courantes.
- Les en-têtes sont des métadonnées qui structurent votre requête. Par exemple, si vous devez fournir un mot de passe ou des identifiants pour accéder à des données, ceux-ci sont placés dans un en-tête spécifique. Si vous souhaitez recevoir des données au format JSON en particulier, vous l'indiquez dans un en-tête. User-Agent est l'un des en-têtes les plus connus en matière de web scraping, car les sites web l'utilisent pour identifier les visiteurs.
- Le corps (Body) est la partie polyvalente de la requête qui stocke les données. Si vous récupérez du contenu, il sera probablement vide. En revanche, lorsque vous souhaitez envoyer des informations au serveur, celles-ci se trouveront ici.
Après avoir envoyé la requête, vous recevrez une réponse même si la requête n'a pas réussi à récupérer de données. La structure se présente comme suit :
- Le code d'état est un code à trois chiffres qui vous indique d'un seul coup d'œil ce qui s'est passé. En bref, un code commençant par « 2 » signifie généralement que la requête a abouti, tandis qu'un code commençant par « 4 » signale un échec.
- Les en-têtes ont la même fonction que leurs équivalents. 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é du contenu avec GET et que la requête aboutit, vous trouverez les données ici.
Les API REST utilisent les protocoles HTTP, tout comme les navigateurs web. Ainsi, si vous estimez que les scrapers web en C++ demandent 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 matière de langages de programmation, on ne peut pas faire plus « old school » que le C et le C++. Ce langage est apparu en 1985 comme la version perfectionnée du « C avec classes ».
Bien que le C++ soit utilisé pour la programmation générale, ce n’est pas vraiment le premier langage auquel on penserait pour un web scraper. Il présente certains inconvénients, mais l’idée n’est pas sans mérite. 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 faciliter la réutilisation et la réorientation de votre code en fonction de 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 ont au moins quelques notions de C++. Même si vous ne l'avez pas étudié à l'université, vous (ou un collègue) en connaissez probablement un peu. Cela vaut pour l'ensemble de la communauté des développeurs, il ne vous sera donc pas difficile d'obtenir un deuxième avis sur le code.
Le C++ est hautement évolutif. Si vous commencez par un petit projet et décidez que le web scraping vous convient, la majeure partie du code est réutilisable. Quelques ajustements ici et là, et vous serez prêt à gérer des volumes de données bien plus importants.
D'un autre côté, le C++ est un langage de programmation statique. Bien que cela 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 création de robots d'indexation. Cela ne posera peut-être pas de problème si vous ne voulez qu'un scraper. Mais si vous comptez ajouter un robot d'indexation pour générer des listes d'URL, le C++ n'est pas un bon choix.
Bon, nous avons abordé de nombreux points importants, mais passons au cœur de l'article : la programmation d'un scraper web en C++.
Créer un scraper web avec le C++
Prérequis
- Un IDE C++. Dans ce guide, nous utiliserons Visual Studio.
- vcpkg est un gestionnaire de paquets C/C++ créé et maintenu par Windows
- cpr est une bibliothèque C/C++ pour les requêtes HTTP, conçue comme un wrapper pour le classique cURL et inspirée de la bibliothèque Python requests.
- gumbo est un analyseur HTML entièrement écrit en C, qui fournit des wrappers pour plusieurs langages de programmation, dont le C++.
Configuration de l'environnement
1. Après avoir téléchargé et installé Visual Studio, créez un projet simple à l'aide d'un modèle d'application console.
2. Nous allons maintenant configurer notre gestionnaire de paquets. Vcpkg fournit un tutoriel bien rédigé pour vous permettre de démarrer le plus rapidement possible.
Remarque : une fois l'installation terminée, il est recommandé de définir une variable d'environnement afin de pouvoir exécuter vcpkg depuis n'importe quel emplacement sur votre 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 n'importe quel 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, accédez simplement 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 créer notre scraper, et la troisième nous aide à intégrer facilement les bibliothèques dans notre projet.
Choisissez un site web et inspectez le code HTML
Et voilà, nous sommes prêts ! Avant de créer le scraper web, 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 « Le saviez-vous… ». La page que nous allons scraper aujourd’hui sera donc l’article Wikipédia sur la défense aux graines de pavot, et nous en extrairons certains éléments. Mais avant cela, examinons la structure de la page. Faites un clic droit n’importe où sur l’article, puis sur « Inspecter l’élément » et voilà ! Le code HTML est à nous.

Extraire le titre
Nous pouvons maintenant commencer à écrire le code. Pour extraire les informations, nous devons télécharger le code HTML localement. Commençons par importer les bibliothèques que nous venons de télécharger :
#include <iostream>
#include <fstream>
#include "cpr/cpr.h"
#include "gumbo.h"
Ensuite, nous effectuons une requête HTTP vers le 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 désormais 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 page_content 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);
}
La fonction appelée va parcourir l'arborescence HTML en profondeur pour rechercher la balise <h1> en effectuant des appels récursifs. Lorsqu'elle trouve le titre, elle l'affiche dans la console et quitte l'exécution.
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 s'applique aux autres balises : parcourir l'arborescence et récupérer 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 pratiquement 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 lui indiquons. Vous pouvez donc l'utiliser pour rechercher des classes, des identifiants, etc.
Il est essentiel de vérifier que la valeur de l'attribut n'est pas nulle avant de l'afficher. Dans les langages de programmation de haut niveau, cela n'est pas nécessaire, car cela affichera simplement une chaîne vide, mais en C++, le programme plantera.
Écrire dans un fichier CSV
Il y a de nombreux liens ici et là, dispersés dans tout le contenu. Et cet article était pourtant très court. Enregistrons-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 en crée un nouveau à 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();
À présent, nous écrivons son contenu. Dans notre fonction search_for_links, lorsque nous trouvons une balise <a>, au lieu de l'afficher dans la console, nous procédons comme suit :
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 récupérons la valeur de l'attribut href avec ce code et la classons en 3 catégories : articles, citations et le reste.
Bien sûr, vous pouvez aller beaucoup plus loin et définir vos propres types de liens, comme ceux qui ressemblent à un article mais qui sont en réalité un fichier, par exemple.
Alternatives au web scraping
Vous savez désormais comment créer votre propre scraper web avec 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 vous comprenons parfaitement. À vrai dire, coder un scraper est une excellente expérience d'apprentissage, et ces programmes conviennent pour de petits ensembles de données, mais c'est à peu près tout.
Une API de web scraping est votre meilleure option si vous avez besoin d’un outil d’extraction de données rapide, fiable et évolutif. En effet, elle offre toutes les fonctionnalités dont vous avez besoin, comme un pool de proxys rotatifs, le rendu Javascript, des solveurs de Captcha, des options de géolocalisation, et bien plus encore.
Vous ne me croyez pas ? Alors voyez par vous-même ! Commencez votre essai gratuit de WebScrapingAPI et découvrez à quel point le web scraping peut être accessible !




