Retour au blog
Les techniques de web scraping
Raluca Penciuc3 février 202311 min de lecture

Les en-têtes HTTP : les bases. Comment les utiliser pour un web scraping efficace

Les en-têtes HTTP : les bases. Comment les utiliser pour un web scraping efficace

Comprendre les en-têtes HTTP

Les en-têtes HTTP sont des paires clé-valeur que vous envoyez dans le cadre d'une requête ou d'une réponse HTTP. Elles sont séparées par deux points et un espace, et leurs noms (clés) ne sont pas sensibles à la casse.

Vous pouvez regrouper les en-têtes HTTP en différentes catégories, en fonction de leur fonction et de la direction dans laquelle vous les envoyez. Ces catégories comprennent :

  • les en-têtes généraux : s'appliquent à la fois aux messages de requête et de réponse
  • en-têtes de requête : contiennent davantage d'informations sur la ressource que vous souhaitez récupérer, ou sur le client qui effectue la requête
  • en-têtes de réponse : contiennent des informations supplémentaires sur la réponse, telles que son emplacement ou le serveur qui la fournit
  • en-têtes d'entité : contiennent des informations sur le corps de la ressource, telles que sa taille ou son type MIME
  • en-têtes d'extension : utilisés pour assurer la compatibilité ascendante

Les en-têtes HTTP fournissent un large éventail d'informations, notamment le type de requête que vous effectuez, le navigateur que vous utilisez et toute information supplémentaire dont le serveur a besoin pour traiter la requête.

Ils vous permettent également de fournir des informations d'authentification et de sécurité, de contrôler la mise en cache et la compression, et de spécifier la langue et le jeu de caractères de la requête.

Par exemple, voici les en-têtes que Chrome envoie lors de l'accès à youtube.com :

:authority: www.youtube.com

:method: GET

:path: /

:scheme: https

accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9

accept-encoding: gzip, deflate, br

accept-language: en-US,en;q=0.9

cache-control: no-cache

pragma: no-cache

referer: https://www.google.com/

sec-ch-ua: "Not_A Brand";v="99", "Google Chrome";v="109", "Chromium";v="109"

sec-ch-ua-arch: "x86"

sec-ch-ua-bitness: "64"

sec-ch-ua-full-version: "109.0.5414.75"

sec-ch-ua-full-version-list: "Not_A Brand";v="99.0.0.0", "Google Chrome";v="109.0.5414.75", "Chromium";v="109.0.5414.75"

sec-ch-ua-mobile: ?0

sec-ch-ua-model: ""

sec-ch-ua-platform: "Windows"

sec-ch-ua-platform-version: "15.0.0"

sec-ch-ua-wow64: ?0

sec-fetch-dest: document

sec-fetch-mode: navigate

sec-fetch-site: same-origin

sec-fetch-user: ?1

upgrade-insecure-requests: 1

user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36

x-client-data: CIm2yQEIorbJAQjEtskBCKmdygEI5PDKAQiWocsBCKr2zAEI7oLNAQibiM0BCLqIzQEI9YjNAQ==

Decoded:

message ClientVariations {

  // Active client experiment variation IDs.

  repeated int32 variation_id = [3300105, 3300130, 3300164, 3313321, 3324004, 3330198, 3357482, 3359086, 3359771, 3359802, 3359861];

}

Comprendre les cookies Web

Les cookies Web, ou cookies HTTP, sont de petits fichiers texte qu'un site Web stocke dans le navigateur de l'utilisateur. Par la suite, chaque fois que l'utilisateur envoie une nouvelle requête au site Web, les cookies sont automatiquement inclus.

Ils sont identifiables de manière unique, et vous pouvez les trouver sous la forme :

  • cookies de session : ils sont temporaires et expirent lorsque l'utilisateur ferme le navigateur
  • cookies persistants : ils ont une date d'expiration spécifique et restent sur l'appareil de l'utilisateur jusqu'à leur expiration ou leur suppression par l'utilisateur.

Les sites web utilisent des cookies pour personnaliser l'expérience de l'utilisateur. Cela peut inclure la mémorisation de ses identifiants de connexion et la conservation du contenu de son panier d'achat, afin de comprendre comment les utilisateurs interagissent avec le site web et de leur proposer des publicités ciblées.

