Comprendre pourquoi et comment scraper le Web sans être bloqué ?

hero image blog

Introduction

Le "web scraping" ou "crawling" est le processus qui consiste à extraire des données d'un site web tiers en téléchargeant et en analysant le code HTML pour en extraire les données souhaitées.

"Mais vous devriez utiliser une API pour cela !"

Cependant, tous les sites Web ne proposent pas d'API, et les API n'exposent pas toujours toutes les informations dont vous avez besoin. Il s'agit donc souvent de la seule solution pour extraire les données d'un site Web.

Les cas d'utilisation du Web Scraping sont nombreux :

  • Surveillance des prix du e-commerce
  • Agrégation d'informations
  • Génération de leads
  • SEO (suivi des pages de résultats des moteurs de recherche)
  • Agrégation de données de comptes bancaires
  • Des individus et des chercheurs qui construisent des ensembles de données autrement non disponibles.

Le principal problème est que la plupart des sites web ne veulent pas être scrapés. Ils veulent seulement servir du contenu à de vrais utilisateurs utilisant de vrais navigateurs web (sauf Google - ils veulent tous être scrapés par les robots de Google).

Lorsque vous scrapez, vous ne voulez pas être considéré comme un robot. Il y a 2 façons principales de “paraître”  humain :

  1. Utiliser des outils humains
  2. Imiter le comportement humain.

Cet article vous guidera à travers tous les outils que les sites Web utilisent pour vous bloquer et toutes les façons dont vous pouvez surmonter ces obstacles avec succès.

Emuler l'outil humain : Chrome headless

Pourquoi utiliser la navigation headless ?

Lorsque vous ouvrez votre navigateur et accédez à une page Web, cela signifie presque toujours que vous demandez du contenu à un serveur HTTP. L'une des façons les plus simples d'extraire du contenu d'un serveur HTTP est d'utiliser un outil classique de ligne de commande tel que cURL.

En fait, si vous faites simplement : curl www.google.com, Google a de nombreux moyens de savoir que vous n'êtes pas un humain (par exemple en regardant les en-têtes). Les en-têtes sont de petits éléments d'information qui accompagnent chaque requête HTTP envoyée aux serveurs. 

L'un de ces éléments d'information décrit précisément le client à l'origine de la requête. Il s'agit du tristement célèbre en-tête "User-Agent". Rien qu'en regardant l'en-tête "User-Agent", Google sait que vous utilisez cURL. 

Si vous voulez en savoir plus sur les en-têtes, la page Mozilla est excellente. 

À titre expérimental, allez ici. Cette page Web affiche simplement les informations d'en-tête de votre requête.

Scraper Web - En-tête

Les en-têtes sont faciles à modifier avec cURL, et copier l'en-tête User-Agent d'un navigateur peut faire l'affaire. Dans le monde réel, vous devrez définir plus d'un en-tête. 

Mais il n'est pas difficile de falsifier artificiellement une requête HTTP avec cURL ou toute autre bibliothèque pour que la requête ressemble exactement à une requête faite avec un navigateur. 

Tout le monde sait cela. Donc, pour déterminer si vous utilisez un vrai navigateur, les sites Web vont vérifier quelque chose que cURL et la bibliothèque ne peuvent pas faire : exécuter du code Javascript.

Vous parlez le Javascript ?

Le concept est simple : le site Web intègre un extrait Javascript dans sa page Web qui, une fois exécuté, "déverrouille" la page Web. 

Si vous utilisez un vrai navigateur, vous ne verrez pas la différence. Dans le cas contraire, vous recevrez une page HTML contenant un code Javascript obscur :

Web Scraper - Extrait de code Javascript

Encore une fois, cette solution n'est pas complètement à l'épreuve des balles, principalement parce qu'il est maintenant très facile d'exécuter du Javascript en dehors d'un navigateur avec Node.js. 

Cependant, le web a évolué et il existe d'autres astuces pour déterminer si vous utilisez un vrai navigateur ou non.

Navigation headless

Essayer d'exécuter des snippets Javascript avec Node.js est difficile et peu robuste. 

