Node Unblocker pour le Web Scraping
Suciu Dan le 16 janvier 2023

Nous détestons tous les moments où nous essayons d'accéder à une page et où le site bloque notre demande sans raison valable. Le géoblocage, par exemple, ne peut être contourné qu'en utilisant un proxy.
Node-unblocker nous aide à créer un proxy personnalisé et à le rendre opérationnel en quelques minutes.
Qu'est-ce que Node-Unblocker ?
Node unblocker est une bibliothèque générale permettant de créer un proxy web, d'intercepter et de modifier les requêtes et les réponses.
Cette bibliothèque est également utilisée dans le cadre du web scraping pour contourner les restrictions mises en place par le site, comme le géoblocage, le masquage de l'adresse IP et la limitation de débit, ou pour envoyer des jetons d'authentification.
Pour faire court, en utilisant cette bibliothèque, vous pouvez dire adieu aux contenus bloqués et censurés.
Dans cet article, nous créons une application Express avec un proxy personnalisé en utilisant Node Unblocker, nous ajoutons un middleware qui change l'agent utilisateur pour chaque requête, nous discutons des limitations du proxy, nous la déployons sur Heroku et nous la comparons à un service géré comme WebScrapingAPI.
Conditions préalables
Avant de commencer, assurez-vous d'avoir installé la dernière version de Node.JS. L'installation de Node.JS pour chaque plateforme (Windows, Linux, Mac) ferait l'objet d'un article séparé. Plutôt que d'entrer dans les détails, consultez le site officiel et suivez les instructions.
Mise en place
Nous commençons par créer un répertoire pour notre projet nommé unblocked et nous initialisons un projet Node.JS à l'intérieur de celui-ci :
mkdir unblocked
cd unblocked
npm init
Installer les dépendances
Pour cette application, nous installons deux bibliothèques : Express, un framework minimaliste pour Node.JS, et Node Unblocker.
npm install express unblocker
Créer l'application de base
Création de l'application Express
Comme node.unblocker fonctionne dans une instance Express, nous devons mettre en place l'exemple Hello World dans notre application.
Créez un fichier index.js et collez le code suivant :
const express = require('express') const app = express() const port = 8080 app.get('/', (req, res) => { res.send('Hello World!') }) app.listen(process.env.PORT || 8080, () => { console.log(`Exemple d'application écoutant sur le port ${port}`) })
Nous pouvons exécuter l'application à l'aide de cette commande :
node index.js
Si nous accédons à http://localhost:8080, nous voyons un message "Hello World". Cela signifie que notre application est opérationnelle.
Ajout de Node Unblocker à Express
Il est temps d'importer la bibliothèque Node Unblock dans notre application :
var Unblocker = require('unblocker')
Nous créons une instance de nœud unbloker et lui passons le paramètre proxy. Vous pouvez trouver la liste complète des paramètres disponibles ici.
var unblocker = new Unblocker({prefix: '/proxy/'})
Nous enregistrons la bibliothèque node unblocker dans Express en tant qu'intergiciel afin que les requêtes soient interceptées :
app.use(unblocker)
Nous mettons à jour l'app listener Express pour ajouter la prise en charge des websockets :
app.listen(process.env.PORT || 8080, () => { console.log(`Exemple d'application écoutant sur le port ${port}`) }).on('upgrade', unblocker.onUpgrade)
Après avoir suivi toutes ces étapes, notre application devrait ressembler à ceci :
const express = require('express') const Unblocker = require('unblocker') const app = express() const port = 8080 const unblocker = new Unblocker({prefix: '/proxy/'}) app.use(unblocker) app.get('/', (req, res) => { res.send('Hello World!') }) app.listen(process.env.PORT || 8080, () => { console.log(`Example app listening on port ${port}`) }).on('upgrade', unblocker.onUpgrade)
Test du proxy
Redémarrez l'application et accédez à l'URL suivante dans votre navigateur :
http://localhost:8080/proxy/https://webscrapingapi.com
Pour s'assurer que le proxy fonctionne comme prévu, nous ouvrons les outils de développement dans le navigateur et vérifions l'onglet Réseau. Toutes les requêtes doivent passer par le proxy.