En prenant à nouveau youtube.com comme exemple, nous pouvons voir ce que les cookies stockent :

cookie: CONSENT=YES+srp.gws-20210816-0-RC3.ro+FX+801; __Secure-3PAPISID=jG4abs_wYhyzcDG5/A2yfWlePlb1U9fglf; VISITOR_INFO1_LIVE=pJuwGIYiJlE; __Secure-3PSIDCC=AEf-XMRV_MjLL0AWdGWngxFHvNUF3OIpk3_jdeUwRiZ76WZ3XsSY0Vlsl1jM9n7FLprKTqFzvw; __Secure-3PSID=RAi8PYLbf3qLvF1oEav9BnHK_eOXwimNM-0xwTQPj1-QVG1Xwpz17T4d-EGzT6sVps1PjQ.; YSC=4M3JgZEwyiA; GPS=1; DEVICE_INFO=ChxOekU1TURJMk1URTBOemd5TWpJeU5qVTJOdz09EOvgo54GGOvgo54G; PREF=tz=Europe.Bucharest&f6=40000000&f4=4000000; CONSISTENCY=ACHmjUr7DnoYSMf5OL-vaunKYfoLGz1lWYRUZRepFyIBDRpp_jrEa85E4wgRJLJ2j15l688hk9IVQu7fIjYXo7sdsZamArxVHTMuChgHd22PkX_mbfifnMjyp4OX2swyQJRS-8PE6cOCt_6129fGyBs; amp_adc4c4=Ncu7lbhgeiAAYqecSmyAsS.MXVDWTJjd3BXdmRkQ3J0YUpuTkx3OE5JcXVKMw==..1gn4emd4v.1gn4en556.0.4.4

L'importance des en-têtes et des cookies dans le web scraping

En web scraping, vous pouvez utiliser les en-têtes et les cookies pour contourner les mesures de sécurité et accéder à du contenu restreint, ainsi que pour fournir des informations permettant d'identifier votre script de scraping comme un navigateur légitime.

Par exemple, en spécifiant l'en-tête User-Agent correct (plus de détails dans la section suivante), vous pouvez faire en sorte que votre script apparaisse comme un navigateur Chrome, ce qui peut vous aider à éviter d'être détecté par le site web.

De plus, en stockant et en envoyant des cookies, votre scraper peut accéder à du contenu réservé aux utilisateurs connectés. Comme le site web utilise des cookies pour proposer des publicités ciblées, vous pouvez également les utiliser pour extraire des données plus précises et mieux comprendre le site web.

Outre la manipulation des en-têtes HTTP et des cookies, pensez à suivre certaines bonnes pratiques de web scraping très utiles répertoriées dans ce guide.

En-têtes couramment utilisés en web scraping

Il existe de nombreux en-têtes différents pouvant être utilisés en web scraping, mais voici quelques-uns des plus courants :

User-Agent

Il sert à identifier le navigateur et le système d'exploitation utilisés par le client qui effectue la requête. Ces informations sont utilisées par les serveurs pour déterminer quel navigateur et quel système d'exploitation le client utilise afin de lui fournir le contenu et les fonctionnalités appropriés.

La chaîne User-Agent contient des informations telles que le nom du navigateur, sa version et sa plateforme. Par exemple, une chaîne User-Agent pour Google Chrome sous Windows pourrait ressembler à ceci :

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36

En web scraping, en spécifiant un User-Agent appartenant à un navigateur web courant, vous pouvez faire en sorte que votre script apparaisse comme un navigateur couramment utilisé par des utilisateurs légitimes, ce qui réduit le risque qu'il soit bloqué.

Accept

Il sert à spécifier les types de contenu que le navigateur est prêt à accepter en réponse à une requête HTTP, tels que du texte, des images, de l'audio ou de la vidéo. Un en-tête Accept peut ressembler à ceci :

Accept: 
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,/;q=0.8

En web scraping, en spécifiant l'en-tête Accept correct, vous pouvez vous assurer que votre script reçoit les données correctes. Par exemple, si vous souhaitez extraire une page HTML, vous pouvez spécifier l'en-tête Accept comme text/html.

Cependant, certains sites web peuvent utiliser cet en-tête pour détecter les scrapers ; il est donc important de l'utiliser avec prudence et uniquement lorsque cela est nécessaire.