Dès que le site Web possède un système de contrôle plus compliqué ou qu'il s'agit d'une grosse application : cURL et l'exécution pseudo-JS avec Node.js deviennent inutiles.

La meilleure façon de ressembler à un vrai navigateur est donc d'en utiliser un.

Les navigateurs Headless se comportent comme un vrai navigateur, sauf que vous pourrez facilement les utiliser de manière programmatique. Le plus populaire est Chrome Headless, une option de Chrome qui se comporte comme Chrome sans toute l'interface utilisateur qui l'enveloppe.

La façon la plus simple d'utiliser Chrome Headless est d'appeler un outil qui regroupe toutes les fonctionnalités dans une API simple. Selenium et Puppeteer sont les trois solutions les plus connues.

Toutefois, cela ne suffira pas, car les sites web disposent désormais d'outils qui détectent les navigateurs headless. Cette course aux armements est en cours depuis longtemps.

Si ces solutions peuvent être faciles à mettre en œuvre sur votre ordinateur, il peut être plus délicat de les faire fonctionner à grande échelle sur des serveurs distants.

La gestion d'un grand nombre d'instances Chrome headless est l'un des nombreux problèmes que des outils comme ScrapingBee pourrons vous aider à résoudre. 

Empreintes digitales des navigateurs

Tout le monde, surtout les développeurs font-end, sait que chaque navigateur se comporte différemment. Il s'agit parfois du rendu des CSS, parfois du Javascript, et parfois simplement des propriétés internes. 

La plupart de ces différences sont bien connues et il est désormais possible de détecter si un navigateur est bien celui qu'il prétend être. Cela signifie que le site Web se demande "si toutes les propriétés et tous les comportements du navigateur correspondent à ce que je sais de l'User-Agent envoyé par ce navigateur".

C'est pourquoi il y a une course incessante entre les scrapers de sites web qui veulent se faire passer pour un vrai navigateur et les sites web qui veulent faire la différence entre le headless et le reste.

Cependant, dans cette course, les scrapers web ont tendance à avoir un avantage considérable, voici pourquoi :

La plupart du temps, lorsqu'un code Javascript tente de détecter s'il est exécuté en mode sans affichage, c'est qu'un logiciel malveillant essaie d'échapper à l'empreinte comportementale.

Cela signifie que le code Javascript se comportera bien dans un environnement d'analyse et mal dans les navigateurs réels.

C'est pourquoi l'équipe à l'origine du mode Headless de Chrome s'efforce de le rendre impossible à distinguer du navigateur Web d'un véritable utilisateur afin d'empêcher les logiciels malveillants d'agir de la sorte.

Indirectement, les scrapers web profitent de ce travail sans relâche.

Il faut également savoir que si l'exécution de 20 cURL en parallèle est triviale et que Chrome Headless est relativement facile à utiliser pour les petits cas d'utilisation,. 

Cependant, il peut être délicat à mettre à l'échelle car il utilise beaucoup de RAM : la gestion de plus de 20 instances est un défi.

C'est à peu près tout ce que vous devez savoir sur la façon de faire semblant d'utiliser un vrai navigateur. Voyons maintenant comment se comporter comme un véritable humain.

Empreinte digitale TLS

Qu'est-ce que c'est ?

TLS est l'abréviation de Transport Layer Security (sécurité de la couche de transport) et succède à SSL, qui était en fait la signification du "S" de HTTPS.

Ce protocole garantit la confidentialité et l'intégrité des données entre deux ou plusieurs applications informatiques en communication (dans notre cas, un navigateur web ou un script et un serveur HTTP).

Comme pour l'empreinte du navigateur, l'objectif de l'empreinte TLS est d'identifier de manière unique les utilisateurs en fonction de la façon dont ils utilisent TLS.

Le fonctionnement de ce protocole peut être divisé en deux grandes parties.

  1. Tout d'abord, lorsque le client se connecte au serveur, une vérification TLS se produit. Au cours de cette vérification, de nombreuses demandes sont envoyées entre les deux parties pour s'assurer que chacun est bien celui qu'il prétend être.
  2. Ensuite, si la vérification a réussi, le protocole décrit comment le client et le serveur doivent chiffrer et déchiffrer les données de manière sécurisée. Si vous souhaitez une explication détaillée, consultez cette excellente introduction de Cloudflare.

