Retour au blog
Les techniques de web scraping
Suciu Dan16 janvier 20238 min de lecture

Node Unblocker pour le web scraping

Node Unblocker pour le web scraping

Qu'est-ce que Node-Unblocker ?

Node-unblocker est une bibliothèque polyvalente 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 web scraping pour contourner les restrictions mises en place par le site, telles que le géoblocage, la dissimulation de l'adresse IP et la limitation de débit, ou pour envoyer des jetons d'authentification. 

En résumé, en utilisant cette bibliothèque, vous pouvez dire adieu aux contenus bloqués et censurés.

Dans cet article, nous allons créer une application Express avec un proxy personnalisé à l'aide de Node Unblocker, ajouter un middleware qui modifie l'agent utilisateur pour chaque requête, discuter des limites du proxy, le déployer sur Heroku et le comparer à un service géré tel que WebScrapingAPI.

Prérequis

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 distinct ; plutôt que d'entrer dans les détails, consultez le site officiel et suivez les instructions.

Configuration

Nous commençons par créer un répertoire pour notre projet nommé unblocked et nous y initialisons un projet Node.JS :

mkdir unblocked
cd unblocked
npm init

Installation des 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éation de l'application de base

Création de l'application Express

Comme node.unblocker s'exécute au sein d'une instance Express, nous devons configurer l'exemple Hello World dans notre application.

Créez un fichier index.js et collez-y 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(`Example app listening on port ${port}`) })

Nous pouvons exécuter l'application avec 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.

Ajouter Node Unblocker à Express

Il est temps d'importer la bibliothèque Node Unblocker dans notre application :

var Unblocker = require('unblocker')

Nous créons une instance de Node Unblocker et lui transmettons le paramètre proxy. Vous trouverez 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 que middleware afin que les requêtes soient interceptées :

app.use(unblocker)

Nous mettons à jour le listener de l'application Express pour ajouter la prise en charge des WebSockets :