Accept-Language

Cet en-tête spécifie la langue préférée du contenu que le navigateur est prêt à accepter en réponse à une requête HTTP. L'en-tête Accept-Language est utilisé par les serveurs pour déterminer quelle langue envoyer au client.

Un navigateur demandant une page HTML en anglais peut envoyer un en-tête Accept-Language qui ressemble à ceci :

Accept-Language: en-US,en;q=0.9

Les sites web utilisent cet en-tête pour envoyer des cookies à un client après qu'une requête a été effectuée. Un en-tête Cookie peut ressembler à ceci :

Cookie: session_id=1234567890; user_id=johndoe

Dans le cadre du web scraping, vous pouvez utiliser cet en-tête pour transmettre des cookies de session et accéder à du contenu réservé aux utilisateurs connectés. Un autre cas d'utilisation consiste à utiliser des cookies persistants pour obtenir des résultats personnalisés.

Referer

Cet en-tête spécifie l'URL de la page Web précédente à partir de laquelle un lien vers la page actuelle a été suivi. Il est utilisé par les serveurs pour suivre l'origine de la requête et pour comprendre le contexte de celle-ci.

Par exemple, si un utilisateur clique sur un lien d'une page Web vers une autre page Web, le navigateur envoie une requête à la deuxième page Web avec l'URL de la première page Web dans l'en-tête Referer. La requête adressée à la deuxième page Web comporterait donc un en-tête Referer qui ressemblerait à ceci :

Referer: https://www.example.com/

En web scraping, vous pouvez utiliser l'en-tête Referer pour accéder à des sites web qui n'autorisent pas les requêtes directes.

Récupération des en-têtes et des cookies à partir d'un navigateur réel

Mais trêve de théorie. Voyons comment extraire les en-têtes HTTP et les cookies Web envoyés à un site Web.

Pour revenir à notre exemple, rendez-vous sur youtube.com dans votre navigateur réel. Cliquez ensuite avec le bouton droit n'importe où sur la page et sélectionnez l'option « Inspecter ». Lorsque les Outils de développement s'ouvrent, accédez à l'onglet « Réseau ».

YouTube homepage alongside Chrome DevTools Network tab showing captured requests during page load

Après avoir actualisé la page, vous devriez voir les requêtes se charger en temps réel. Cliquez sur la première (et principale) d'entre elles, et un onglet supplémentaire apparaîtra.

Chrome DevTools Network tab showing response headers for a www.youtube.com request

Vous pouvez y voir tous les détails de la requête que vous avez envoyée : URL, méthode, code d'état, adresse distante et, surtout, les en-têtes de requête et de réponse que nous recherchions.

Utilisation d'en-têtes personnalisés dans le web scraping

  • Utilisez httpbin.org pour afficher les en-têtes envoyés par un navigateur
  • choisissez un langage de programmation et envoyez une requête GET basique pour voir les en-têtes
  • transmettez les en-têtes personnalisés que vous avez récupérés
  • Répétez le processus pour Node.js et Python
  • Réécrivez la section pour WSA - Ajoutez un lien vers la documentation de l'API - Décrivez la fonctionnalité des en-têtes personnalisés

Voyons maintenant comment nous pouvons utiliser ces en-têtes pour améliorer nos scrapers. Pour cette partie, nous prendrons comme exemple un simple site web de mise en miroir, qui nous montrera directement les en-têtes que nous envoyons : https://httpbin.org/headers.

httpbin.org/headers page showing a JSON response with request headers

Copiez le contenu de l'objet « headers » et commençons à écrire le code.

Node.js

Après vous être assuré que votre environnement Node.js est correctement configuré et que votre projet est initialisé, exécutez le code suivant :

import got from 'got';

(async () => {

    const response = await got('https://httpbin.org/headers')

    console.log(response.body)

})()

Nous pouvons ainsi voir à quoi ressemble la requête GET la plus basique. Le résultat devrait être :

{

  "headers": {

    "Accept-Encoding": "gzip, deflate, br",

    "Host": "httpbin.org",

    "User-Agent": "got (https://github.com/sindresorhus/got)",

    "X-Amzn-Trace-Id": "Root=1-63c93ff5-0c352d6319620b3d6b46df02"

  }

}

