Ce guide explore les fondamentaux du protocole HTTP (Hypertext Transfer Protocol), essentiel pour comprendre le fonctionnement d'Internet et le développement de scrapers web.
- Principe de base
Le web scraping consiste à simuler le comportement d'un navigateur web pour récupérer, puis analyser, le contenu des pages web. Pour maîtriser cette technique, il est crucial de comprendre comment un navigateur communique avec un serveur web, une communication qui s'effectue via le protocole HTTP.
- Présentation du protocole HTTP
2.1 Définition
HTTP, acronyme de Hypertext Transfer Protocol, est le protocole fondamental pour le transfert de données sur le World Wide Web. Initialement conçu pour le transfert de pages web (contenant des hyperilens, d'où le terme "hypertexte"), il est aujourd'hui largement utilisé pour le développement d'APIs réseau, notamment les APIs RESTful.
- Le terme "hypertexte" souligne la capacité de lier des documents entre eux, permettant une navigation non linéaire.
- HTTP est l'un des protocoles de plus haut niveau dans la pile TCP/IP, gérant des ressources variées telles que les fichiers HTML, les images, ou les résultats de requêtes.
Lors de l'accès à un site comme Baidu, l'URL commence souvent par http://. Le préfixe https:// indique une version sécurisée (HTTPS) qui ajoute un chiffrement via des certificats numériques, mais le fonctionnement de base reste similaire pour un scraper, nécessitant l'utilisation du protocole approprié.
2.2 Fonctionnement de base
HTTP sert de langage de communication entre un client HTTP (navigateur web, aplication mobile) et un serveur web (Nginx, Apache, IIS). Le client utilise une URL pour envoyer une requête au serveur. Le serveur traite cette requête et renvoie une réponse. Le port par défaut pour HTTP est le 80, mais d'autres ports comme le 8080 peuvent être utilisés.
2.3 Trois caractéristiques clés de HTTP
- Sans connexion (Connectionless) : Chaque connexion est établie pour traiter une seule requête, puis elle est immédiatement fermée après réception de la réponse. Cela optimise le temps de transmission.
- Indépendant des médias (Media Independent) : HTTP peut transporter tout type de données (audio, vidéo, images, texte, etc.), à condition que le client et le serveur sachent comment les interpréter via des types MIME appropriés.
- Sans état (Stateless) : Le protocole ne conserve aucune information sur les requêtes précédentes. Chaque requête est traitée de manière indépendante. Si des informations antérieures sont nécessaires, elles doivent être renvoyées par le client, ce qui peut augmenter la quantité de données transmises mais permet des réponses plus rapides du serveur lorsqu'aucune information de contexte n'est requise.
- Outils du développeur Chrome
Le navigateur Chrome intègre des outils puissants pour inspecter le trafic réseau, y compris les requêtes et réponses HTTP. Ces outils sont indispensables pour comprendre les interactions web et pour le débogage lors du développement de scrapers.
- Structure des messages HTTP
4.1 Flux principal et concepts
Une interaction HTTP se compose de deux parties principales :
- Requête : Envoyée par le client au serveur. Elle comprend :
- Une méthode (ex: GET) et l'URL de la ressource demandée (ex:
https://www.baidu.com). - Des en-têtes (Headers) : Métadonnées décrivant la requête et l'expéditeur.
- Des paramètres : Informations supplémentaires, comme les termes de recherche dans une requête de recherche Baidu.
- Une méthode (ex: GET) et l'URL de la ressource demandée (ex:
- Réponse : Envoyée par le serveur au client. Elle comprend :
- Un code d'état : Indique le résultat de la requête (ex: 200 pour succès, 404 pour non trouvé).
- Des en-têtes (Headers) : Métadonnées décrivant la réponse et le contenu.
- Le corps de la réponse (Body) : Le contenu réel de la ressource (HTML, JSON, image, etc.).
4.2 Exemple de requête et réponse
Requête client :
GET /hello.txt HTTP/1.1
User-Agent: curl/7.16.3 libcurl/7.16.3 OpenSSL/0.9.7l zlib/1.2.3
Host: www.example.com
Accept-Language: en, mi
Réponse serveur :
HTTP/1.1 200 OK
Date: Mon, 27 Jul 2009 12:28:53 GMT
Server: Apache
Last-Modified: Wed, 22 Jul 2009 19:15:56 GMT
ETag: "34aa387-d-1568eb00"
Accept-Ranges: bytes
Content-Length: 51
Vary: Accept-Encoding
Content-Type: text/plain
Contenu de la réponse :
Hello World! My payload includes a trailing CRLF.
Le site httpbin.org/get est une ressource utile pour examiner en détail les informations d'une requête HTTP envoyée.
- Processus complet de chargement d'une page web
Le chargement d'une page web visible dans un navigateur implique généralement plusieurs requêtes HTTP séquentielles :
- Une première requête pour obtenir le fichier HTML principal.
- Des requêtes subséquentes pour télécharger les ressources référencées dans le HTML, telles que les feuilles de style CSS, les scripts JavaScript et les images.
Dans les outils de développement Chrome, cela se manifeste par une liste de nombreuses requêtes. Cette nature fragmentée peut compliquer le scraping, car une requête unique ne suffit souvent pas à obtenir toutes les données nécessaires.
Pour surmonter ce défi, deux approches principales existent :
- Analyser les requêtes réseau pour identifier les requêtes "clés" qui chargent les données essentielles, puis les émuler avec le code de scraping.
- Utiliser des outils comme Selenium pour piloter un véritable navigateur web, simulant ainsi le chargement complet de la page et l'exécution de toutes les requêtes.
- La Requête HTTP
6.1 La ligne de requête (Request Line)
La première ligne d'une requête HTTP, appelée ligne de requête, contient trois informations essentielles :
- La méthode de la requête (ex: GET, POST).
- L'URI de la ressource demandée (ex:
/hello.txt). - La version du protocole HTTP utilisée (ex:
HTTP/1.1).
La combinaison de l'URI et de l'en-tête Host permet de construire l'URL complète.
GET /hello.txt HTTP/1.1
User-Agent: curl/7.16.3 libcurl/7.16.3 OpenSSL/0.9.7l zlib/1.2.3
Host: www.example.com
Accept-Language: en, mi
6.2 Méthodes de requête
Les méthodes HTTP définissent l'action à effectuer sur la ressource ciblée.
- GET : Récupère des données sans modifier l'état du serveur.
- POST : Soumet des données au serveur pour traitement, pouvant entraîner la création ou la modification de ressources.
Le tableau suivant liste les méthodes HTTP courantes :
| Méthode | Description |
|---|---|
| GET | Récupère la représentation d'une ressource spécifiée. |
| HEAD | Identique à GET, mais ne retourne que les en-têtes de réponse, sans le corps. |
| POST | Soumet une entité à la ressource spécifiée, ce qui peut entraîner des changements sur le serveur. |
| PUT | Remplace la représentation actuelle de la cible par la charge utile de la requête. |
| DELETE | Supprime la ressource spécifiée. |
| CONNECT | Établit un tunnel réseau vers la ressource spécifiée. |
| OPTIONS | Décrit les options de communication pour la ressource cible. |
| TRACE | Effectue un test de boucle arrière de message via le chemin de requête vers la cible. |
| PATCH | Applique des modifications partielles à une ressource. |
6.3 Paramètres de requête
Paramètres GET
Dans une requête GET, les paramètres sont inclus dans l'URL, après un point d'interrogation (?). Chaque paramètre est une paire clé-valeur (clé=valeur), et les paramètres multiples sont séparés par une esperluette (&).
Exemple : https://www.example.com/page?param1=valeur1¶m2=valeur2
Paramètres POST
Les requêtes POST transmettent leurs paramètres dans le corps de la requête, et non dans l'URL. Ils ne sont donc pas visibles directement dans l'URL.
# Exemple conceptuel de corps de requête POST
{
"name": "Alice",
"feature": "intelligent",
"location": "a vibrant city"
}
6.4 En-têtes de requête (Request Headers)
Les en-têtes de requête fournissent des métadonnées crucilaes au serveur. Ils sont souvent utilisés pour l'authentification, la gestion des sessions et comme mesure anti-scraping.
- User-Agent : Identifie le client (navigateur, outil) qui effectue la requête. Un User-Agent manquant ou suspect peut entraîner le blocage de la requête.
- Cookie : Contient les informations de session ou les préférences stockées précédemment par le serveur. Essentiel pour maintenir une session utilisateur active.
- Referer : Indique l'URL de la page d'où provient la requête actuelle. Certains sites l'utilisent pour vérifier la provenance des visiteurs.
Voici une liste non exhaustive des en-têtes courants :
| En-tête | Description |
|---|---|
| Accept | Types MIME que le client peut comprendre. |
| Accept-Language | Langues préférées du client. |
| Authorization | Informations d'authentification. |
| Cookie | Données de cookie à envoyer au serveur. |
| Content-Type | Type MIME du corps de la requête. |
| Host | Nom de domaine du serveur. |
| If-Modified-Since | Condition pour récupérer une ressource modifiée après une certaine date. |
| Referer | URL de la page précédente. |
| User-Agent | Informations sur le client (navigateur, OS). |
- La Réponse HTTP
7.1 Codes d'état
Les codes d'état HTTP indiquent le résultat d'une requête. Ils sont classés en cinq catégories :
- 1xx : Informationnel (requête reçue, poursuite du traitement).
- 2xx : Succès (la requête a été traitée avec succès).
- 3xx : Redirection (des actions supplémentaires sont nécessaires).
- 4xx : Erreur client (la requête contient une erreur de syntaxe ou est mal formée).
- 5xx : Erreur serveur (le serveur a rencontré une erreur lors du traitement de la requête).
Codes courants :
- 200 OK : Requête réussie.
- 301 Moved Permanently : La ressource a été déplacée de façon permanente.
- 404 Not Found : La ressource demandée n'a pas été trouvée.
- 500 Internal Server Error : Erreur interne du serveur.
7.2 En-têtes de réponse (Response Headers)
Les en-têtes de réponse fournissent des informations sur la réponse du serveur et le contenu qu'elle transporte.
- Content-Type : Spécifie le type MIME du contenu renvoyé.
- Content-Encoding : Indique la méthode de compression utilisée pour le contenu.
- Set-Cookie : Définit un cookie à stocker par le client pour les futures requêtes.
- Location : Utilisé avec les redirections (codes 3xx) pour spécifier la nouvelle URL.
Un exemple d'en-tête pertinent pour le scraping est Set-Cookie, car il gère l'état de session et peut être utilisé pour contourner certaines protections anti-scraping.
7.3 Contenu de la réponse et type MIME
Le corps de la réponse contient la ressource demandée. Les types de contenu les plus fréquents sont :
- HTML : Pour les pages web visibles par l'utilisateur.
- JSON : Format d'échange de données léger, couramment utilisé par les APIs.
- XML : Autre format d'échange de données structurées.
- Images (JPEG, PNG, GIF), feuilles de style CSS, scripts JavaScript, etc.
L'en-tête Content-Type informe le client du format et de l'encodage du contenu, lui permettant de l'afficher ou de le traiter correctement.
Types MIME courants :
text/htmlapplication/jsonimage/jpegtext/plainapplication/octet-stream(pour les données binaires génériques)multipart/form-data(utilisé pour l'upload de fichiers)