L’extraction de données sur le web est devenue une pratique courante pour les développeurs et data scientists. Avec des outils comme Beautiful Soup en Python, il est facile de scraper des sites web. Cependant, une des étapes essentielles dans ce processus est l’utilisation de proxy scrapers. Les proxies aident à contourner les limitations d’accès aux sites web. Découvrez comment utiliser un proxy scraper en combinaison avec Beautiful Soup en Python.
Pourquoi utiliser un proxy scraper ?
Lorsqu’on scrape des pages web, on peut rapidement se retrouver bloqué par les serveurs cibles. Cela peut être dû aux limitations IP, captchas ou autres mécanismes de sécurité. L’application d’un proxy scraper permet de :
- Contourner les restrictions IP
- Améliorer la vitesse de scraping
- Éviter les blocages temporaires ou permanents
Les risques du scraping sans proxy
Ne pas utiliser de proxy lors du scraping présente plusieurs risques :
- Blocage de l’adresse IP par les serveurs visés
- Faux résultats causés par des mesures anti-scraping
- Diminution de la vitesse de scraping due aux limitations serveur
Configurer un environnement Python pour le scraping
Installer les packages nécessaires
Démarrons en installant les packages nécessaires. Utilisez pip pour installer Beautiful Soup, Requests et un package de gestion de proxies tel que gimmeproxy ou scrapy-proxy-pool. Voici quelques commandes utiles :
pip install beautifulsoup4
pip install requests
pip install scrapy-proxy-pool
Importer les modules
Une fois les packages installés, importez-les dans votre script Python :
import requests
from bs4 import BeautifulSoup
from scrapy_proxy_pool import ProxyPool
Obtenir des proxies
Utiliser un service gratuit
Il existe des services gratuits qui fournissent des listes de proxies. Par exemple, vous pouvez utiliser free-proxy-list.net pour obtenir des IP et ports de proxies gratuits. Voici un exemple d’extraction :
response = requests.get('https://www.sslproxies.org/')
soup = BeautifulSoup(response.text, 'html.parser')
proxy_table = soup.find(id='proxylisttable')
proxies = []
for row in proxy_table.tbody.find_all('tr') :
proxies.append({
'ip' : row.find_all('td')[0].string,
'port' : row.find_all('td')[1].string
})
Intégrer un pool de proxies
Pour gérer automatiquement une rotation de proxies, utilisez un pool de proxies. Scrapy-Proxy-Pool facilite cette tâche :
# Initialisation du pool
proxy_pool = ProxyPool()
# Récupérer un proxy aléatoire
proxy = proxy_pool.get_random_proxy()
print(proxy)
Scraper un site web avec Beautiful Soup et proxies
Mettre en place une requête avec un proxy
Lorsque vous avez une liste de proxies ou un pool configuré, envoyez vos requêtes HTTP en utilisant ces proxies. Voici un exemple :
proxies = {
'http' : f"http://{proxy['ip']} :{proxy['port']}",
'https' : f"https://{proxy['ip']} :{proxy['port']}"
}
url = 'http://example.com'
response = requests.get(url, proxies=proxies)
if response.status_code == 200 :
soup = BeautifulSoup(response.content, 'html.parser')
print(soup.prettify())
Gérer les erreurs et les échecs
Assurez-vous de gérer les potentielles erreurs lorsque vous travaillez avec des proxies :
try :
response = requests.get(url, proxies=proxies, timeout=5)
response.raise_for_status() # Provoque une exception pour les codes statut > 400
except requests.exceptions.RequestException as e :
print(f'Erreur : {e}')
# Reprendre avec un autre proxy ici
Stratégies avancées pour éviter le blocage
Changer fréquemment de proxy
En changeant constamment de proxy après chaque requête ou série de requêtes, on réduit les chances de détection :
for url in urls_to_scrape :
proxy = proxy_pool.get_random_proxy()
proxies = {
'http' : f"http://{proxy['ip']} :{proxy['port']}",
'https' : f"https://{proxy['ip']} :{proxy['port']}"
}
try :
response = requests.get(url, proxies=proxies, timeout=5)
if response.status_code == 200 :
soup = BeautifulSoup(response.content, 'html.parser')
process_data(soup)
except Exception as e :
continue # Passer au prochain proxy si erreur
Personnaliser les en-têtes HTTP
L’adaptation des en-têtes HTTP pour simuler un navigateur réel peut également aider à éviter le blocage :
headers = {
'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
'Accept-Language' : 'en-US,en;q=0.9'
}
response = requests.get(url, proxies=proxies, headers=headers)
Nettoyer et sauvegarder les données extraites
Après extraction des données, nettoyer et stocker ces informations dans des formats tels que CSV ou base de données aide à l’analyse :
Nettoyage des données
Utilisez Pandas pour manipuler et nettoyer facilement l’ensemble de données :
import pandas as pd
data = [] # Remplissez cette liste avec les données extraites
df = pd.DataFrame(data)
# Exemple de nettoyage
df.drop_duplicates(inplace=True)
df.to_csv('extracted_data.csv', index=False)
Sauvegarde dans une base de données
SQLAlchemy permet de sauvegarder directement dans une base de données :
from sqlalchemy import create_engine
engine = create_engine('sqlite:///extracted_data.db')
df.to_sql('web_data', engine, if_exists='replace', index=False)
Outils alternatifs de scraping et comparaison
Scrapy
Pour ceux qui cherchent plus de fonctionnalités, Scrapy est une alternative puissante à Beautiful Soup avec des options intégrées pour la gestion de proxies :
# Installation
pip install scrapy
# Initialisation d'un projet Scrapy
scrapy startproject myproject
Comparaison rapide
Beautiful Soup est excellent pour les projets simples et ciblés, tandis que Scrapy est mieux adapté aux projets complexes nécessitant un contrôle granulé et des fonctionnalités avancées. Choisir entre les deux dépend de la spécificité et de la complexité du projet.