Cela semble très différent de ce que nous avons vu dans notre navigateur. À lui seul, l'en-tête User-Agent permet très facilement à un serveur de détecter que la requête est automatisée.

Passons maintenant nos en-têtes personnalisés et renvoyons la requête :

import got from 'got';

(async () => {

    const custom_headers = {

        "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",

    	  "Accept-Encoding": "gzip, deflate, br",

    	  "Accept-Language": "en-US,en;q=0.9",

    	  "Cache-Control": "no-cache",

    	  "Cookie": "amp_d915a9=sd12OA1w0P4xMKsMYSmY9n.MXVDWTJjd3BXdmRkQ3J0YUpuTkx3OE5JcXVKMw==..1ggrl757h.1ggrl75ci.0.1o.1o; amp_adc4c4=P3ZIfUgU8qzSHI-y0gZvbk.MXVDWTJjd3BXdmRkQ3J0YUpuTkx3OE5JcXVKMw==..1gn51hk3v.1gn51lql7.0.e.e",

    	  "Host": "httpbin.org",

    	  "Pragma": "no-cache",

    	  "Sec-Ch-Ua": "\"Not_A Brand\";v=\"99\", \"Google Chrome\";v=\"109\", \"Chromium\";v=\"109\"",

    	  "Sec-Ch-Ua-Mobile": "?0",

    	  "Sec-Ch-Ua-Platform": "\"Windows\"",

    	  "Sec-Fetch-Dest": "document",

    	  "Sec-Fetch-Mode": "navigate",

    	  "Sec-Fetch-Site": "none",

    	  "Sec-Fetch-User": "?1",

    	  "Upgrade-Insecure-Requests": "1",

    	  "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36",

    	  "X-Amzn-Trace-Id": "Root=1-63c93e34-1ad0141279d49bfc28fb058e"

    }

    const response = await got('https://httpbin.org/headers', {

        headers: custom_headers

    })

    console.log(response.body)

})()

En exécutant à nouveau le script, vous devriez remarquer que notre requête semble désormais provenir d'un véritable navigateur Chrome, même si nous n'en avons pas ouvert un.

Python

Essayons maintenant la même chose en Python. Même si la syntaxe et les bibliothèques sont différentes, le principe reste le même.

import requests

url = 'https://httpbin.org/headers'

headers = {

	"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",

	"Accept-Encoding": "gzip, deflate, br",

	"Accept-Language": "en-US,en;q=0.9",

	"Cache-Control": "no-cache",

	"Cookie": "amp_d915a9=sd12OA1w0P4xMKsMYSmY9n.MXVDWTJjd3BXdmRkQ3J0YUpuTkx3OE5JcXVKMw==..1ggrl757h.1ggrl75ci.0.1o.1o; amp_adc4c4=P3ZIfUgU8qzSHI-y0gZvbk.MXVDWTJjd3BXdmRkQ3J0YUpuTkx3OE5JcXVKMw==..1gn51hk3v.1gn51lql7.0.e.e",

	"Host": "httpbin.org",

	"Pragma": "no-cache",

	"Sec-Ch-Ua": "\"Not_A Brand\";v=\"99\", \"Google Chrome\";v=\"109\", \"Chromium\";v=\"109\"",

	"Sec-Ch-Ua-Mobile": "?0",

	"Sec-Ch-Ua-Platform": "\"Windows\"",

	"Sec-Fetch-Dest": "document",

	"Sec-Fetch-Mode": "navigate",

	"Sec-Fetch-Site": "none",

	"Sec-Fetch-User": "?1",

	"Upgrade-Insecure-Requests": "1",

	"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36",

	"X-Amzn-Trace-Id": "Root=1-63c93e34-1ad0141279d49bfc28fb058e"

}

response = requests.get(url, headers=headers)

print(response.text)

Le résultat après l'exécution du script sera identique, quel que soit le langage de programmation utilisé.

En-têtes personnalisés dans WebScrapingAPI

Toute API de scraping digne de ce nom devrait offrir la fonctionnalité puissante de transmettre des en-têtes HTTP et des cookies personnalisés à une requête. La norme peut varier selon l'API, alors assurez-vous de toujours consulter d'abord la documentation officielle.

