Retour au blog
Les techniques de web scraping
Sorin-Gabriel MaricaLast updated on May 1, 202613 min read

Web Scraping avec Node-Unblocker : Un guide pratique

Web Scraping avec Node-Unblocker : Un guide pratique
En bref : Node-unblocker transforme une application Express en un proxy HTTP à préfixe d'URL que vous pouvez personnaliser. Ce guide sur Node-unblocker pour le web scraping vous explique comment l'installer, configurer les middlewares de requêtes et de réponses, faire tourner les instances, le déployer sur Docker ou Heroku, et déterminer à quel moment il vaut mieux opter pour une API de scraping gérée.

Si vous avez déjà eu besoin d'ajouter un relais proxy personnalisé devant un scraper Node.js, vous vous êtes probablement retrouvé face à un choix délicat entre « utiliser simplement un point de terminaison SOCKS5 » et « déployer une véritable flotte de proxys ». La configuration de Node-unblocker pour le web scraping se situe idéalement entre ces deux extrêmes : il s'agit d'un proxy léger, programmable et montable sur Express que vous pouvez étendre avec JavaScript.

Node-unblocker est une bibliothèque Node.js dotée d’une API compatible Express. Vous lancez une instance, la montez sur un préfixe de route tel que /proxy/, et toute URL ajoutée à ce préfixe est récupérée, réécrite et renvoyée en flux vers l’appelant. Comme tout s’exécute dans votre propre processus Node, vous pouvez ajouter des middlewares pour modifier les requêtes et les réponses, changer l’adresse IP en fonction de l’environnement et intégrer la logique métier directement dans le proxy.

Cet article s'adresse aux développeurs Node.js de niveau intermédiaire qui souhaitent un proxy Node Unblocker fonctionnel pour le web scraping, et non une présentation marketing. Nous aborderons l'installation, le câblage Express minimal, l'objet de configuration, les middlewares de requête et de réponse, un modèle de pool de proxys rotatifs, deux voies de déploiement en production (Docker et Heroku), les garde-fous juridiques et éthiques, ainsi que la limite à partir de laquelle la bibliothèque cesse d'être utile.

Proxy Node-unblocker pour le web scraping : qu'est-ce que c'est et pourquoi c'est important

Node-unblocker est une bibliothèque de serveur proxy Node.js qui expose une API compatible Express permettant de mettre en place un proxy personnalisé en quelques lignes de code. Elle a été initialement conçue pour contourner la censure sur Internet, mais c'est cette même fonctionnalité de base (un proxy HTTP en cours d'exécution et personnalisable) qui rend la configuration d'un proxy Node.js pour le web scraping intéressante pour les auteurs de scrapers.

Ce qui est inhabituel, c'est l'interface. Au lieu d'utiliser le protocole proxy HTTP ou SOCKS5 classique sur un port dédié, Node-unblocker expose un préfixe d'URL de type REST. Vous effectuez une requête https://your-proxy/proxy/https://target.com/page, et la bibliothèque récupère la cible à votre place et vous la renvoie en flux continu. C'est ce changement qui ouvre la voie au middleware sur lequel nous nous appuierons plus tard.

Quand Node-Unblocker s'intègre à votre pile de scraping (et quand ce n'est pas le cas)

Avant d'écrire du code, déterminez si un proxy Node-Unblocker pour le scraping web est l'outil qu'il vous faut.

Cas de figure :

  • Vous effectuez principalement du scraping sur du HTML statique ou des points de terminaison JSON simples.
  • Vous souhaitez centraliser la mise en forme des requêtes (en-têtes, authentification, nettoyage des cookies) pour plusieurs scrapers derrière une seule URL.
  • Vous avez besoin d'un contournement géographique pour quelques régions et pouvez faire tourner un serveur dans chacune d'elles.
  • Vous souhaitez une couche de middleware native Node afin que votre code de scraping reste en JavaScript.

À éviter si :

  • La cible repose sur des pop-ups OAuth, postMessage()ou un routage côté client intensif.
  • Vous avez besoin d'adresses IP résidentielles tournantes à grande échelle, ou d'une couverture au niveau national dans des dizaines de régions.
  • Vous êtes confronté à des CAPTCHA, à Cloudflare ou à d'autres solutions anti-bot.
  • Votre équipe n'a pas envie de gérer et de mettre à jour des serveurs Node.

