- A propos du webscraping
- Pourquoi utilise -t- on le webscraping?
- Les Outils couramment utilisés pour le web scraping
- Installation de beautifulSoup & requests
- Envoyer et analyser une requête HTTP
- Analyser le contenu HTML avec BeautifulSoup
- Naviguer dans l'arbre HTML
- Extraire des attributs spécifiques
- Gérer des structures plus complexes
- Gérer des pages dynamiques
- Scraping avec pagination
- Respecter les conditions d'utilisation
- Exemple complet : Scraping des titres d'articles d'un blog
- Exporter les données extraites
1. A propos du webscraping
Le scraping Web est l'un des moyens les plus efficaces et les plus utiles pour extraire des données d'un site Web.
Certains sites Web peuvent contenir une très grande quantité de données précieuses: Cours boursiers, détails des produits, statistiques sportives, contacts de l'entreprise, etc.
Si vous souhaitez accéder à ces informations, vous devez soit utiliser le format utilisé par le site Web, soit copier-coller les informations manuellement dans un nouveau document. C'est là que le scraping Web peut vous aider.
Qu'est-ce que le scraping Web ?
Le scraping Web fait référence à l'extraction de données d'un site Web. Ces informations sont collectées puis exportées dans un format plus utile pour l'utilisateur. Qu'il s'agisse d'une feuille de calcul ou d'une API.
Bien que le scraping Web puisse être effectué manuellement, dans la plupart des cas, les outils automatisés sont préférés lors du scraping de données Web, car ils peuvent être moins coûteux et fonctionner à un rythme plus rapide.
Mais dans la plupart des cas, le scraping Web n'est pas une tâche simple. Les sites Web se présentent sous de nombreuses formes, par conséquent, les scraping web varient en termes de fonctionnalités et de caractéristiques.
2. Pourquoi utilise -t- on le webscraping?
Les données obtenues via le web scraping peuvent être utilisées dans de nombreux domaines et pour différentes applications, en fonction des besoins:
- Surveillance des concurrents : Collecter des informations sur les produits commerciaux, promotions, avis et stratégies des concurrents pour ajuster ses propres actions commerciale.
- Études de marché : Analyser des données de marché telles que les tendances de consommation, les produits populaires, ou les nouvelles sorties.
- Données financières : Extraction des données boursières (prix des actions, fluctuations des marchés) à partir de sites spécialisés, pour alimenter des systèmes de trading ou d'analyse financière.
- Suivi de produits : Extraction de données sur les produits commerciaux (disponibilité, ruptures de stock, promotions) pour les détaillants et e-commerçants afin de suivre en temps réel les performances du marché.
- Autre usages : Ainsi que de nombreux autres usages selon les besoins des sociétés et des organismes...
3. Les Outils couramment utilisés pour le web scraping
- BeautifulSoup : Une bibliothèque Python permettant de naviguer dans le HTML et d'extraire des données à partir de la structure de la page.
- lxml : Un parser XML/HTML très performant, utilisé pour analyser rapidement les pages web.
- Selenium : Utilisé pour les sites dynamiques, où le contenu est généré par JavaScript. Selenium permet d'automatiser un navigateur web et d'interagir avec les éléments de la page (clics, défilements, etc.).
- Scrapy : Un framework Python complet dédié au scraping de données à grande échelle. Il est puissant pour crawler plusieurs pages de manière automatique.
Dans ce tutoriel nous allons nous intéresser à la bibliothèque beautifulsoup & requests
4. Installation de beautifulSoup & requests
Pour créer des applications de scraping web, il est nécessaire d'installer les deux bibliothèques beautifulSoup et requests, il suffit pour cela d'utiliser l'invite de commande cmd et d'exécuter la commande:
1 |
pip install beautifulsoup4 requests |
5. Envoyer et analyser une requête HTTP
Le web scraping consiste à envoyer des requêtes HTTP pour obtenir le contenu des pages web.
Les données sont ensuite analysées (parsed) à partir de la structure HTML du document pour en extraire les informations désirées. A cet effet nous utilisons la bibliothèque requests pour envoyer une requête HTTP vers une page web et obtenir le code HTML.
1 2 3 4 5 6 7 8 9 10 11 |
import requests url = "https://example.com" response = requests.get(url) # Vérifiez que la requête a réussi if response.status_code == 200: print("Requête réussie!") html_content = response.text else: print(f"Erreur: {response.status_code}") |
6. Analyser le contenu HTML avec BeautifulSoup
Une fois que vous avez le code HTML, vous pouvez utiliser BeautifulSoup pour l'analyser et naviguer dans le DOM du contenu HTML.
1 2 3 4 5 6 7 |
from bs4 import BeautifulSoup as bsp # Parser le contenu HTML soup = bsp(html_content, "html.parser") # Affiche le contenu du titre de la page print(soup.title.text) |
Code complet:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
import requests from bs4 import BeautifulSoup as bsp url = "https://www.wikipedia.org" # créer un objet requests response = requests.get(url) # récuperer le contenu de l'objet response content = response.text # créer un objet BeautifulSoup soup = bsp(content , 'html.parser') # afficher le titre avec balise : <title>Wikipedia</title> print(soup.title) # afficher le titre sans balise <title> : print("Titre de la page : ", soup.title.text) # Titre de la page : Wikipedia |
7. Naviguer dans l'arbre HTML
BeautifulSoup permet de naviguer facilement dans l'arbre HTML et de trouver les éléments dont vous avez besoin.
7.1 Accéder à des balises spécifiques
1 2 3 4 5 6 7 8 |
# Trouver la première balise <h1> h1_tag = soup.find('h1') print(h1_tag.text) # Trouver toutes les balises <p> p_tags = soup.find_all('p') for p in p_tags: print(p.text) |
7.2 Utiliser des sélecteurs CSS
1 2 3 4 5 6 7 |
# Sélectionner un élément par classe element = soup.select_one('.my-class') print(element.text) # Sélectionner tous les éléments avec un id spécifique element_by_id = soup.select('#my-id') print(element_by_id) |
8. Extraire des attributs spécifiques
Vous pouvez également extraire des attributs HTML tels que les liens des images...
1 2 3 4 5 6 7 |
# Trouver tous les liens (<a>) for link in soup.find_all('a'): print(link.get('href')) # Extraire l'attribut 'src' des images for img in soup.find_all('img'): print(img.get('src')) |
9. Gérer des structures plus complexes
Certains sites peuvent avoir des structures HTML complexes. Vous pouvez combiner différentes méthodes pour extraire des données de sections spécifiques.
1 2 3 4 5 6 7 |
# Extraire du texte dans une balise div avec une classe spécifique div_content = soup.find('div', class_='content') print(div_content.text) # Extraire un lien avec une classe spécifique special_link = soup.find('a', class_='special-link') print(special_link['href']) |
10. Gérer des pages dynamiques
Certaines pages web utilisent JavaScript pour charger dynamiquement du contenu, ce qui peut rendre le scraping avec requests et BeautifulSoup insuffisant. Dans ce cas, vous devrez utiliser une solution comme Selenium pour simuler un navigateur.
11. Scraping avec pagination
Si les données sont réparties sur plusieurs pages, vous devrez gérer la pagination pour accéder à toutes les pages.
1 2 3 4 5 6 |
base_url = "https://example.com/page/" for i in range(1, 6): # Scrape les 5 premières pages url = base_url + str(i) response = requests.get(url) soup = BeautifulSoup(response.text, "html.parser") # Extraction de données sur chaque page |
12. Respecter les conditions d'utilisation
Notez bien qu'ilfaut toujours respecter les règles du site en consultant le fichier robots.txt et en évitant d'envoyer trop de requêtes en un court laps de temps (throttling). Vous pouvez utiliser des pauses entre les requêtes pour éviter de surcharger le serveur.
1 2 3 4 |
import time # Ajouter un délai entre chaque requête time.sleep(10) # Pause de 10 secondes entre les requêtes |
13. Exemple complet - Scraping des titres d'articles d'un blog
Voici un exemple complet qui scrape les titres d'articles d'une page d'un blog:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
import requests from bs4 import BeautifulSoup url = "https://example-blog.com" response = requests.get(url) if response.status_code == 200: soup = BeautifulSoup(response.text, "html.parser") # Trouver tous les titres d'articles articles = soup.find_all('h2', class_='article-title') for article in articles: title = article.text print(title) else: print(f"Erreur: {response.status_code}") |
14. Exporter les données extraites
Vous pouvez exporter les données collectées dans un fichier CSV ou JSON.
14.1 Exporter vers un fichier CSV
1 2 3 4 5 6 7 8 9 |
import csv # Données collectées data = [["Titre", "Lien"], ["Article 1", "https://example.com/article1"], ...] # Écriture dans un fichier CSV with open('articles.csv', 'w', newline='', encoding='utf-8') as f: writer = csv.writer(f) writer.writerows(data) |
14.2 Exporter vers un fichier JSON
1 2 3 4 5 6 7 8 9 10 11 12 13 |
import json # Exemple de données collectées data = { "articles": [ {"titre": "Article 1", "lien": "https://example.com/article1"}, {"titre": "Article 2", "lien": "https://example.com/article2"} ] } # Écriture dans un fichier JSON with open('articles.json', 'w', encoding='utf-8') as f: json.dump(data, f, ensure_ascii=False, indent=4) |
Younes Derfoufi
CRMEF OUJDA