Web Scraping avec Python : Introduction et Techniques Fondamentales

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

  1. 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.
  2. Analyse du DOM : Parcourir l’arbre HTML pour localiser les éléments souhaités (balises, attributs, classes).
  3. Extraction et traitement : Isoler les données pertinentes (liens, images, textes) et les formater si nécessaire.
  4. 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-Agent pour 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 à urllib pour 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.txt et les conditions d’utilisation

Étiquettes: Python web-scraping BeautifulSoup requests regex

Publié le 4 septembre à 05h02