Si deux ou plusieurs des conditions « à éviter » s'appliquent, passez directement à la section sur les alternatives gérées.

Prérequis et initialisation du projet

Vous devez disposer d’une version LTS récente de Node.js et de npm sur votre machine. Au moment de la rédaction de ce document, utilisez la version LTS actuelle ; les exemples plus anciens ciblent Node 16, mais vérifiez auprès des téléchargements officiels de Node.js avant de choisir une version package.json. Si vous jonglez entre plusieurs versions, installez nvm et exécutez nvm use --lts.

Lancez un nouveau projet :

mkdir node-unblocker-proxy && cd node-unblocker-proxy
npm init -y
npm install unblocker express

Construisez le serveur proxy avec Express et Unblocker

Une fois les dépendances installées, créez index.js. Le serveur Node.js minimal de web scraping et de déblocage est suffisamment petit pour tenir sur un seul écran :

// index.js
const express = require("express");
const Unblocker = require("unblocker");

const app = express();
const unblocker = new Unblocker({ prefix: "/proxy/" });

app.use(unblocker);

app
  .listen(process.env.PORT || 8080, () => {
    console.log("Proxy listening on", process.env.PORT || 8080);
  })
  .on("upgrade", unblocker.onUpgrade);

Quelques points méritent d'être soulignés. new Unblocker({...}) renvoie un middleware compatible Express, c'est pourquoi un seul app.use(unblocker) suffit pour monter l'ensemble du proxy. Le port par défaut est 8080, mais peut être redéfini via la PORT , ce qui permet au même fichier de fonctionner dans Docker, Heroku et d’autres environnements conteneurisés.

La .on("upgrade", unblocker.onUpgrade) ligne est la partie facile à oublier. Sans elle, les connexions WebSocket proxysées via le préfixe d'URL ne termineront jamais le changement de protocole, et tout site cible utilisant des mises à jour en direct cessera de fonctionner. Configurez-la même si vous pensez ne pas en avoir besoin aujourd'hui, car la plupart des sites utilisent discrètement les WebSockets pour la télémétrie.

Configurer l'instance Unblocker : préfixe, WebSockets et débogage

La plupart des comportements de node-unblocker sont contrôlés via l'objet options transmis à son constructeur. Trois paramètres sont essentiels dès le départ :

  • prefix définit le chemin d'URL sous lequel le proxy est monté. Avec prefix: "/proxy/", chaque requête vers /proxy/<encoded-url> est récupérée pour le compte de l'appelant.
  • onUpgrade est le gestionnaire que vous liez à l'événement upgrade afin que le trafic WebSocket soit correctement transféré.
  • DEBUG=unblocker:* est une variable d'environnement, et non un champ de configuration, mais c'est le moyen le plus rapide de voir ce que fait réellement la bibliothèque en cas de requête qui se comporte de manière anormale.

D'autres options sont disponibles dans le fichier README du projet sur GitHub, mais ces trois-là couvrent presque tous les cas d'utilisation de Node Unblocker pour le web scraping avant que vous ne commenciez à ajouter des middlewares.

Exécutez et testez le proxy localement

Démarrez le serveur :

node index.js

Accédez-y ensuite depuis un terminal séparé ou votre navigateur :

curl -i http://localhost:8080/proxy/https://example.com/

Vous devriez voir un code HTTP 200 et le corps HTML réécrit. Dans le navigateur, ouvrez DevTools et observez l'onglet Réseau : les requêtes pour les sous-ressources devraient également passer par /proxy/. Si quelque chose semble anormal, redémarrez le serveur avec la journalisation détaillée :

DEBUG=unblocker:* node index.js

Signatures courantes : ECONNRESET lors de la négociation TLS signifient généralement que l'amont a bloqué votre IP, tandis qu'une page blanche avec un code d'état 200 est presque toujours due à du JavaScript que node-unblocker n'a pas pu réécrire. Ces deux cas constituent des modes d'échec normaux pour une configuration de node-unblocker destinée au web scraping.

Modifier le trafic avec des middlewares de requête et de réponse

C'est grâce aux middlewares qu'un proxy Node Unblocker de web scraping commence à ressembler à une couche d'abstraction plutôt qu'à une simple redirection. Vous passez au constructeur un requestMiddleware tableau et un responseMiddleware tableau, et chaque fonction peut modifier l' data avant qu'il ne soit transféré.

