Rotation avancée des proxys ProxyScrape dans Scrapy : middleware de téléchargement personnalisé avec réessai et détection de bannissement
Créez un middleware de téléchargement Scrapy personnalisé qui effectue la rotation des proxys résidentiels et datacenter de ProxyScrape, gère les réessais et détecte les bannissements pour un scraping fiable à grande échelle.
Aperçu
Scrapy est un framework Python puissant pour le scraping web à grande échelle, mais sans rotation de proxys, vous atteindrez rapidement les limites de débit et les bannissements d'IP. Ce tutoriel vous montre comment créer un middleware de téléchargement Scrapy personnalisé qui effectue la rotation des proxys résidentiels et datacenter de ProxyScrape, gère automatiquement les réessais et détecte les bannissements pour une collecte de données fiable.
ProxyScrape propose des proxys résidentiels, datacenter et mobiles avec prise en charge HTTP et SOCKS5, un pool de plus de 97 millions d'IP et une excellente disponibilité à long terme. Vous pouvez choisir une facturation à l'usage ou un forfait mensuel fixe selon votre volume de scraping.
Prérequis
- Python 3.8 ou version ultérieure installé.
- Scrapy installé (
pip install scrapy). - Un compte ProxyScrape avec des proxys résidentiels ou datacenter activés.
- Votre point de terminaison de proxy et vos identifiants depuis le tableau de bord ProxyScrape.
- Facultatif : une liste de points de terminaison de proxy individuels si vous préférez une rotation statique à un point de terminaison rotatif.
Étape 1 : Créer un projet Scrapy
Ouvrez votre terminal et créez un nouveau projet Scrapy :
pip install scrapy
scrapy startproject proxyscrape_scraper
cd proxyscrape_scraper
Étape 2 : Stocker les identifiants ProxyScrape en toute sécurité
Ne codez jamais les identifiants en dur dans vos fichiers source. Utilisez des variables d'environnement et lisez-les dans settings.py.
Créez un fichier .env ou exportez les variables dans votre shell :
export PROXYSCRAPE_USER='your_username'
export PROXYSCRAPE_PASS='your_password'
export PROXYSCRAPE_ENDPOINT='http://proxy.proxyscrape.com:8080'
Ensuite, dans settings.py, ajoutez :
import os
PROXYSCRAPE_USER = os.getenv('PROXYSCRAPE_USER')
PROXYSCRAPE_PASS = os.getenv('PROXYSCRAPE_PASS')
PROXYSCRAPE_ENDPOINT = os.getenv('PROXYSCRAPE_ENDPOINT')
Étape 3 : Construire le middleware de rotation
Créez un nouveau fichier proxyscrape_scraper/middlewares.py et définissez un middleware qui :
- Choisit un proxy dans une liste ou utilise votre point de terminaison rotatif.
- Injecte les identifiants dans l'URL du proxy.
- Réessaie sur les codes d'état HTTP liés aux bannissements.
# proxyscrape_scraper/middlewares.py
import random
import logging
from scrapy import signals
from scrapy.exceptions import NotConfigured
class ProxyScrapeRotationMiddleware:
def __init__(self, proxy_list, credentials):
self.proxy_list = proxy_list
self.credentials = credentials
self.logger = logging.getLogger(__name__)
@classmethod
def from_crawler(cls, crawler):
proxy_list = crawler.settings.getlist('PROXY_LIST')
credentials = (
crawler.settings.get('PROXYSCRAPE_USER'),
crawler.settings.get('PROXYSCRAPE_PASS'),
)
if not proxy_list:
raise NotConfigured('PROXY_LIST est vide')
return cls(proxy_list, credentials)
def process_request(self, request, spider):
proxy = random.choice(self.proxy_list)
user, password = self.credentials
if user and password:
proxy = proxy.replace('://', f'://{user}:{password}@')
request.meta['proxy'] = proxy
self.logger.debug(f'Utilisation du proxy : {proxy}')
def process_response(self, request, response, spider):
if response.status in [403, 429, 503]:
self.logger.warning(
f'Bannissement détecté avec le statut {response.status} sur {request.url}'
)
request.meta['proxy'] = None
return request.replace(dont_filter=True)
return response
Étape 4 : Configurer les paramètres pour la rotation et les réessais
Dans settings.py, définissez votre liste de proxys, activez le middleware et ajustez le comportement des réessais.
# settings.py
PROXY_LIST = [
'http://proxy1.proxyscrape.com:8080',
'socks5://proxy2.proxyscrape.com:1080',
# Ajoutez plus de points de terminaison depuis votre tableau de bord ProxyScrape
]
DOWNLOADER_MIDDLEWARES = {
'proxyscrape_scraper.middlewares.ProxyScrapeRotationMiddleware': 543,
'scrapy.downloadermiddlewares.retry.RetryMiddleware': 550,
}
RETRY_ENABLED = True
RETRY_TIMES = 3
RETRY_HTTP_CODES = [403, 429, 500, 502, 503, 504]
Étape 5 : Facultatif — Sessions persistantes avec ID de session
Si votre forfait ProxyScrape prend en charge les sessions persistantes via des paramètres de nom d'utilisateur, vous pouvez ajouter un ID de session au nom d'utilisateur. Vérifiez la syntaxe exacte dans votre tableau de bord ProxyScrape (souvent quelque chose comme username-session-abc123).
# Dans process_request, remplacez la logique du nom d'utilisateur :
session_id = ''.join(random.choices('abcdef0123456789', k=8))
user = f'{self.credentials[0]}-session-{session_id}'
proxy = proxy.replace('://', f'://{user}:{self.credentials[1]}@')
Utilisez les sessions persistantes lorsque vous devez conserver la même IP sur plusieurs requêtes vers le même domaine, par exemple lors de flux de connexion ou de parcours de paiement en plusieurs étapes.
Étape 6 : Tester votre scraper rotatif
Créez un spider simple pour vérifier que les requêtes passent par différents proxys.
# proxyscrape_scraper/spiders/ip_test.py
import scrapy
class IpTestSpider(scrapy.Spider):
name = 'ip_test'
start_urls = ['https://httpbin.org/ip']
def parse(self, response):
yield {'ip': response.json()['origin']}
Exécutez le spider et enregistrez les résultats :
scrapy crawl ip_test -o ips.json
Ouvrez ips.json et confirmez que les valeurs ip sont différentes. Si vous voyez la même IP de façon répétée, vérifiez votre PROXY_LIST ou la configuration du point de terminaison rotatif.
Choisir le bon type de proxy ProxyScrape pour Scrapy
| Type de proxy | Idéal pour | Rotation | Sessions persistantes | Prise en charge des protocoles |
|---|---|---|---|---|
| Résidentiel | Scraping web général, données géociblées | Point de terminaison rotatif ou liste | Généralement disponible via ID de session | HTTP, SOCKS5 |
| Datacenter | Scraping à grande vitesse de sites non protégés | Point de terminaison rotatif ou liste | Souvent statique | HTTP, SOCKS5 |
| Mobile | Sites mobiles uniquement, médias sociaux, tests d'applications | Point de terminaison rotatif | Généralement disponible | HTTP, SOCKS5 |
Dépannage
- Erreurs d'authentification (407 Proxy Authentication Required) : Vérifiez votre nom d'utilisateur et votre mot de passe. Si vous utilisez un point de terminaison rotatif, assurez-vous que les identifiants sont correctement intégrés sous la forme
user:pass@host:port. - Délais de connexion dépassés : Essayez de passer de HTTP à SOCKS5 ou inversement. Certains sites bloquent un protocole plus agressivement. Vérifiez également que votre pare-feu autorise le trafic sortant sur le port du proxy.
- Bannissements non détectés : Si vous recevez encore des CAPTCHAs ou des données vides, étendez votre détection de bannissement pour rechercher des indicateurs de CAPTCHA dans le corps de la réponse (par exemple, la présence de
captchadans le HTML). Vous pouvez également réduire votre taux de requêtes et augmenterDOWNLOAD_DELAY. - Erreurs SOCKS5 : Scrapy nécessite la bibliothèque
requestsavec prise en charge de SOCKS pour les proxys SOCKS5. Installez-la avecpip install requests[socks]si vous voyezMissing dependencies for SOCKS support. - Sessions persistantes non fonctionnelles : Confirmez le format exact du paramètre de session dans votre tableau de bord ProxyScrape. Certains forfaits utilisent
username-session-{id}, tandis que d'autres utilisent un champ de mot de passe séparé.
Résumé
Vous disposez maintenant d'un middleware Scrapy prêt pour la production qui effectue la rotation des proxys ProxyScrape, réessaie en cas de bannissement et maintient éventuellement des sessions persistantes. Cette configuration vous permet de faire évoluer vos projets de scraping sans vous soucier des limites de débit ou des blocages d'IP. Pour de meilleurs résultats, combinez des proxys résidentiels rotatifs avec un délai de téléchargement prudent et surveillez vos taux de réussite. Ajustez votre PROXY_LIST et votre logique de réessai lorsque vos cibles de scraping changent.