La plupart des données utilisés pour construire l'empreinte digitale proviennent de la vérification TLS ou du moins de ce que l'on appelle son "empreinte".

À titre informatif, les paramètres d'une empreinte TLS sont les suivants :

  • Version de TLS
  • Version du Handshake
  • Suites de chiffrement supportées
  • Extensions

Si vous souhaitez savoir quelle est votre empreinte TLS, je vous suggère de visiter ce site web.

Comment puis-je changer l’empreinte TLS  ?

L'idéal serait de modifier vos paramètres TLS afin d'accroître votre discrétion lors de l'exploration du Web. Cependant, c'est plus difficile qu'il n'y paraît.

Tout d'abord, comme il n'existe pas beaucoup d'empreintes TLS, la simple randomisation de ces paramètres ne fonctionnera pas. Votre empreinte sera si rare qu'elle sera instantanément signalée comme fausse.

Deuxièmement, les paramètres TLS sont des éléments de bas niveau qui dépendent fortement des dépendances du système. Il n'est donc pas facile de les modifier.

Par exemple, le célèbre module Python requests ne permet pas de modifier l'empreinte TLS.

Voici quelques ressources pour changer la version de TLS et la suite de chiffrement dans votre langage préféré :

Gardez à l'esprit que la plupart de ces bibliothèques dépendent de l'implémentation SSL et TLS de votre système.

OpenSSL est la plus utilisée et vous devrez peut-être changer sa version pour modifier complètement votre empreinte digitale.

Imiter le comportement humain : Proxy, résolution de Captcha et modèles de requête

Proxy

Un être humain utilisant un vrai navigateur demandera rarement 20 pages par seconde au même site Web.

Donc, si vous voulez demander beaucoup de pages au même site Web, vous devez faire croire au site Web que toutes ces demandes proviennent de différents endroits dans le monde, c'est-à-dire de différentes adresses IP.

En d'autres termes, vous devez utiliser des proxies.

Les proxies ne sont pas très chers : ~1$ par IP. Cependant, si vous avez besoin de faire plus de ~10k requêtes par jour sur le même site web, les coûts peuvent monter rapidement, avec des centaines d'adresses nécessaires.

Une chose à prendre en compte est que les IP de proxy doivent être constamment surveillées afin de pouvoir éliminer celle qui ne fonctionne plus et la remplacer.

Il existe plusieurs solutions de proxy sur le marché, voici les fournisseurs de proxy rotatifs les plus utilisés tels que :

Il existe également de nombreuses listes de proxys gratuits et je ne recommande pas de les utiliser car elles sont souvent lentes et peu fiables, et les sites Web proposant ces listes ne sont pas toujours transparents quant à l'emplacement de ces proxys.

Les listes de proxy gratuits sont généralement publiques, et par conséquent, leurs IP seront automatiquement bannies par le site web le plus important.

Si cela vous intéresse (mais déconseillé) voici le site de Freeproxylist :

La qualité du proxy est importante. Les services anti-crawling sont connus pour maintenir une liste interne d'IP de proxy, de sorte que tout trafic provenant de ces IP sera généralement bloqué. Faites attention à choisir un proxy de bonne réputation. C'est pourquoi je recommande d'utiliser un réseau de proxy payant ou de construire le vôtre.

Proxies Mobiles et ISP

Un autre type de proxy que vous pouvez envisager est celui des proxies mobiles, 3g et 4g. Ils sont utiles pour le scraping de sites web difficiles à scrapper en mode mobile, comme les réseaux sociaux.

Les proxys ISP sont également très intéressants, car ils combinent les avantages des proxys résidentiels et la vitesse des datacenters.

Configurer votre propre proxy

Pour construire votre propre proxy, vous pouvez jeter un coup d'œil à Scrapoxy, une excellente API open-source, qui vous permet de construire une API de proxy sur différents fournisseurs de cloud.