Voici une paire qui injecte un en-tête d'authentification interne et supprime les Set-Cookie de la réponse :

function injectAuth(data) {
  data.headers["x-internal-auth"] = process.env.SCRAPER_TOKEN;
  data.headers["user-agent"] = "MyCompanyScraper/1.0 (+https://mycompany.example/bot)";
}

function stripCookies(data) {
  delete data.headers["set-cookie"];
}

const unblocker = new Unblocker({
  prefix: "/proxy/",
  requestMiddleware: [injectAuth],
  responseMiddleware: [stripCookies],
});

Deux modèles s'imposent ici. Tout ce que vous devriez autrement répéter dans chaque scraper (rotation des user agents, ajout de jetons internes, normalisation Accept-Language) a sa place dans requestMiddleware. Tout ce que vous souhaitez nettoyer avant l'analyse (cookies tiers, en-têtes de suivi, corps de message trop volumineux) se trouve dans responseMiddleware. Centraliser cela derrière une seule URL signifie que chaque scraper en aval, quel que soit le langage, bénéficie du même traitement sans copier-coller, et les audits se résument à une recherche grep sur un seul fichier lorsque le service juridique vous demande comment vous identifiez votre bot. Pour des aides à la récupération plus avancées tenant compte des proxys, nos guides sur l'utilisation d'un proxy avec node-fetch et sur la configuration du proxy Axios s’accordent parfaitement avec ce modèle.

Évolutivité horizontale : créer un pool de proxys rotatifs avec plusieurs instances

Une instance de node-unblocker correspond à une adresse IP. Pour répartir la charge et contourner les limites de débit par IP, déployez plusieurs instances (idéalement dans différentes régions) et choisissez-en une au hasard pour chaque appel. Un helper minimal ressemble à ceci :

const PROXIES = [
  "https://proxy-us-1.example.com/proxy/",
  "https://proxy-us-2.example.com/proxy/",
  "https://proxy-eu-1.example.com/proxy/",
];

function pickProxy() {
  return PROXIES[Math.floor(Math.random() * PROXIES.length)];
}

async function scrape(targetUrl) {
  const proxy = pickProxy();
  const res = await fetch(proxy + encodeURI(targetUrl));
  return res.text();
}

Cela suffit pour quelques milliers de requêtes par jour. Ajoutez une couche de réessai avec un proxy différent pour les réponses 4xx et 5xx, ainsi qu'un disjoncteur qui retire un hôte du PROXIES après N échecs consécutifs. Pour un débit important, vous réinventez la gestion des proxys, et c'est là que les outils dédiés à la gestion des proxys et les proxys résidentiels rotatifs commencent à s'avérer rentables.

Déploiement en production : comparaison entre Docker et Heroku

Il existe deux voies de déploiement fiables pour un proxy de déblocage de nœuds de web scraping.

Docker fonctionne partout où un conteneur fonctionne et constitue le choix le plus sûr à long terme. Un fichier Dockerfile minimal :

FROM node:lts-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --omit=dev
COPY . .
EXPOSE 8080
CMD ["node", "index.js"]

Compilez avec docker build -t my-unblocker . et déployez l'image sur Fly.io, Render, AWS ECS, GCP Cloud Run ou tout autre hôte de conteneurs. Fixez explicitement la balise Node en production.

Heroku est plus rapide pour les prototypes si vous disposez déjà d'un compte. Ajoutez un engines bloc et un start script à package.json (utilisez la version majeure LTS actuelle ; ne copiez pas aveuglément d'anciens "16.x" ), puis :

heroku login
heroku apps:create my-unblocker
git init && heroku git:remote -a my-unblocker
git add . && git commit -am "Initial commit"
git push heroku main

Une fois la compilation terminée, votre proxy est accessible à l'adresse https://my-unblocker.herokuapp.com/proxy/<url>. L'offre gratuite de Heroku n'existe plus, alors tenez compte du coût du dyno ; si les tarifs ou les politiques changent, votre image Docker sera transférée vers un autre hébergeur sans modification du code.

Respectez les politiques d'utilisation acceptable de l'hébergeur et le fichier robots.txt

