Créer un scraper web en Python : un guide étape par étape
Les outils de scraping sont extrêmement utiles pour extraire des données de pages web. Dans ce tutoriel, nous allons explorer comment créer un simple scraper web en Python en utilisant Beautiful Soup et Requests, deux bibliothèques puissantes et faciles à utiliser. Cependant, si vous souhaitez récolter des données en provenance de sites avec de fortes restrictions, vous allez devoir utiliser un proxy pour votre web scraper.
Configuration de l’environnement
Assure-toi d’avoir Python installé sur ton ordinateur. Nous aurons également besoin de deux bibliothèques : Requests pour faire des requêtes HTTP et Beautiful Soup pour analyser le HTML que nous récupérons. Tu peux les installer avec pip :
pip install requests beautifulsoup4
Étape 1 : Faire une requête HTTP
Tout d’abord, nous devons faire une requête HTTP pour obtenir le HTML de la page que nous voulons scraper. Nous allons utiliser la bibliothèque Requests pour cela (pensez a bien sécuriser votre code Python).
import requests url = "http://books.toscrape.com/" response = requests.get(url) print(response.status_code)
Si le code de statut est 200, cela signifie que la requête a réussi.
Étape 2 : Analyser le HTML avec Beautiful Soup
Une fois que nous avons le HTML, nous pouvons l’analyser avec Beautiful Soup pour extraire les informations que nous voulons.
from bs4 import BeautifulSoup soup = BeautifulSoup(response.text, 'html.parser') print(soup.prettify())
La méthode prettify() rend le HTML plus lisible en ajoutant des sauts de ligne et des indentations.
Étape 3 : Extraire les données
Supposons que nous voulions extraire le titre et le prix de tous les livres sur la page. Nous pouvons utiliser les méthodes find_all() ou select() de Beautiful Soup pour sélectionner les éléments HTML qui contiennent ces informations.
books = soup.find_all('article', class_='product_pod') for book in books: title = book.h3.a['title'] price = book.find('p', class_='price_color').text print(title, price)
Étape 4 : Naviguer à travers les pages
Si nous voulons scraper plus d’une page, il faut ajouter une boucle pour naviguer à travers les pages. Nous pouvons le faire en ajoutant à l’URL le numéro de la page que nous voulons scraper.
base_url = "http://books.toscrape.com/catalogue/page-{}.html" for i in range(1, 51): url = base_url.format(i) response = requests.get(url) soup = BeautifulSoup(response.text, 'html.parser') books = soup.find_all('article', class_='product_pod') for book in books: title = book.h3.a['title'] price = book.find('p', class_='price_color').text print(title, price)
Étape 5 : Gérer les erreurs
Dans un monde parfait, toutes nos requêtes HTTP réussiraient du premier coup. Toutefois, le web est imprévisible, et parfois une requête peut échouer. Pour rendre notre scraper plus robuste, nous devrions ajouter une gestion des erreurs.
for i in range(1, 51): url = base_url.format(i) try: response = requests.get(url) response.raise_for_status() except requests.exceptions.HTTPError as err: print(f"Une erreur HTTP s'est produite : {err}") continue soup = BeautifulSoup(response.text, 'html.parser') # Reste du code...
La méthode raise_for_status() lève une exception si la requête a échoué. Nous capturons cette exception avec un bloc try/except et continuons avec la prochaine itération de la boucle.
Étape 6 : Manipulation et stockage des données
Une fois que nous avons nos données, nous allons les stocker pour une utilisation ultérieure. Python a plusieurs options pour le stockage des données, mais pour cet exemple, nous utiliserons pandas pour créer un DataFrame et stocker nos données dans un fichier CSV.
Tout d’abord, tu auras besoin d’installer pandas avec pip :
pip install pandas
Ensuite, tu peux modifier notre boucle de scrapping comme suit :
import pandas as pd base_url = "http://books.toscrape.com/catalogue/page-{}.html" data = {"Titre": [], "Prix": []} for i in range(1, 51): url = base_url.format(i) try: response = requests.get(url) response.raise_for_status() except requests.exceptions.HTTPError as err: print(f"Une erreur HTTP s'est produite : {err}") continue soup = BeautifulSoup(response.text, 'html.parser') books = soup.find_all('article', class_='product_pod') for book in books: title = book.h3.a['title'] price = book.find('p', class_='price_color').text data["Titre"].append(title) data["Prix"].append(price) df = pd.DataFrame(data) df.to_csv("books.csv", index=False)
Avec ces additions, ton scraper est maintenant capable de gérer les erreurs de requête et de stocker les données scrapées dans un fichier CSV pour une analyse ultérieure.
Voilà ! Tu as créé un simple scraper web en Python. Tu peux maintenant l’adapter pour scraper n’importe quel site web que tu veux, en gardant à l’esprit de toujours respecter les conditions d’utilisation du site.
Le scraping web est un outil puissant pour extraire des données à grande échelle, mais il doit être utilisé de manière responsable. Assure-toi de toujours respecter les lois et règlements relatifs à la vie privée et aux données.