Pour tout problème que le proxy pourrait rencontrer, il est recommandé d'activer le mode de débogage en définissant la variable d'environnement DEBUG. Utilisez cette commande pour démarrer le proxy en mode débogage :
DEBUG=unblocker:* node index.js
Ce n'est jamais une bonne idée d'activer cette fonction en production, c'est pourquoi nous la réservons à l'environnement de développement.
Utilisation de logiciels intermédiaires
Nodeunblocker n'est pas seulement une solution proxy personnalisée, mais permet l'interception et la modification des requêtes sortantes et entrantes par le biais d'un logiciel intermédiaire.
Nous pouvons utiliser cette fonctionnalité pour bloquer le chargement de ressources spécifiques en fonction du type de ressource ou du domaine, mettre à jour l'agent utilisateur, remplacer le contenu renvoyé ou injecter des jetons d'authentification dans les en-têtes de requête.
Vous trouverez une liste complète d'exemples ici.
Commençons par créer un intergiciel pour définir un agent utilisateur personnalisé. Créez un fichier appelé user-agent.js et ajoutez-y ce code :
module.exports = function(userAgent) {
function setUserAgent(data) {
data["headers"]["user-agent"] = userAgent
}
return setUserAgent
}
Cette fonction accepte l'agent utilisateur personnalisé avec le paramètre userAgent et l'enregistre dans l'objet de données à l'aide de la fonction setUserAgent. Le nœud débloqué appellera la fonction setUserAgent à chaque demande.
const userAgent = require('./user-agent')
Nous définissons l'élément requestMiddleware dans le constructeur de l'Unblocker et nous devrions être prêts à partir.
const unblocker = new Unblocker({
prefix: '/proxy/',
requestMiddleware: [userAgent("nodeunblocker/1.5")]
})
Notre fichier index.js devrait ressembler à ceci :
const express = require('express')
const Unblocker = require('unblocker')
const userAgent = require('./user-agent')
const app = express()
const port = 8080
const unblocker = new Unblocker({
prefix: '/proxy/',
requestMiddleware: [userAgent("nodeunblocker/1.5")]
})
app.use(unblocker)
app.get('/', (req, res) => {
res.send('Hello World!')
})
app.listen(process.env.PORT || 8080, () => {
console.log(`Example app listening on port ${port}`)
}).on('upgrade', unblocker.onUpgrade)
Il est temps de vérifier si notre code fonctionne. Nous devons modifier l'URL de node-unblocker pour nous assurer que les en-têtes sont correctement mis à jour.
Redémarrez l'application et ouvrez cette URL dans votre navigateur :
http://localhost:8080/proxy/https://www.whatsmyua.info/
Si le site affiche nodeunblocker/1.5, notre logiciel intermédiaire fonctionne.