Exécuter un proxy public sur l'infrastructure d'un tiers est un véritable champ de mines en matière de politiques. La politique d'utilisation acceptable de Heroku, par exemple, a toujours restreint les proxys publics et le scraping agressif ; vérifiez la politique d'utilisation acceptable en vigueur avant de déployer, car la formulation change. Dans tous les cas, définissez un user-agent unique et identifiable, respectez robots.txt conformément à la RFC 9309, limitez le débit de votre scraper et ignorez les cibles qui interdisent explicitement l'automatisation dans leurs conditions d'utilisation.

Limites et modes de défaillance courants

Des mises en garde honnêtes permettent de gagner du temps lors du débogage. Un proxy de déblocage de nœuds de scraping Web risque de rencontrer des difficultés dans les cas suivants :

  • OAuth et postMessage() flux. Les fenêtres contextuelles qui échangent des jetons via window.postMessage survivent rarement à la réécriture d'URL. Symptôme : une fenêtre de connexion vide qui ne se ferme jamais.
  • Les SPA gourmandes en JS. Des rapports publics signalent que des sites tels que YouTube, Twitter/X, Discord et Instagram contournent le débloqueur de nœuds ; vérifiez auprès des tickets GitHub du projet, car la liste évolue. Symptôme : page blanche avec un statut 200.
  • Interfaces utilisateur basées sur WebSocket lorsque onUpgrade est manquant. Symptôme : échec de la mise à niveau dans DevTools.
  • Pas de rotation d'IP intégrée, de résolution de CAPTCHA ni de contournement de Cloudflare. Chacune de ces fonctionnalités nécessite un système externe.
  • Coûts opérationnels. La mise à jour de Node, la rotation des instances et la conformité aux politiques des fournisseurs de cloud représentent un coût réel et récurrent.

Quand passer d'une solution auto-hébergée à une API de scraping gérée

Dès que l'un des éléments suivants se présente, le calcul penche en faveur d'une API de scraping gérée :

  • Les cibles sont protégées par Cloudflare, DataDome ou PerimeterX.
  • Vous avez besoin de véritables adresses IP résidentielles dans de nombreux pays, et non de trois instances de centre de données.
  • Votre scraper doit exécuter du JavaScript, faire défiler des pages, cliquer ou résoudre des CAPTCHA.
  • Le volume dépasse quelques milliers de requêtes par jour et les pages de garde commencent à s'afficher.

À ce stade, remplacer l'URL du proxy dans votre aide à la récupération par un point de terminaison de scraper géré permet de conserver le reste du code intact : même analyse côté Node, même pipeline en aval, une seule URL qui gère le déblocage, la rotation et le rendu à votre place.

Points clés

  • Node-unblocker est un middleware Express personnalisable, pas un proxy réseau.
  • Wire onUpgrade et un prefix, puis superposez des middlewares pour la logique partagée.
  • Faites tourner les instances pour diversifier les adresses IP ; utilisez Docker pour la portabilité, Heroku pour les prototypes.
  • Respecter robots.txt, les politiques d'utilisation acceptable (AUP) de l'hébergeur et un agent utilisateur unique.
  • Passez à une API gérée dès que des mesures anti-bot ou le rendu JS entrent en jeu.

FAQ

L'utilisation de Node-unblocker est-elle gratuite pour le web scraping commercial ?

Oui. Node-unblocker est open source et dispose d'une licence permissive, l'utilisation commerciale de la bibliothèque elle-même est donc autorisée. Les coûts se situent ailleurs : votre facture d'hébergement, la situation juridique des sites que vous scrapez et les politiques d'utilisation acceptable du fournisseur de cloud qui héberge vos instances. Lisez toujours le fichier de licence dans le dépôt GitHub et les conditions d'utilisation du site cible avant de déployer à grande échelle.

Node-unblocker effectue-t-il une rotation automatique des adresses IP ?

Non. Un processus Node-unblocker unique présente toujours l'adresse IP publique de l'hôte sur lequel il s'exécute. Si vous souhaitez une rotation, vous devez déployer plusieurs instances (idéalement dans différentes régions ou chez différents fournisseurs) et choisir entre elles côté client, comme le fait l'assistant de pool rotatif présenté plus haut dans ce guide. L'absence de rotation intégrée est l'une des raisons les plus évidentes pour lesquelles les utilisateurs passent à un service de proxy géré.

