1. Introduction à la pagination
Et qui a dit que les données dont tu as besoin seront sur une seule page ? Très souvent, il faut les extraire d'un tas de pages, ou elles sont même éparpillées sur tout le site. Donc, l'un des premiers défis auxquels tu seras confronté sera la séparation des données en pages. Et le travail passionnant de leur collecte est appelé "pagination".
Oui, la pagination, ce n'est pas seulement ce moment où tu attends de passer à la page suivante des résultats de Google, mais aussi quand un web scraper se demande : "Comment automatiser ça pour ne pas le faire manuellement ?"
La pagination est un moyen d'organiser les données sur un site afin d'éviter des pages interminables avec du contenu. À la place, les sites divisent les données en pages, ajoutant des liens comme "Suivant" ou "Page suivante" pour passer d'une page à l'autre. C'est un concept important, car en tant que web scraper, tu ne voudras pas dire à ton boss que tu as raté quelque chose parce que c'était caché sur la "cinquième page".
2. Problèmes avec le scraping de données sur plusieurs pages
Le premier problème auquel tu peux être confronté, c'est l'absence de URL intuitives et prévisibles. Certains sites ne modifient pas leur URL de manière évidente lorsque tu navigues entre les pages, ce qui rend l'automatisation assez compliquée. Par exemple, au lieu de page=1, page=2, tu peux te retrouver avec x=abc, x=def sans aucune logique apparente.
Le deuxième problème, c'est la protection contre les bots. Certains sites suivent activement le nombre de requêtes provenant d'une seule adresse IP. S'ils voient que tu en fais trop, tu peux être bloqué temporairement (ou même définitivement).
Mais ne t'inquiète pas, on va apprendre à contourner ces obstacles comme des pros du scraping.
3. Contourner la pagination
Techniques et stratégies
- Analyse de la structure des URLs : Généralement, les pages utilisent un paramètre dans l'URL pour indiquer le numéro de page, comme
?page=2. Si tu trouves ça, félicitations, tu as découvert un modèle en or pour contourner la pagination ! - Recherche de liens "Suivant" : Parfois, l'URL n'est pas prévisible. Dans ces cas-là, il faut chercher des liens "Suivant" ou "Page suivante" sur la page et les suivre.
- Utilisation des requêtes AJAX : Certains sites récupèrent des données via AJAX sans recharger la page. Dans ce cas, il faut intercepter ces requêtes et les reproduire.
Passons à la pratique !
Exemple de script pour contourner la pagination et collecter des données
Voyons un exemple de script :
import requests
from bs4 import BeautifulSoup
# Fonction pour récupérer les données d'une page
def get_data_from_page(url):
response = requests.get(url)
if response.status_code == 200:
soup = BeautifulSoup(response.text, 'html.parser')
# Ici, tu extrais les données de soup — exemple
data = soup.find_all('div', class_='data-class')
for item in data:
print(item.text) # Affiche ou enregistre les données
else:
print(f"Impossible de récupérer la page : {url}")
# Logique principale pour contourner la pagination
def scrape_all_pages(start_url):
current_url = start_url
while current_url:
get_data_from_page(current_url)
soup = BeautifulSoup(requests.get(current_url).text, 'html.parser')
# On essaie de trouver le lien "Suivant"
next_button = soup.find('a', text='Suivant')
if next_button:
current_url = next_button['href']
else:
current_url = None
# On commence le scraping à partir de la première page
start_url = 'http://example.com/page=1'
scrape_all_pages(start_url)
C'est un exemple de base qui montre le principe de fonctionnement avec la pagination. Tu devras l'adapter à la structure du site avec lequel tu travailles.
Gestion de session et utilisation de user-agent
Lorsque tu envoies de nombreuses requêtes à un site, il est utile d'utiliser une session et de changer le user-agent pour réduire le risque de blocage.
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}
session = requests.Session()
session.headers.update(headers)
response = session.get('http://example.com')
Cette structure permet de simuler un navigateur plus efficacement que simplement envoyer des requêtes avec des headers vides.
4. Implémentation pratique
Maintenant que nous connaissons les bases, compliquons un peu la tâche. Examinons un cas où les liens vers les pages ont des paramètres imprévisibles, et où il faut utiliser AJAX pour récupérer les données.
Implémentation avec AJAX
Parfois, les données ne sont pas chargées sur la page principale, mais via AJAX. Si tu découvres que le site fonctionne ainsi, utilise l'outil de débogage réseau de ton navigateur pour identifier quelles requêtes sont envoyées en arrière-plan. Ensuite, reproduis ces requêtes avec Python.
# Exemple de requête AJAX
ajax_url = 'http://example.com/ajax_endpoint'
params = {
'some_param': 'value', # paramètres nécessaires pour la requête
'page': 1
}
while True:
response = session.get(ajax_url, params=params)
data = response.json()
if not data['has_more']:
break
# Traitement des données
for item in data['items']:
print(item)
params['page'] += 1 # Passer à la page suivante
Cette méthode est utile lorsque, après une analyse approfondie des requêtes et des réponses, tu comprends comment les données sont chargées dans le navigateur.
La conférence d'aujourd'hui nous a plongés dans le monde fascinant et souvent imprévisible de la pagination. Cette compétence te permettra de collecter efficacement les données des sites sans rater une seule page. Après tout, comme dans la vie, en web scraping, la méthodologie et la persévérance sont cruciales, car qui sait quels trésors cachés se trouvent sur la vingtième page !
GO TO FULL VERSION