Déployer sur Heroku
Une fois notre proxy lancé, il est temps de le déployer sur Heroku, une plateforme en tant que service (PaaS) qui nous permet de créer, de lancer et de gérer des applications entièrement dans le nuage.
Gardez à l'esprit que tous les fournisseurs n'autorisent pas les proxys et les applications de web scraping sur leur infrastructure. Heroku accepte ces types d'applications tant que les règles de robots.txt ne sont pas ignorées.
La partie juridique ayant été abordée, préparons notre projet pour le déploiement.
Script et moteur
Nous devons définir le script de démarrage et les moteurs dans le fichier package.json.
La propriété `engines` indique à Heroku que nous avons besoin de la dernière version de Node.JS 16 installée dans notre environnement. Le script de démarrage est exécuté lorsque l'environnement est défini et que notre application est prête à fonctionner.
Notre package.json devrait ressembler à ceci :
{
"name": "unblocked",
"version": "1.0.0",
"main": "index.js",
"engines": {
"node": "16.x"
},
"scripts": {
"start": "node index.js"
},
"dependencies": {
"express": "^4.18.1",
"unblocker": "^2.3.0"
}
}
Heroku a fait du déploiement d'une application Node.JS un jeu d'enfant. Avant de passer à la section suivante, assurez-vous d'avoir installé le CLI Heroku et les outils git.
Connexion et configuration
Utilisez cette commande pour vous authentifier auprès d'Heroku depuis votre terminal local :
heroku login
Créez une nouvelle application Heroku en exécutant cette commande :
heroku apps:create
Cette commande retournera l'ID de l'application et un dépôt git. Utilisons l'ID pour définir l'origine distante de notre dépôt :
git init
heroku git:remote -a [YOUR_APP_ID]
Parce que versionner le dossier node_modules n'est jamais une bonne idée, créons un fichier .gitignore et ajoutons-y le dossier.
Déployer
La dernière étape avant que notre code n'atteigne la production est de le livrer et de le déployer. Ajoutons tous les fichiers, créons un commit et fusionnons la branche master dans la branche heroku.
git add .
git commit -am "Initial commit"
git push heroku master
Après quelques secondes, l'application sera déployée sur Heroku. Félicitations ! Il est temps d'accéder à l'application dans notre navigateur et de vérifier qu'elle fonctionne.
Utilisez la structure URL suivante pour construire l'URL Heroku :
[HEROKU_DYNO_URL]/proxy/https://webscrapingapi.com
Si vous avez oublié ou perdu l'URL de Dyno, vous pouvez utiliser cette commande pour obtenir les informations disponibles sur l'application en cours :
heroku info
Limites
La facilité d'installation de ce proxy personnalisé s'accompagne d'une mise en garde : il ne fonctionne bien que pour les sites simples et échoue pour les tâches avancées. Certaines de ces limitations sont impossibles à surmonter et nécessitent l'utilisation d'une autre bibliothèque ou de services tiers.
Un service géré comme WebScrapingAPI met en œuvre des correctifs pour toutes ces limitations et ajoute quelques fonctionnalités supplémentaires comme la résolution automatique des captchas, les proxys résidentiels et les évasions avancées pour empêcher des services comme Akamai, Cloudflare et Datadome de détecter votre demande.
Voici une liste des limitations que vous devez connaître avant d'envisager d'utiliser Node Unblocker dans votre projet de production.
Questions relatives à OAuth
OAuth est la norme d'authentification préférée par les sites modernes comme Facebook, Google, Youtube, Instagram, Twitter. Toute bibliothèque qui utilise postMessage ne fonctionnera pas avec Node Unblocker et, peut-être l'avez-vous déjà deviné, OAuth nécessite postMessage pour fonctionner correctement.
Si vous voulez renoncer à 57 % du trafic Internet juste pour utiliser cette bibliothèque, vous pouvez aller de l'avant et l'ajouter à votre projet.
Sites complexes
Des sites comme YouTube, HBO Max, Roblox, Discord, Instagram ne fonctionnent pas et il n'y a pas de calendrier pour la sortie d'une version qui fera fonctionner ces sites.
La communauté est invitée à contribuer par des correctifs à ces problèmes, mais jusqu'à ce que quelqu'un crée une demande d'extraction, vous ne serez pas en mesure de récupérer des données auprès d'eux.
Cloudflare
Cloudflare offre un service de détection gratuit qui est activé par défaut sur tous les comptes. Notre serveur proxy personnalisé sera détecté en quelques secondes et une invite captcha s'affichera à l'écran.
Environ 80 % des sites utilisent le CDN de Cloudflare. Le blocage de vos requêtes par un captcha peut sonner le glas de votre scraper.
Maintenance
Même si la mise en place d'un proxy personnalisé est facile, le travail de maintenance entraînera des frais généraux extrêmement importants et vous détournera de vos objectifs commerciaux.
Vous devrez gérer les instances proxy, mettre en place une infrastructure de mise à l'échelle automatique, gérer la concurrence et gérer les grappes. La liste est interminable.
Conclusion
Vous avez maintenant un proxy web fonctionnant sur Heroku et une bonne compréhension de la façon de le configurer, de le déployer et de ses limites. Si vous prévoyez de l'utiliser pour un projet amateur, Node Unblocker est un bon choix.
Mais ces inconvénients et le faible soutien de la communauté vous empêchent de l'utiliser dans une application prête pour la production.
Un service géré comme WebScrapingAPI, qui offre l'accès à un grand nombre de proxys de centres de données, mobiles et résidentiels, ainsi que la possibilité de jouer avec la géolocalisation, de modifier les en-têtes et de créer des cookies avec un seul paramètre, n'a aucune de ces limitations.
Nouvelles et mises à jour
Restez au courant des derniers guides et nouvelles sur le web scraping en vous inscrivant à notre lettre d'information.
We care about the protection of your data. Read our <l>Privacy Policy</l>.Privacy Policy.

Articles connexes

Apprenez à récupérer des sites web dynamiques en JavaScript à l'aide de Scrapy et de Splash. De l'installation à l'écriture d'un spider, en passant par la gestion de la pagination et des réponses Splash, ce guide complet propose des instructions pas à pas pour les débutants comme pour les experts.


Apprenez quel est le meilleur navigateur pour contourner les systèmes de détection de Cloudflare lorsque vous faites du web scraping avec Selenium.


Apprenez à utiliser les proxys avec Axios et Node.js pour un web scraping efficace. Conseils, exemples de code et avantages de l'utilisation de WebScrapingAPI inclus.