Par défaut, WebScrapingAPI fournit un ensemble d'en-têtes personnalisés avec chaque requête. Les en-têtes User-Agent aléatoires ne sont qu'un exemple parmi d'autres.

Cependant, comme les sites web peuvent être très complexes ou tout simplement obsolètes, vous avez la possibilité de désactiver ce comportement et de personnaliser entièrement votre requête. Veillez simplement à obtenir une clé API au préalable, puis exécutez le code suivant :

import got from 'got';

(async () => {

    const response = await got("https://api.webscrapingapi.com/v1", {

        searchParams: {

            api_key: "YOUR_API_KEY",

            url: "https://httpbin.org/headers",

            keep_headers: '0',

        },

        headers: {

            "Wsa-Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",

            "Wsa-Accept-Encoding": "gzip, deflate, br",

            "Wsa-Accept-Language": "en-US,en;q=0.9",

            "Wsa-Cache-Control": "no-cache",

            "Wsa-Cookie": "amp_d915a9=sd12OA1w0P4xMKsMYSmY9n.MXVDWTJjd3BXdmRkQ3J0YUpuTkx3OE5JcXVKMw==..1ggrl757h.1ggrl75ci.0.1o.1o; amp_adc4c4=P3ZIfUgU8qzSHI-y0gZvbk.MXVDWTJjd3BXdmRkQ3J0YUpuTkx3OE5JcXVKMw==..1gn51hk3v.1gn51lql7.0.e.e",

            "Wsa-Pragma": "no-cache",

            "Wsa-Sec-Ch-Ua": "\"Not_A Brand\";v=\"99\", \"Google Chrome\";v=\"109\", \"Chromium\";v=\"109\"",

            "Wsa-Sec-Ch-Ua-Mobile": "?0",

            "Wsa-Sec-Ch-Ua-Platform": "\"Windows\"",

            "Wsa-Sec-Fetch-Dest": "document",

            "Wsa-Sec-Fetch-Mode": "navigate",

            "Wsa-Sec-Fetch-Site": "none",

            "Wsa-Sec-Fetch-User": "?1",

            "Wsa-Upgrade-Insecure-Requests": "1",

            "Wsa-User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36",

            "Wsa-X-Amzn-Trace-Id": "Root=1-63c93e34-1ad0141279d49bfc28fb058e"

        }

    })

    console.log(response.body)

})()

Dans ce cas, selon la documentation de l'API, nous devons ajouter le préfixe « Wsa- » au nom d'un en-tête afin de le transmettre à la requête. Cette mesure a été mise en place pour empêcher la transmission d'en-têtes involontaires, comme lorsque la requête API est envoyée depuis un navigateur.

Conclusion

Cet article a présenté un aperçu de l'importance et de l'utilisation des en-têtes HTTP et des cookies Web dans le web scraping.

Nous avons abordé ce que sont les en-têtes et les cookies, comment vous pouvez les utiliser pour accéder à du contenu restreint et faire passer votre script de scraping pour un navigateur légitime, ainsi que la manière dont ils peuvent être utilisés à des fins de suivi et d'analyse.

Nous avons également présenté certains des en-têtes couramment utilisés dans le web scraping et expliqué comment récupérer les en-têtes et les cookies à partir d'un navigateur réel. Nous avons ensuite utilisé des exemples de code pour illustrer comment les utiliser dans vos scripts de scraping.

En comprenant et en utilisant efficacement les en-têtes et les cookies, vous pouvez améliorer l'efficacité de vos efforts de web scraping. Grâce à ces connaissances, vous pouvez faire passer vos compétences en matière de scraping au niveau supérieur et extraire des informations précieuses du Web.

À propos de l'auteur
Raluca Penciuc, Développeur full-stack @ WebScrapingAPI
Raluca PenciucDéveloppeur full-stack

Raluca Penciuc est développeuse Full Stack chez WebScrapingAPI ; elle conçoit des robots de collecte de données, améliore les techniques de contournement et recherche des moyens fiables de réduire le risque de détection sur les sites cibles.

Commencez à créer

Prêt à faire évoluer votre système de collecte de données ?

Rejoignez plus de 2 000 entreprises qui utilisent WebScrapingAPI pour extraire des données Web à l'échelle de l'entreprise, sans aucun coût d'infrastructure.