Presque tous les frameworks de scraping permettent de définir un proxy. Beaucoup moins gèrent les proxies à votre place : les faire tourner, retirer ceux qui sont bloqués, et maintenir une session sur une seule IP. Si vous utilisez des proxies résidentiels, savoir quelle partie le framework prend en charge et quelle partie la gateway prend en charge évite beaucoup de code de liaison.
Ce guide compare six outils courants sur trois questions : comment vous définissez le proxy, si l’outil fait tourner les proxies lui-même, et s’il lie une session à un seul proxy. Il montre ensuite la petite quantité de code que chacun nécessite derrière une gateway rotative.
La réponse courte
| Outil | Langage | Comment définir le proxy | Rotation automatique | Lie une session à un proxy |
|---|---|---|---|---|
| Crawlee | Node.js | ProxyConfiguration | Oui : round robin, fonction personnalisée, niveaux | Oui, via son pool de sessions |
| Scrapy | Python | request.meta["proxy"] ou variables d’environnement | Non, nécessite votre propre middleware | Non |
| Colly | Go | SetProxy ou SetProxyFunc | Oui : switcher round-robin | Non |
| Playwright | Node.js, Python, Java, .NET | Au lancement ou par contexte de navigateur | Non | Par contexte |
| Puppeteer | Node.js | Option de lancement ou par contexte de navigateur | Non | Par contexte |
| Selenium | Plusieurs | Option globale au navigateur | Non | Non |
Crawlee est le seul à traiter les proxies comme une ressource à gérer plutôt que comme un simple paramètre. Les outils de navigateur offrent une isolation par contexte, ce qui constitue la brique de base des sessions, mais la logique de rotation reste à votre charge.
Crawlee : les proxies comme ressource gérée
Le ProxyConfiguration de Crawlee prend une liste d’URLs de proxies et les fait tourner “in a round-robin fashion”. Au lieu d’une liste, vous pouvez passer une fonction qui choisit le proxy pour chaque requête. Un troisième mode, les proxies à niveaux (tiered proxies), démarre avec le niveau le moins cher (souvent aucun proxy du tout), passe à un niveau supérieur quand un site bloque le crawler, et redescend quand le niveau inférieur fonctionne à nouveau.
La partie la plus importante concerne les sessions. Quand le crawler tourne avec son pool de sessions, chaque session garde le même proxy : selon les mots de la documentation, les appels ultérieurs “with the same sessionId will always return the same proxyUrl”. Quand Crawlee décide qu’une session est bloquée, il la retire et la session suivante obtient un proxy différent. Les cookies suivent la session, donc l’IP et les cookies restent ensemble.
Scrapy : un proxy par requête, la rotation est à votre charge
Le HttpProxyMiddleware de Scrapy lit le proxy depuis request.meta["proxy"], et se rabat sur les variables d’environnement http_proxy et https_proxy. Les identifiants peuvent être placés dans l’URL, comme dans http://username:password@host:port. C’est tout ce qu’il fait. Choisir un proxy différent par requête, détecter les bannissements et mettre au repos les proxies morts vous revient, ou revient à une extension comme scrapy-rotating-proxies, qui lit une liste de proxies et traite par défaut les réponses non-200 ou vides comme des bannissements.
Notre guide d’intégration Scrapy couvre la configuration de base, et l’article sur la rotation des proxies résidentiels dans Scrapy approfondit le middleware.
Colly : un simple switcher round-robin
Colly, le framework Go, a SetProxy pour un seul proxy et SetProxyFunc pour une fonction qui en choisit un par requête. Son package proxy inclut RoundRobinProxySwitcher, qui “rotates ProxyURLs on every request” et accepte les URLs http, https et socks5. Il n’y a pas de notion de session : si deux requêtes doivent partager une IP, c’est à vous de le décider dans votre propre fonction.
Playwright et Puppeteer : isolation par contexte
Les outils d’automatisation de navigateur ne font rien tourner eux-mêmes, mais ils permettent à chaque contexte de navigateur d’utiliser son propre proxy, ce qui permet de faire tourner de nombreuses sessions séparées dans un seul navigateur.
- Playwright prend une option
proxyavecserver,usernameetpassword, soit au lancement pour tout le navigateur, soit surnewContext()pour un seul contexte. Voir notre guide d’intégration Playwright pour la configuration complète. - Puppeteer définit un proxy avec le flag de lancement
--proxy-server, ou par contexte aveccreateBrowserContext({ proxyServer }). Aucun des deux ne prend d’identifiants : vous répondez au défi d’authentification du proxy avecpage.authenticate().
Donnez à chaque contexte sa propre session et vous obtenez une IP et un pot de cookies par contexte, ce qui est ce dont un flux connecté a besoin.
Selenium : à l’échelle du navigateur, et maladroit avec les mots de passe
Selenium définit le proxy via les options du navigateur, donc il s’applique à tout le navigateur. Avec Chrome, la voie habituelle est le switch --proxy-server, qui n’a pas de place pour un nom d’utilisateur et un mot de passe. Les solutions de contournement courantes sont une petite extension de navigateur qui répond au défi d’authentification, ou un proxy de redirection local sans mot de passe qui transmet le trafic à votre fournisseur avec les identifiants. Selenium Wire, autrefois la solution populaire, a été archivé en janvier 2024 et n’est plus maintenu.
Ce qu’une gateway rotative change
La rotation des frameworks a été conçue pour des listes de proxies : une centaine de paires IP:port que vous faites tourner, testez et retirez. Une gateway résidentielle rotative fonctionne différemment. Vous vous connectez à un seul hôte et port, et la gateway choisit l’IP de sortie. Cela déplace la majeure partie du travail hors de votre code :
- La rotation se fait au niveau de la gateway, donc une seule URL de proxy suffit. Une liste round-robin d’une seule entrée n’est qu’un simple paramètre.
- Les sessions sont demandées dans le nom d’utilisateur. Avec Shifter vous ajoutez
sid-<id>pour garder une IP de sortie fixe etttl-<seconds>pour indiquer combien de temps la conserver, comme expliqué dans sticky vs rotating proxies. - La localisation fait également partie du nom d’utilisateur, donc un crawler peut cibler un pays ou une ville par requête sans une deuxième liste de proxies.
Le travail du framework se réduit donc à une seule chose : faire correspondre sa propre notion de session à l’identifiant de session dans le nom d’utilisateur du proxy.
Mise en œuvre
Crawlee. Passez une fonction qui construit le nom d’utilisateur à partir de l’identifiant de session de Crawlee. Les identifiants de session peuvent contenir des caractères comme des underscores, donc ne gardez que les lettres et les chiffres :
import { CheerioCrawler, ProxyConfiguration } from 'crawlee';
const proxyConfiguration = new ProxyConfiguration({
newUrlFunction: (sessionId) => {
const sid = sessionId
? `-sid-${String(sessionId).replace(/[^a-zA-Z0-9]/g, '')}-ttl-600`
: '';
return `http://customer-USERNAME${sid}:PASSWORD@p.shifter.io:443`;
},
});
const crawler = new CheerioCrawler({
proxyConfiguration,
useSessionPool: true,
persistCookiesPerSession: true,
async requestHandler({ request, $ }) {
console.log(request.url, $('title').text());
},
});
await crawler.run(['https://example.com/']);
Quand Crawlee retire une session bloquée, l’identifiant de session suivant donne de lui-même une nouvelle IP fixe.
Scrapy. Un petit middleware de téléchargement définit le proxy avant que le middleware de proxy propre à Scrapy ne s’exécute. Les requêtes qui portent une valeur session dans meta partagent une seule IP ; les autres tournent :
# middlewares.py
class GatewayProxyMiddleware:
def process_request(self, request, spider):
sid = request.meta.get("session")
user = "customer-USERNAME"
if sid:
user += f"-sid-{sid}-ttl-600"
request.meta["proxy"] = f"http://{user}:PASSWORD@p.shifter.io:443"
# settings.py
DOWNLOADER_MIDDLEWARES = {
"myproject.middlewares.GatewayProxyMiddleware": 350,
}
Playwright. Un contexte par session :
const context = await browser.newContext({
proxy: {
server: 'http://p.shifter.io:443',
username: 'customer-USERNAME-sid-cart1-ttl-600',
password: 'PASSWORD',
},
});
Lequel choisir
Choisissez le framework en fonction du site et de l’équipe, pas de ses fonctionnalités de proxy. Crawlee est le choix le plus solide quand vous voulez que le blocage, les sessions et les niveaux de proxy soient gérés pour vous en Node.js. Scrapy reste le moyen le plus rapide d’explorer un grand nombre de pages HTML simples en Python, et son manque côté proxy se résume à un middleware de dix lignes. Playwright ou Puppeteer sont les bons outils quand les pages nécessitent un véritable navigateur, et les contextes vous donnent des sessions propres. Selenium fonctionne aussi, avec plus d’efforts autour des identifiants.
Derrière une gateway rotative, les six se réduisent au même schéma : une seule URL de proxy, et un identifiant de session dans le nom d’utilisateur partout où les requêtes doivent partager une IP. Pour en savoir plus sur la mise en place de ceci dans un crawler de production, voir notre cas d’usage web scraping.
Sources et références
- Crawlee, guide de gestion des proxies : crawlee.dev
- Scrapy, référence du middleware de téléchargement (HttpProxyMiddleware) : docs.scrapy.org
- scrapy-rotating-proxies : github.com
- Colly, package proxy : pkg.go.dev
- Playwright, réseau et HTTP proxy : playwright.dev
- Puppeteer, BrowserContextOptions : pptr.dev
- Dépôt Selenium Wire (archivé le 3 janvier 2024) : github.com