Scraping
Julien Romero
CSC 4538 Scrapping 1
Introduction
CSC 4538 Scrapping 2
Qu’est-ce que le scrapping ?
● Le (web) scraping est un ensemble de techniques permettant d’extraire des
données de sites webs
● Souvent associé au web crawling qui parcours les pages du web de manière
automatique
CSC 4538 Scrapping 3
Pourquoi faire du scraping ?
● Référencement : construction d’un moteur de recherche
● Extraction d’informations spécifiques
○ Comparateur de prix (billets d’avions, objets)
○ Agrégation d’évaluations de produits
○ Détection de changement dans un site web
○ Évaluation des tendances
○ Suivi de la présence en ligne
○ Détection de menaces
● Construction ou augmentation de jeu de données
● Test automatique de site web
CSC 4538 Scrapping 4
Comment faire du scrapping ?
● Il est important de comprendre le fonctionnement du web et des différents
composants
● Il faut “reverse-engineer” le site scrappé pour comprendre comment extraire au
mieux l’information
CSC 4538 Scrapping 5
HTTP
CSC 4538 Scrapping 6
Comment obtenir une page web ?
Réseau
Ordinateur Serveur
CSC 4538 Scrapping 7
Comment obtenir une page web ?
URL
Réseau
Ordinateur Serveur
CSC 4538 Scrapping 8
URL
● URL = Uniform Resource Locator
○ Sert à localiser une ressource dans un réseau
● Cas spécifique d’une URI = Uniform Resource Identifier
● Schéma = protocole, en général http ou https, mais aussi ftp, mailto, irc, …
CSC 4538 Scrapping 9
URL
● URL = Uniform Resource Locator
○ Sert à localiser une ressource dans un réseau
● Cas spécifique d’une URI = Uniform Resource Identifier
● Infos utilisateur : possibilité de mettre un nom d’utilisateur et un mot de passe
CSC 4538 Scrapping 10
URL
● URL = Uniform Resource Locator
○ Sert à localiser une ressource dans un réseau
● Cas spécifique d’une URI = Uniform Resource Identifier
● Hôte : nom de domaine ou adresse IP permettant d’identifier la destination
○ Les noms de domaines sont transformées en IP par le DNS
○ [Link]
CSC 4538 Scrapping 11
URL
● URL = Uniform Resource Locator
○ Sert à localiser une ressource dans un réseau
● Cas spécifique d’une URI = Uniform Resource Identifier
● Port : on peut indiquer le port de connexion
○ Par défaut, 80 pour HTTP, 443 pour HTTPS
CSC 4538 Scrapping 12
URL
● URL = Uniform Resource Locator
○ Sert à localiser une ressource dans un réseau
● Cas spécifique d’une URI = Uniform Resource Identifier
● Chemin : chemin absolu vers la ressource sur le serveur
○ Comme dans UNIX
○ [Link]
CSC 4538 Scrapping 13
URL
● URL = Uniform Resource Locator
○ Sert à localiser une ressource dans un réseau
● Cas spécifique d’une URI = Uniform Resource Identifier
● Requête : Permet de passer des arguments ou données supplémentaires
○ Arguments souvent séparés par un délimiteur (&)
○ [Link]
ue&soluce=true
CSC 4538 Scrapping 14
URL
● URL = Uniform Resource Locator
○ Sert à localiser une ressource dans un réseau
● Cas spécifique d’une URI = Uniform Resource Identifier
● Ancre : donnée supplémentaire utilisée une fois la réponse obtenue
○ Souvent un nom de section à laquelle se déplacer
CSC 4538 Scrapping 15
Comment obtenir une page web ?
URL
Réseau
Ordinateur Serveur
CSC 4538 Scrapping 16
Comment obtenir une page web ?
HTTP Request
Réseau
Ordinateur Serveur
CSC 4538 Scrapping 17
HTTP, le protocole du World Wide Web
● HTTP = Hypertext Transfer Protocol
● Protocole de communication client-serveur en mode request-response et sans état
● Pourquoi a-t-on besoin d’un protocole ?
○ Optimisation des requêtes (cache)
○ Ajout de fonctionnalités (authentification, session)
○ Donner des tailles sur la réponse attendue
○ Distribution du traffic
CSC 4538 Scrapping 18
Messages HTTP
● Trois composantes
○ La requête / le statut de la réponse
○ Un header (optionnel)
○ Un body (optionnel)
CSC 4538 Scrapping 19
La requête HTTP
● Une ligne indiquant ce que l’on demande de la forme
Méthode URL Protocole
● Le protocole est HTTP avec un numéro de version (HTTP/1.1 par exemple)
● La méthode indique l’action de l’on veut exécuter sur la ressource.
● Principales méthodes :
○ GET : On veut obtenir la ressource
○ POST : On envoie de l’information au serveur (message forum, formulaire)
○ PUT, DELETE, …
GET [Link] HTTP/1.1
CSC 4538 Scrapping 20
Le statut de la réponse HTTP
● De la forme :
Protocole CodeStatut Message
● Le code du statut est dans cinq catégories :
○ 1XX : informatif
○ 2XX : succès
○ 3XX : redirection
○ 4XX : erreur client
○ 5XX : erreur serveur
● En général, 200 et tout va bien
CSC 4538 Scrapping 21
Le header
● Ensemble de clefs-valeurs de la forme
Clef: valeur
● Clefs populaires :
○ Accept : Le type de ressource attendue (Accept: text/html)
■ Content-Type dans la réponse
○ Accept-Encoding : L’encoding de la réponse (Accept-Encoding: gzip, deflate)
■ Content-Encoding dans la réponse
○ Accept-Language : La langue de la réponse (Accept-Language: en-US)
○ Authorization : Authentication (Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==)
○ Cookie : Un cookie (Cookie: $Version=1; Skin=new;)
○ Host : Le nom de domaine (Host: [Link])
○ User-Agent : Qui demande la ressource (User-Agent: Mozilla/5.0 (X11; Linux x86_64;
rv:12.0) Gecko/20100101 Firefox/12.0)
CSC 4538 Scrapping 22
Le body
● En général, le HTML ou le format demandé
○ Peut être compressé
● Les informations du POST
CSC 4538 Scrapping 23
Comment obtenir une page web ?
HTTP Request
Réseau
HTTP Response
Ordinateur Serveur
CSC 4538 Scrapping 24
Visualiser les requêtes
Dans la plupart des
navigateurs, on peut accéder
au trafic réseau et visualiser
les requêtes
CSC 4538 Scrapping 25
Fonctionnement des sites webs en pratique
CSC 4538 Scrapping 26
Une page web a besoin de nombreuses ressources
● En général, une page web a besoin de charger de nombreuses ressources
○ Du HTML
○ Des images
○ Des scripts en Javascript
○ Des vidéos
○ Des données
○ Des polices d’écriture
○ Du tracking
● Exemple : Ouvrez un site comme [Link] et regarder la quantité de ressources
nécessaires à travers la console de réseau
CSC 4538 Scrapping 27
La réalité
Réseau
Ordinateur Serveurs
(potentiellement
plusieurs)
CSC 4538 Scrapping 28
HTML
● HTML est un langage de balisage
○ On va annoter le contenu pour leur donner des propriétés
○ On a une structure d’arbre = des balises peuvent contenir d’autre balises
● Syntaxe d’une balise
<tag attribut1="valeur1" attribut2="valeur2">contenu</tag>
● Le tag défini le type de balise
● Les attributs donnent des propriétés à la zone balisée
CSC 4538 Scrapping 29
HTML - Tags classiques
● <p> : Paragraphe
● <div> : Division/section de code. Utilisé pour organiser et isoler des parties.
● <head> : Définit une zone de métadonnées
● <a> : Lien hypertexte
● <input> : Champ de texte
● <h1>, <h2>, <h3>, … : Titre de taille 1, 2, 3, …
● <img> : Image
● <ul>, <ol>, <li> : Listes
● <table>, <th>, <td>, <tr>, <thead>, <tbody> : tableaux
CSC 4538 Scrapping 30
HTML - Attributs classiques
● href : lien dans une balise <a>
● src : lien d’une image dans <img>
● class : utilisé pour identifier l’application d’un élément de style ou d’un script
Javascript
● id : pareil que class, mais identifiant unique
● label : titre pour l’identification par les humains
Les attributs et leur utilisation peuvent grandement varier d’un site à l’autre.
CSC 4538 Scrapping 31
HTML en pratique pour le scrapping
● Il n’est pas nécessaire de connaître tous les tags et attributs possibles
○ Il faut être conscient de la structure imbriquée d’arbre
○ Il faut pouvoir lire et comprendre du HTML
● Nous utiliserons les tags et les attributs pour trouver de manière systématique des
éléments dans la page
● Il est possible d’accéder au HTML d’une page grâce au navigateur
○ Soit en affichant le code source directement
○ Soit en utilisant l’outil inspecter qui permet un mode interactif pour l’exploration
CSC 4538 Scrapping 32
Exemple
CSC 4538 Scrapping 33
BeautifulSoup
from bs4 import BeautifulSoup
soup = BeautifulSoup(open("scrapping_example.html"), '[Link]')
# Un seul élément h1, facile
soup.find_all('h1')[0].getText()
# PSG – Toulouse : Une célébration fastueuse mais un réel malaise sur le cas Mbappé
CSC 4538 Scrapping 34
Exemple
CSC 4538 Scrapping 35
BeautifulSoup
Plus compliqué, de nombreux tags <span>
len(soup.find_all('span'))
# 217
Si on a de la chance, notre span est toujours au même endroit. Sinon, il faut l’identifier
de manière unique, soit grâce à ces attributs, soit dans l’arborescence.
soup = BeautifulSoup(open("scrapping_example.html"), '[Link]')
len(soup.find_all('span', {"class": "font-source-serif-pro text-xxl@xs"}))
# 1
CSC 4538 Scrapping 36
BeautifulSoup
Plus compliqué, de nombreux tags <span>
len(soup.find_all('span'))
# 217
Si on a de la chance, notre span est toujours au même endroit. Sinon, il faut l’identifier
de manière unique, soit grâce à ces attributs, soit dans l’arborescence.
for div in soup.find_all("div"):
if [Link]() is not None and [Link]().name == "h1":
print(div.find_all("span")[-1].getText())
# La fête pour le 12e titre de champion
CSC 4538 Scrapping 37
Les images, vidéo
● Chaque image a aussi une URL associée
● On peut constituer des jeux de données en utilisant l’image et les attributs pour
une description (alt)
○ Parfois, le texte autour peut servir
● Souvent difficile ou cher d’exploiter l’information dans une image, encore pire
pour une vidéo
CSC 4538 Scrapping 38
Javascript
● Javascript est un langage de script très utilisé sur le web
● Ce qui nous intéresse :
○ Javascript rend le pages dynamiques
○ Javascript peut télécharger des données et les insérer dans la page
○ Javascript peut effectuer des opérations à la volée
● Les scripts sont en clair sur notre machine et sont téléchargés comme toutes les
ressources. Par contre, ils sont souvent “compressé”, voire obfusqués pour réduire
la taille de scripts et cacher leur contenu.
○ Exploitation directe très compliquée
CSC 4538 Scrapping 39
Exemple de page dynamique - Twitter/X
Presque aucun texte dans le code source !
<!DOCTYPE html><html dir="ltr" lang="fr"><head>
[Contenu header métadonnées/chargement de scripts]
</head><body style="background-color: #FFFFFF;"><noscript><style>
[Éléments de style]
</style>
<div class="errorContainer">
[message d'erreur si Javascript n'est pas disponible]
</div></noscript>
[Plein de div vides pour plus tard]
[Une image SVG]
[Appels de scripts]
CSC 4538 Scrapping 40
Que faire dans ce cas ?
● Il va falloir comprendre les informations échangées en regardant les
communications réseau
CSC 4538 Scrapping 41
La chaine météo - HTML source
<span class="tt-day">lun</span>
<span class="tt-day-num">13</span>
<h2 class="tt-img">
<img
width="57"
height="61"
src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjC
B0C8AAAAASUVORK5CYII="
alt="Prévisions à 15 jours"
/>
</h2>
<span class="tt-tempe-max">-</span>
<span class="tt-tempe-min">-</span>
Pas de température !
CSC 4538 Scrapping 42
Communications
Il semble y avoir une requête par jour qui retourne un JSON
CSC 4538 Scrapping 43
Détails de la requête
Il semble n’y avoir qu’un seul champs dans la requête (la date), mais il faut l’identifiant
de la ville (101-12176)
CSC 4538 Scrapping 44
Comment obtenir l’identifiant de la ville
CSC 4538 Scrapping 45
L’API de l’autocomplétion
Les appels à l’API de l’autocomplétion retournent un identifiant que l’on peut utiliser
pour avoir accès à l’identifiant
CSC 4538 Scrapping 46
L’API de l’autocomplétion
Un seul champ : la requête
CSC 4538 Scrapping 47
Plan d’action
Entrée : Le nom de la ville, une date
1. Utiliser l’autocomplétion pour obtenir l’identifiant de la ville
2. Obtenir la météo en utilisant la requête idoine
CSC 4538 Scrapping 48
En Python
import json
import [Link]
from [Link] import quote, urlencode
URL_AUTOCOMPLETE = "[Link]
URL_METEO = "[Link]
def get_id(city):
url = URL_AUTOCOMPLETE + quote(city)
with [Link](url) as response:
id_temp = list([Link]([Link]().decode("utf-8")).keys())[0].split("_")
return id_temp[1] + "-" + id_temp[0]
CSC 4538 Scrapping 49
En Python
def get_meteo(city, date):
id_city = get_id(city)
url = URL_METEO + id_city + "?" + urlencode({"d": date})
print(url)
with [Link](url) as response:
data = [Link]([Link]().decode("utf-8"))
return data["picto_label"], data["wind_speed"], data["tempe_min"], data["tempe_max"]
if __name__ == '__main__':
print(get_meteo("evry", "2024-05-17"))
CSC 4538 Scrapping 50
Mécanismes de protection contre le scrapping
CSC 4538 Scrapping 51
Le bon et le moins bon
Compromis entre :
● Expérience utilisateur et facilité d’accès pour les moteurs de recherche
● Prévention du scrapping non voulu
CSC 4538 Scrapping 52
Ralentir le scrapping
● Limiter le nombre d’accès par IP
○ Problème pour les réseaux publiques, les IPs non fixes, les VPNs
○ Parfois, beaucoup de requêtes même pour un utilisateur normal
● Captcha
○ Dur à mettre en place sur des appels à une API
● Détection d’activité inhabituelle
○ Difficile à mettre en place
○ Besoin de suivre plein de métriques et de les traiter (temps de remplissage formulaire, taille écran, polices
installées, nombre de clicks par minute, …)
● Forcer l’identification
○ Mauvais pour les moteurs de recherches et les utilisateurs anonymes
● Contrôler au maximum les informations accessibles
○ Pas trop d’informations d’un coup
● Donner l’information sous forme d’image
○ Pénible pour les vrais utilisateurs
CSC 4538 Scrapping 53
Ralentir le scrapping
● Contrôler le User-Agent
○ Facile à contourner
● Faire un mécanisme compliqué de contrôle d’accès
○ Génération de tokens d’authentification
○ Script Javascript difficile à lire
○ Une fois découvert et inversé, mécanisme inutile
CSC 4538 Scrapping 54
Comment contourner sans effort ?
● Rendu de la page et exécution des scripts dans un navigateur contrôlé
○ En Python : Selenium
● Presque indétectable : on utilise le même outil qu’un humain
● Par contre, très lent !
● Possibilité d’interagir avec le site :
○ Click souris, clavier
● Souvent utilisé pour faire des tests automatiques de sites web
CSC 4538 Scrapping 55
Exemple
import time
from selenium import webdriver
from selenium .webdriver .[Link] import By
if __name__ == '__main__ ':
driver = webdriver .Chrome()
driver .get("[Link] ")
time .sleep(2)
login_form = driver.find_element ([Link],
'/html/body/div[1]/div/div/div[2]/main/div/div/div/div[ '
'1]/div/section/div/div/div[1]/div/div/article/div/div/div[3]/div[ '
'1]/div/div/span ')
print(login_form .text)
CSC 4538 Scrapping 56
Exemple
CSC 4538 Scrapping 57
Considérations utiles
CSC 4538 Scrapping 58
Comment obtenir toutes les pages webs d’un site ?
● Web crawling
○ On part d’une page racine et on suit tous les liens récursivement
○ Fait par les moteurs de recherche
○ Mais toutes les pages ne sont pas accessibles par un lien (exemple : champ de recherche)
CSC 4538 Scrapping 59
[Link]
● Fichier souvent placé à la racine d’un site web
○ Exemple : [Link]
● Décrit les pages autorisées ou non pour les robots crawler de site web
● Donne parfois une idée de pages intéressantes à considérer (ex. Le sitemap)
CSC 4538 Scrapping 60
Le sitemap
● Souvent un ou plusieurs fichiers XML [Link] à la racine d’un site
○ Exemple : [Link]
○ Trouvé dans le [Link]
○ Ou parfois avec une recherche Google : site:[Link] filetype:xml
● Contient une liste de pages de site
○ Ou redirection vers d’autres sitemaps
○ Exemple : [Link]
● À télécharger une seule fois
CSC 4538 Scrapping 61
Exemple identifiant
ville
On peut éviter un appel à
l’autocomplétion !
CSC 4538 Scrapping 62
Les archives du web
● Les archives du web peuvent contenir des pages difficilement accessibles (ou
même n’existant plus)
● [Link]
● Site très lent
CSC 4538 Scrapping 63
Les archives du web
● Possibilité de rechercher des URLs par préfixe, ou même d’avoir accès à un
sitemap
CSC 4538 Scrapping 64
Aspects légaux
● Scrapping légal en général
○ Mais peut être contraire aux conditions générales d’utilisation du site
● Par contre, l’utilisation des données peut être contrôlée ou illégale
○ Le droit d’auteur est toujours présent
○ Les données personnelles très encadrées par la RGPD en Europe
● CNIL :
[Link]
ne-des-fins-de-demarchage-commercial
● En cas de doute, demander à un avocat
CSC 4538 Scrapping 65
En route vers le TP
CSC 4538 Scrapping 66