Scrapoxy créera un pool de proxy en créant des instances sur différents fournisseurs de cloud (AWS, OVH, Digital Ocean). Ensuite, vous pourrez configurer votre client pour qu'il utilise l'URL de Scrapoxy comme proxy principal, et Scrapoxy assignera automatiquement un proxy dans le pool de proxy.

Scrapoxy est facilement personnalisable pour s'adapter à vos besoins (limite de taux, liste noire...) mais peut être un peu fastidieux à mettre en place.

Vous pouvez également utiliser le réseau TOR, alias The Onion Router. Il s'agit d'un réseau informatique mondial conçu pour acheminer le trafic à travers de nombreux serveurs différents afin de masquer son origine.

L'utilisation de TOR rend la surveillance du réseau et l'analyse du trafic très difficiles. Il existe de nombreux cas d'utilisation de TOR, comme la vie privée, la liberté d'expression, les journalistes dans un régime dictatorial et, bien sûr, les activités illégales.

Dans le contexte du web scraping, TOR peut cacher votre adresse IP et changer l'adresse IP de votre robot toutes les 10 minutes. Les adresses IP des nœuds de sortie TOR sont publiques.

Certains sites Web bloquent le trafic TOR en appliquant une règle simple : si le serveur reçoit une requête provenant de l'un des nœuds de sortie publics de TOR, il la bloque.

C'est pourquoi, dans de nombreux cas, TOR ne vous aidera pas, par rapport aux proxys classiques. Il convient de noter que le trafic transitant par TOR est aussi intrinsèquement beaucoup plus lent en raison du routage multiple.

Les proxys ISP sont également très intéressants, car ils combinent les avantages des proxys résidentiels et la vitesse des data centers.

Captchas

Parfois, les proxys ne suffisent pas. Certains sites Web vous demandent systématiquement de confirmer que vous êtes un humain à l'aide de ce que l'on appelle des CAPTCHA.

La plupart du temps, les CAPTCHAs ne s'affichent que pour les IP suspectes, donc le changement de proxy fonctionnera dans ces cas. Pour les autres cas, vous devrez utiliser un service de résolution de CAPTCHAs (2Captchas et DeathByCaptchas viennent à l'esprit).

Si certaines Captchas peuvent être résolues automatiquement par reconnaissance optique de caractères (OCR), la plus récente doit être résolue à la main.

Ancien captcha, cassable par programme

Google Recaptcha V2 screenshot

Si vous utilisez les services susmentionnés, de l'autre côté de l'appel API, vous aurez des centaines de personnes qui résoudront les CAPTCHAs pour des coûts très bas. Pour cela, embaucher un freelance sur Fiverr à moindre coût peu être une solution envisageable. 

Mais là encore, même si vous résolvez les CAPCHA ou changez de proxy dès que vous en voyez un, les sites web peuvent toujours détecter votre processus d'extraction de données.

Modèle de requête

Un autre outil avancé utilisé par les sites Web pour détecter les scrapers web est la reconnaissance des formulaires. Par conséquent, si vous prévoyez de scraper tous les identifiants de produits e-commerce de 1 à 10 000 pour l'URL www.siteweb.com/produit/, essayez de ne pas le faire de les uns après les autres ou avec un nombre de requêtes par minute toujours constant. 

Vous pouvez, par exemple, scraper un nombre aléatoire de produits sur une période donnée en randomisant le comportement de votre extraction de données. 

Certains sites Web établissent également des statistiques sur l'empreinte du navigateur par point d'accès. Cela signifie que si vous ne modifiez pas certains paramètres dans votre navigateur ou son comportement, vous pourriez être bloqué.

Les sites web ont également tendance à surveiller l'origine du trafic. Par conséquent, si vous voulez scraper un site web au Canada, essayez de ne pas le faire avec des proxys situés en Allemagne.

Mais par expérience, je peux vous dire que la vitesse est le facteur le plus important dans la "reconnaissance des requêtes", donc plus vous scraper lentement, moins vous aurez de chances d'être découvert.

Imiter le comportement de la machine : Rétro-ingénierie des API

Parfois, le serveur attend du client qu'il soit une machine. Dans ces cas là, il est beaucoup plus facile de se cacher.

Rétro-ingénierie des API

