Skip to content
Advanced / 7 min read

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.

Linux SOCKS5 HTTP(S) Scraping Web

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 captcha dans le HTML). Vous pouvez également réduire votre taux de requêtes et augmenter DOWNLOAD_DELAY.
  • Erreurs SOCKS5 : Scrapy nécessite la bibliothèque requests avec prise en charge de SOCKS pour les proxys SOCKS5. Installez-la avec pip install requests[socks] si vous voyez Missing 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.