app.listen(process.env.PORT || 8080, () => {     console.log(`Example app listening on 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 vérifier que le proxy fonctionne comme prévu, ouvrez les outils de développement dans le navigateur et consultez l'onglet Réseau. Toutes les requêtes devraient passer par le proxy.

Browser developer tools Network tab showing HTTP requests for a proxy/unblocker endpoint and page assets

En cas de problème avec le proxy, il est recommandé d'activer le mode 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

Il n'est jamais recommandé d'activer cette option en production ; réservons-la donc à l'environnement de développement.

Utilisation des middlewares

Nodeunblocker n'est pas seulement une solution de proxy personnalisée, mais permet également l'interception et la modification des requêtes entrantes et sortantes via des middlewares.

Nous pouvons utiliser cette fonctionnalité pour empêcher 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 middleware pour définir un agent utilisateur personnalisé. Créez un fichier nommé 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é via le paramètre userAgent et l'enregistre dans l'objet data à l'aide de la fonction setUserAgent. Node unblocked appellera la fonction setUserAgent à chaque requête.

const userAgent = require('./user-agent')

Nous définissons le paramètre requestMiddleware dans le constructeur Unblocker et tout devrait fonctionner.

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 middleware fonctionne.

What's my user agent page with a text box containing a user-agent string and a Go button

Déploiement sur Heroku

Notre proxy étant opérationnel, 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 cloud.

Gardez à l'esprit que tous les fournisseurs n'autorisent pas les proxys et les applications de web scraping sur leur infrastructure. Heroku accepte ce type d'applications tant que les règles du fichier robots.txt ne sont pas ignorées.

Maintenant que les aspects juridiques ont été abordés, 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 configuré et que notre application est prête à fonctionner.

Notre fichier 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 simplifié à l'extrême le déploiement d'une application Node.JS. Avant de passer à la section suivante, assurez-vous d'avoir installé la CLI Heroku et les outils Git.

Connexion et configuration

Utilisez cette commande pour vous authentifier auprès de Heroku depuis votre terminal local :

heroku login

Créez une nouvelle application Heroku en exécutant cette commande :

heroku apps:create

Cette commande renverra l'ID de l'application et un dépôt Git. Utilisons cet ID pour définir l'origine distante de notre dépôt :

git init
heroku git:remote -a [YOUR_APP_ID]

Comme il n'est jamais recommandé de versionner le dossier node_modules, créons un fichier .gitignore et ajoutons-y ce dossier.

Déploiement

La dernière étape avant que notre code ne passe en production consiste à le valider et à le déployer. Ajoutons tous les fichiers, créons une validation et fusionnons la branche master dans celle de 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'y accéder dans notre navigateur et de vérifier qu'elle fonctionne.

Utilisez la structure d'URL suivante pour créer l'URL Heroku :

[HEROKU_DYNO_URL]/proxy/https://webscrapingapi.com

Si vous avez oublié ou perdu l'URL Dyno, vous pouvez utiliser cette commande pour obtenir les informations disponibles sur l'application actuelle :

heroku info

Limites

La facilité de configuration 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écessiteront l'utilisation d'une bibliothèque différente ou de services tiers.

Un service géré comme WebScrapingAPI corrige toutes ces limitations et ajoute quelques fonctionnalités supplémentaires telles que la résolution automatique des captchas, des proxys résidentiels et des techniques de contournement avancées pour empêcher des services comme Akamai, Cloudflare et Datadome de détecter votre requête. 

Voici une liste des limitations dont vous devez tenir compte avant d'envisager d'utiliser Node Unblocker dans votre projet de production.

Problèmes liés à OAuth

OAuth est la norme d'authentification privilégiée par les sites modernes tels que Facebook, Google, YouTube, Instagram et Twitter. Toute bibliothèque utilisant postMessage ne fonctionnera pas avec Node Unblocker et, comme vous l'avez peut-être déjà deviné, OAuth nécessite postMessage pour fonctionner correctement.

Si vous êtes prêt à renoncer à 57 % du trafic Internet juste pour utiliser cette bibliothèque, n'hésitez pas à l'ajouter à votre projet.

Sites complexes

Les sites comme YouTube, HBO Max, Roblox, Discord et Instagram ne fonctionnent pas, et il n'y a pas de calendrier prévu pour la sortie d'une version qui permettrait de les faire fonctionner. 

La communauté est invitée à contribuer en proposant des correctifs pour résoudre ces problèmes, mais tant que personne n'aura créé de pull request, vous ne pourrez extraire aucune donnée de ces sites.

Cloudflare

Cloudflare propose un service de détection gratuit activé par défaut sur tous les comptes. Notre serveur proxy personnalisé sera détecté en quelques secondes et une invite de captcha s'affichera à l'écran.

Environ 80 % des sites utilisent le CDN Cloudflare. Le blocage de vos requêtes par un captcha peut signifier la fin de votre scraper.

Maintenance

Même si la configuration d'un proxy personnalisé est facile, le travail de maintenance entraînera une charge de travail extrêmement importante et vous détournera de vos objectifs commerciaux.

Vous devrez gérer l'exécution des instances de proxy, mettre en place une infrastructure à mise à l'échelle automatique, gérer la concurrence et administrer les clusters. La liste est sans fin.

Conclusion

Vous disposez désormais d'un proxy web fonctionnant sur Heroku et d'une bonne compréhension de sa configuration, de son déploiement 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 manque de 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 vaste pool 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 à l'aide d'un seul paramètre, ne présente aucune de ces limitations.

À propos de l'auteur
Suciu Dan, cofondateur @ WebScrapingAPI
Suciu Dancofondateur

Suciu Dan est le cofondateur de WebScrapingAPI et rédige des guides pratiques destinés aux développeurs sur le web scraping avec Python et Ruby, ainsi que sur les infrastructures de proxy.

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.