Node-unblocker peut-il contourner Cloudflare, les CAPTCHA ou d'autres systèmes anti-bot ?

Non. Node-unblocker est un proxy HTTP transparent avec réécriture d'en-têtes, et non une pile de contournement anti-bot. Il ne résout pas les CAPTCHA, ne génère pas d'empreintes TLS de navigateur et ne gère pas le défi JavaScript de Cloudflare. Si votre cible utilise l'une de ces défenses, vous avez besoin d'un navigateur sans interface graphique, d'un pool d'adresses IP résidentielles et d'une logique de résolution de défis, ce qui dépasse le champ d'application de la bibliothèque.

En quoi Node-unblocker diffère-t-il d'un proxy HTTP ou SOCKS5 traditionnel ?

Un proxy HTTP ou SOCKS5 traditionnel écoute sur un port et accepte les connexions qui suivent le protocole proxy. Node-unblocker, quant à lui, expose un point de terminaison HTTP où l'URL cible est encodée dans le chemin, comme /proxy/https://example.com/. Cela signifie que n’importe quel client HTTP peut l’utiliser sans configuration spécifique au proxy, et que vous pouvez associer un middleware JavaScript à chaque requête et réponse.

Pourquoi node-unblocker ne fonctionne-t-il pas sur les sites qui utilisent OAuth ou postMessage ?

Ces deux technologies s'appuient sur des fonctionnalités du navigateur que la couche de réécriture d'URL ne peut pas reproduire intégralement. Les fenêtres contextuelles OAuth échangent des jetons avec une fenêtre parente via window.postMessage(), et l'origine réécrite ne correspond plus à ce qu'attend le site cible, ce qui entraîne un échec silencieux de la négociation. Il en va de même pour tout widget intégré utilisant la messagerie inter-origines. Les connexions standard via des formulaires et la plupart des points de terminaison AJAX simples continuent de fonctionner normalement.

Conclusion

Un proxy de déblocage de nœuds de scraping web est l’un des outils les plus sous-estimés de la boîte à outils de scraping Node.js. Il vous permet de mettre en place un proxy HTTP programmable en une douzaine de lignes de code, d’y associer un middleware qui transforme une logique de scraping dispersée en une couche d’abstraction propre, et de déployer le tout sous forme d’image Docker sur n’importe quel hébergeur adapté à votre budget cette année. Pour les sites statiques, le contournement géographique simple et la mise en forme partagée des requêtes, c'est véritablement tout ce dont vous avez besoin.

Mais ses limites sont claires. Dès que vos cibles se trouvent derrière Cloudflare, exigent des adresses IP résidentielles ou acheminent leurs données importantes via postMessage() et des SPA rendues en JavaScript, vous sortez du champ d’application de node-unblocker. La bonne approche consiste non pas à empiler les hacks les uns sur les autres, mais à conserver votre code d’analyse et à changer la couche réseau sous-jacente.

Si vos scrapers commencent à se heurter à ces obstacles, notre équipe a développé WebScrapingAPI précisément pour cette transition : un point de terminaison unique qui gère la rotation des proxys, le rendu JavaScript, le contournement anti-bot et la résolution des CAPTCHA, tandis que vos outils de récupération existants continuent de fonctionner. Considérez Node-Unblocker comme la bonne solution pour la partie simple du problème, et optez pour une API gérée lorsque la partie difficile se présente. Dans tous les cas, vous disposez désormais d'un plan de travail, d'un chemin de déploiement et d'une liste de signaux d'alerte à surveiller, soit tout ce dont une stratégie de proxy auto-hébergée a besoin pour démarrer.

À propos de l'auteur
Sorin-Gabriel Marica, Développeur full-stack @ WebScrapingAPI
Sorin-Gabriel MaricaDéveloppeur full-stack

Sorin Marica est ingénieur Full Stack et DevOps chez WebScrapingAPI ; il développe des fonctionnalités pour les produits et assure la maintenance de l'infrastructure qui garantit le bon fonctionnement de la plateforme.

Commencez à créer

Prêt à faire évoluer votre système de collecte de données ?

Rejoignez plus de 2 000 entreprises qui utilisent WebScrapingAPI pour extraire des données Web à l'échelle de l'entreprise, sans aucun coût d'infrastructure.