Comprendre le Web Scraping
Le web scraping, ou « grattage web », consiste à extraire automatiquement des données à partir de pages web. Cela permet d'automatiser la collecte d’informations utiles pour l’analyse statistique, la veille concurrentielle, ou encore la création de bases de données structurées.
Applications pratiques du scraping
- Analyse de tendances sur les réseaux sociaux
- Suivi des prix dans le e-commerce
- Extraction d’images, de vidéos ou de contenus textuels
- Étude de la structure HTML de sites web
Environnement technique recommandé
Pour débuter, vous aurez besoin :
- D’une installation de Python 3.x
- D’un environnement de développement comme PyCharm ou VS Code
- Des bibliothèques suivantes :
requests,BeautifulSoup4,lxml,os
Approche méthodologique
- Récupération du contenu HTML : Envoyer une requête HTTP vers l’URL cible et récupérer la réponse sous forme de texte.
- Analyse du DOM : Parcourir l’arbre HTML pour localiser les éléments souhaités (balises, attributs, classes).
- Extraction et traitement : Isoler les données pertinentes (liens, images, textes) et les formater si nécessaire.
- Sauvegarde locale : Stocker les résultats dans des fichiers (images, JSON, CSV, etc.).
Gestion des blocages courants
Certains sites bloquent les requêtes automatisées en renvoyant une erreur 403 Forbidden. Pour contourner cela, il est essentiel de simuler un comportement humain :
- Ajouter un en-tête
User-Agentpour imiter un navigateur - Espacez les requêtes avec
time.sleep()pour éviter la détection
Exemple complet : Télécharger des images depuis un forum
Nous allons récupérer toutes les images d’une page spécifique du forum Baidu Tieba.
import requests
from bs4 import BeautifulSoup
import os
import re
def recuperer_html(url):
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
}
reponse = requests.get(url, headers=headers)
reponse.encoding = 'utf-8' # Gestion des caractères spéciaux
return reponse.text
def extraire_images(html, dossier='telechargements'):
if not os.path.exists(dossier):
os.makedirs(dossier)
# Expression régulière pour trouver les URLs d'images .jpg
motif = r'src="(https?://[^"]+\.jpg)"'
urls_trouvees = re.findall(motif, html)
for index, lien in enumerate(urls_trouvees):
try:
img_data = requests.get(lien).content
chemin = os.path.join(dossier, f'image_{index}.jpg')
with open(chemin, 'wb') as fichier:
fichier.write(img_data)
print(f"Téléchargé : {lien}")
except Exception as e:
print(f"Erreur lors du téléchargement {lien} : {e}")
# Lancement du script
url_cible = "http://tieba.baidu.com/p/3840085725"
code_source = recuperer_html(url_cible)
extraire_images(code_source)
Utilisation de BeautifulSoup pour l’analyse HTML
La bibliothèque BeautifulSoup simplifie grandement l’analyse du code HTML grâce à une syntaxe intuitive.
from bs4 import BeautifulSoup
def analyser_page():
contenu_html = '''
<html>
<head><title>Histoire du Petit Lapin</title></head>
<body>
<p class="titre"><b>Histoire du Petit Lapin</b></p>
<p class="recit">
Il était une fois trois petites soeurs :
<a href="http://exemple.com/elsie" class="soeur" id="s1">Elsie</a>,
<a href="http://exemple.com/lacie" class="soeur" id="s2">Lacie</a>,
<a href="http://exemple.com/tillie" class="soeur" id="s3">Tillie</a>.
</p>
</body>
</html>
'''
soup = BeautifulSoup(contenu_html, 'lxml')
# Afficher la structure formatée
print(soup.prettify())
# Extraire des éléments précis
print("Titre :", soup.title.string)
print("Classe du paragraphe :", soup.p['class'])
print("Tous les liens :", [a['href'] for a in soup.find_all('a')])
print("Cible ID s3 :", soup.find(id="s3").string)
analyser_page()
Conseils finaux
- Préférez
requestsàurllibpour sa simplicité - Choisissez antre regex, BeautifulSoup ou XPath selon la complexité du site
- Traitez toujours les erreurs réseau avec des blocs
try/except - Respectez les fichiers
robots.txtet les conditions d’utilisation