En gros, cette "astuce" se résume à deux choses :

  1. Analyser le comportement d'une page web pour trouver des appels d'API intéressants
  2. Récupérer ces appels d'API avec votre code

Par exemple, disons que je veux obtenir tous les commentaires d'un célèbre réseau social. Je remarque que lorsque je clique sur le bouton "charger plus de commentaires", ceci se produit dans mon inspecteur :

Notez que nous filtrons toutes les requêtes, sauf celles de type "XHR", pour éviter le bruit.

Lorsque nous essayons de voir quelle requête est faite et quelle réponse nous obtenons... - bingo !

Faites un clic droit sur l'élément et exportez-le (fichier au format HAR)

Maintenant, si nous regardons l'onglet "Headers", nous devrions avoir tout ce dont nous avons besoin pour rejouer cette requête et comprendre la valeur de chaque paramètre.

Cela nous permettra d'effectuer cette requête à partir d'un simple client HTTP.

Pour faire cela nous allons utiliser notre fichier au format HAR puis l'importer dans un client HTTP préféré (PostMan par exemple).

Cela vous permettra de disposer de tous les paramètres d'une requête fonctionnelle et rendra votre expérimentation beaucoup plus rapide et amusante.

Rétro-ingénierie des applications mobiles

Les mêmes principes s'appliquent à la rétro-ingénierie d'une application mobile. Vous voudrez intercepter la requête que votre application mobile envoie au serveur et la rejouer avec votre code.

Cette tâche est difficile pour 2 raisons :

  • Pour intercepter les demandes, vous aurez besoin d'un proxy Man In The Middle.
Web scraper - Man in the middle
  • Les applications mobiles peuvent prendre l'empreinte de vos requêtes et les masquer plus facilement qu'une application web.

Par exemple, lorsque Pokemon Go est sorti il y a quelques années, des tonnes de personnes ont triché au jeu après avoir fait de la rétro-ingénierie sur les requêtes de l'application mobile.

Ce qu'ils ne savaient pas, c'est que l'application mobile envoyait un paramètre "secret" qui n'était pas envoyé par le script de triche. Il était alors facile d'identifier les tricheurs.

Quelques semaines plus tard, un grand nombre de joueurs ont été bannis pour tricherie.

Voici également un exemple intéressant de quelqu'un qui a réalisé une rétro-ingénierie de l'API de MacDonald.

Conclusion

Voici un récapitulatif de toutes les techniques anti-bots que nous avons vues dans cet article :

J'espère que cet aperçu vous aidera à comprendre le Web Scraping et que vous avez appris beaucoup en lisant cet article.

Notre API de scraping web traite des milliers de requêtes par seconde sans jamais être bloquée. Si vous ne voulez pas perdre trop de temps à tout configurer, n'hésitez pas à essayer ScrapingBee. Les 1 000 premiers appels à l'API sont pour nous :).

J'ai ublié un guide sur les meilleurs outils de scraping web du marché, n'hésitez pas à y jeter un œil !

profil auteur de stephen MESNILDREY
Stephen MESNILDREY
CEO & Fondateur

🔍 Ma passion ? Décrypter, analyser et partager des stratégies puissantes, des logiciels avant-gardistes et des astuces inédites qui boostent votre entreprise et révolutionnent votre secteur.

Vous voulez rester à la pointe ? Vous êtes au bon endroit ! 💡

📩 Abonnez-vous à ma newsletter et recevez chaque semaine :

  • Des conseils pratiques pour réinventer votre business, optimiser votre productivité et stimuler votre créativité
  • Un accès privilégié aux nouvelles stratégies
  • 100% de contenu EXCLUSIF à partager avec vous
  • 0% de choses à vous vendre

L'aventure ne fait que commencer, et elle s'annonce épique ! 🚀

Pour des insights quotidiens et des analyses en temps réel, suivez-moi sur Twitter 📲

Twitter 𝕏 : Connectons- nous !
⚠️ IMPORTANT: Certains liens peuvent-être affiliés et peuvent générer une commission sans coût supplémentaire pour vous si vous optez pour un plan payant. Ces marques - testées et approuvées 👍 - contribuent à maintenir ce contenu gratuit et faire vivre ce site web 🌐