Zurück zum Blog
Die Wissenschaft des Web-Scrapings
Sorin-Gabriel MaricaLast updated on Mar 31, 20267 min read

Node Unblocker für Web-Scraping

Node Unblocker für Web-Scraping

Wir alle hassen es, wenn wir versuchen, eine Seite aufzurufen, und die Website unsere Anfrage ohne triftigen Grund blockiert. Geoblocking lässt sich beispielsweise nur mithilfe eines Proxys umgehen. 

Node-Unblocker hilft uns dabei, einen benutzerdefinierten Proxy zu erstellen und ihn in wenigen Minuten zum Laufen zu bringen.

Was ist Node-Unblocker?

Node-Unblocker ist eine universell einsetzbare Bibliothek zum Erstellen eines Web-Proxys sowie zum Abfangen und Ändern von Anfragen und Antworten. 

Diese Bibliothek wird auch beim Web-Scraping verwendet, um von der Website implementierte Einschränkungen wie Geoblocking zu umgehen, die IP-Adresse zu verbergen, Ratenbegrenzungen zu umgehen oder Authentifizierungstoken zu senden. 

Kurz gesagt: Mit dieser Bibliothek können Sie sich von gesperrten und zensierten Inhalten verabschieden.

In diesem Artikel erstellen wir eine Express-Anwendung mit einem benutzerdefinierten Proxy unter Verwendung von Node-Unblocker, fügen eine Middleware hinzu, die den User-Agent für jede Anfrage ändert, besprechen die Einschränkungen des Proxys, stellen ihn auf Heroku bereit und vergleichen ihn mit einem Managed Service wie WebScrapingAPI.

Voraussetzungen

Bevor wir beginnen, stellen Sie sicher, dass Sie die neueste Version von Node.JS installiert haben. Die Installation von Node.JS für die einzelnen Plattformen (Windows, Linux, Mac) wäre Thema eines separaten Artikels; anstatt hier ins Detail zu gehen, besuchen Sie bitte die offizielle Website und befolgen Sie die Anweisungen.

Einrichtung

Wir beginnen damit, ein Verzeichnis für unser Projekt mit dem Namen „unblocked“ anzulegen und darin ein Node.JS-Projekt zu initialisieren:

mkdir unblocked
cd unblocked
npm init

Installieren der Abhängigkeiten

Für diese Anwendung installieren wir zwei Bibliotheken: Express, ein minimalistisches Framework für Node.JS, und Node Unblocker.

npm install express unblocker

Erstellen der Basis-Anwendung

Erstellen der Express-App

Da Node.Unblocker innerhalb einer Express-Instanz läuft, müssen wir das „Hello World“-Beispiel in unserer Anwendung einrichten.

Erstellen Sie eine Datei index.js und fügen Sie den folgenden Code ein:

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}`) })

Wir können die Anwendung mit diesem Befehl ausführen:

node index.js

Wenn wir http://localhost:8080 aufrufen, sehen wir eine „Hello World“-Meldung. Das bedeutet, dass unsere Anwendung läuft.

Hinzufügen von Node Unblocker zu Express

Es ist an der Zeit, die Node-Unblock-Bibliothek in unsere Anwendung zu importieren:

var Unblocker = require('unblocker')

Wir erstellen eine Node-Unblocker-Instanz und übergeben den Parameter „proxy“. Die vollständige Liste der verfügbaren Parameter finden Sie hier.

var unblocker = new Unblocker({prefix: '/proxy/'})

Wir registrieren die Node-Unblocker-Bibliothek in Express als Middleware, damit Anfragen abgefangen werden:

app.use(unblocker)

Wir aktualisieren den Express-App-Listener, um Unterstützung für WebSockets hinzuzufügen:

app.listen(process.env.PORT || 8080, () => { console.log(`Example app listening on port ${port}`) }).on('upgrade', unblocker.onUpgrade)

Nachdem wir alle diese Schritte durchgeführt haben, sollte unsere Anwendung wie folgt aussehen:

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)

Testen des Proxys

Starten Sie die Anwendung neu und rufen Sie die folgende URL in Ihrem Browser auf:

http://localhost:8080/proxy/https://webscrapingapi.com

Um sicherzustellen, dass der Proxy wie erwartet funktioniert, öffnen wir die Entwicklertools im Browser und überprüfen die Registerkarte „Netzwerk“. Alle Anfragen sollten über den Proxy laufen.

Bei etwaigen Problemen, die der Proxy verursachen könnte, empfiehlt es sich, den Debug-Modus durch Setzen der Umgebungsvariable DEBUG zu aktivieren. Verwenden Sie diesen Befehl, um den Proxy im Debug-Modus zu starten:

DEBUG=unblocker:* node index.js

Es ist niemals eine gute Idee, dies in der Produktionsumgebung zu aktivieren, daher sollten wir es nur für die Entwicklungsumgebung beibehalten.

Verwendung von Middlewares

Nodeunblocker ist nicht nur eine benutzerdefinierte Proxy-Lösung, sondern ermöglicht auch das Abfangen und Ändern von ausgehenden und eingehenden Anfragen über Middleware.

Wir können diese Funktion nutzen, um das Laden bestimmter Ressourcen basierend auf dem Ressourcentyp oder der Domain zu blockieren, den User-Agent zu aktualisieren, zurückgegebene Inhalte zu ersetzen oder Authentifizierungstoken in Request-Header einzufügen.

Eine vollständige Liste mit Beispielen findest du hier.

Beginnen wir damit, eine Middleware zum Festlegen eines benutzerdefinierten User-Agents zu erstellen. Erstellen Sie eine Datei namens user-agent.js und fügen Sie diesen Code hinzu:

module.exports = function(userAgent) {
    function setUserAgent(data) {
        data["headers"]["user-agent"] = userAgent
    }
    return setUserAgent
}

Diese Funktion akzeptiert den benutzerdefinierten User-Agent über den Parameter userAgent und registriert ihn mithilfe der Funktion setUserAgent im Datenobjekt. Node Unblocked ruft die Funktion setUserAgent bei jeder Anfrage auf.

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

Wir setzen den Parameter requestMiddleware im Unblocker-Konstruktor und sollten nun startklar sein.

const unblocker = new Unblocker({
    prefix: '/proxy/',
    requestMiddleware: [userAgent("nodeunblocker/1.5")]
})

Unsere Datei „index.js“ sollte nun wie folgt aussehen:

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)

Es ist an der Zeit zu prüfen, ob unser Code funktioniert. Wir müssen die URL von Node-Unblocker ändern, um sicherzustellen, dass die Header ordnungsgemäß aktualisiert werden. 

Starten Sie die Anwendung neu und öffnen Sie diese URL in Ihrem Browser:

http://localhost:8080/proxy/https://www.whatsmyua.info/

Wenn die Seite „nodeunblocker/1.5“ anzeigt, funktioniert unsere Middleware.

Bereitstellung auf Heroku

Nachdem unser Proxy läuft, ist es an der Zeit, ihn auf Heroku bereitzustellen, einer Platform-as-a-Service (PaaS), die es uns ermöglicht, Apps vollständig in der Cloud zu erstellen, zu starten und zu verwalten.

Beachten Sie, dass nicht alle Anbieter Proxys und Web-Scraping-Apps auf ihrer Infrastruktur zulassen. Heroku akzeptiert diese Art von Apps, solange die Regeln aus der robots.txt nicht ignoriert werden.

Nachdem wir den rechtlichen Aspekt geklärt haben, bereiten wir unser Projekt für die Bereitstellung vor.

Skript und Engine

Wir müssen das Startskript und die Engines in der Datei package.json festlegen.

Die Eigenschaft `engines` teilt Heroku mit, dass wir die neueste Version von Node.JS 16 in unserer Umgebung installiert benötigen. Das Startskript wird ausgeführt, sobald die Umgebung eingerichtet ist und unsere Anwendung lauffertig ist.

Unsere package.json sollte wie folgt aussehen:

{
  "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 hat die Bereitstellung einer Node.JS-Anwendung zu einem Kinderspiel gemacht. Bevor Sie zum nächsten Abschnitt übergehen, stellen Sie sicher, dass Sie die Heroku-CLI und die Git-Tools installiert haben.

Anmeldung und Einrichtung

Verwenden Sie diesen Befehl, um sich von Ihrem lokalen Terminal aus bei Heroku zu authentifizieren:

heroku login

Erstellen Sie eine neue Heroku-Anwendung, indem Sie diesen Befehl ausführen:

heroku apps:create

Dieser Befehl gibt die ID der App und ein Git-Repository zurück. Verwenden wir die ID, um den Remote-Origin für unser Repository festzulegen:

git init
heroku git:remote -a [YOUR_APP_ID]

Da es nie eine gute Idee ist, den Ordner „node_modules“ zu versionieren, erstellen wir eine .gitignore-Datei und fügen den Ordner dort hinzu.

Bereitstellung

Der letzte Schritt, bevor unser Code in die Produktion geht, besteht darin, ihn zu committen und bereitzustellen. Fügen wir alle Dateien hinzu, erstellen wir einen Commit und führen wir den Master-Zweig in den Heroku-Zweig zusammen.

git add .
git commit -am "Initial commit"
git push heroku master

Nach wenigen Sekunden wird die Anwendung auf Heroku bereitgestellt. Herzlichen Glückwunsch! Es ist an der Zeit, sie in unserem Browser aufzurufen und sicherzustellen, dass sie funktioniert.

Verwende die folgende URL-Struktur, um die Heroku-URL zu erstellen:

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

Falls du die Dyno-URL vergessen oder verloren hast, kannst du diesen Befehl verwenden, um die verfügbaren Informationen zur aktuellen App abzurufen:

heroku info

Einschränkungen

Die einfache Einrichtung dieses benutzerdefinierten Proxys hat einen Haken: Er funktioniert nur bei einfachen Websites gut und versagt bei komplexen Aufgaben. Einige dieser Einschränkungen lassen sich nicht überwinden und erfordern die Verwendung einer anderen Bibliothek oder von Drittanbieterdiensten.

Ein Managed Service wie WebScrapingAPI behebt all diese Einschränkungen und bietet einige zusätzliche Funktionen wie automatische Captcha-Lösung, Residential-Proxys und erweiterte Umgehungsmechanismen, um zu verhindern, dass Dienste wie Akamai, Cloudflare und Datadome Ihre Anfrage erkennen. 

Hier ist eine Liste der Einschränkungen, die Sie beachten sollten, bevor Sie darüber nachdenken, Node Unblocker in Ihrem Produktionsprojekt einzusetzen.

OAuth-Probleme

OAuth ist der von modernen Websites wie Facebook, Google, YouTube, Instagram und Twitter bevorzugte Authentifizierungsstandard. Jede Bibliothek, die postMessage verwendet, funktioniert nicht mit Node Unblocker, und wie Sie vielleicht bereits erraten haben, benötigt OAuth postMessage, um ordnungsgemäß zu funktionieren.

Wenn Sie bereit sind, 57 % des Internetverkehrs aufzugeben, nur um diese Bibliothek zu nutzen, können Sie sie gerne zu Ihrem Projekt hinzufügen.

Komplexe Websites

Websites wie YouTube, HBO Max, Roblox, Discord und Instagram funktionieren nicht, und es gibt keinen Zeitplan für die Veröffentlichung einer Version, die diese Websites funktionsfähig macht. 

Die Community ist eingeladen, mit Patches zur Behebung dieser Probleme beizutragen, aber solange niemand einen Pull-Request erstellt, können Sie keine Daten von diesen Websites scrapen.

Cloudflare

Cloudflare bietet einen kostenlosen Erkennungsdienst an, der standardmäßig für alle Konten aktiviert ist. Unser benutzerdefinierter Proxy-Server wird innerhalb von Sekunden erkannt, und auf dem Bildschirm wird eine Captcha-Aufforderung angezeigt.

Rund 80 % der Websites nutzen das Cloudflare-CDN. Wenn Ihre Anfragen durch ein Captcha blockiert werden, kann dies das Aus für Ihren Scraper bedeuten.

Wartung

Auch wenn die Einrichtung eines benutzerdefinierten Proxys einfach ist, verursacht die Wartungsarbeit einen extrem hohen Aufwand und lenkt Sie von Ihren Geschäftszielen ab.

Sie müssen sich um den Betrieb der Proxy-Instanzen, die Einrichtung einer Auto-Scaling-Infrastruktur, die Bewältigung von Parallelität und die Verwaltung der Cluster kümmern. Die Liste ist endlos.

Fazit

Sie haben nun einen Web-Proxy auf Heroku laufen und ein gutes Verständnis dafür, wie man ihn einrichtet, bereitstellt und welche Einschränkungen er hat. Wenn Sie ihn für ein Hobbyprojekt nutzen möchten, ist Node Unblocker eine gute Wahl.

Doch diese Nachteile und die mangelhafte Community-Unterstützung verhindern, dass Sie ihn in einer produktionsreifen Anwendung einsetzen können.

Ein Managed Service wie WebScrapingAPI, der Zugriff auf einen großen Pool an Rechenzentrums-, Mobil- und Residential-Proxys bietet sowie die Möglichkeit, mit Geolokalisierung zu experimentieren, Header zu ändern und Cookies mit einem einzigen Parameter zu erstellen, weist keine dieser Einschränkungen auf.

Über den Autor
Sorin-Gabriel Marica, Full-Stack-Entwickler @ WebScrapingAPI
Sorin-Gabriel MaricaFull-Stack-Entwickler

Sorin Marica ist Full-Stack- und DevOps-Entwickler bei WebScrapingAPI, wo er Produktfunktionen entwickelt und die Infrastruktur wartet, die für einen reibungslosen Betrieb der Plattform sorgt.

Los geht’s

Sind Sie bereit, Ihre Datenerfassung zu erweitern?

Schließen Sie sich den über 2.000 Unternehmen an, die WebScrapingAPI nutzen, um Webdaten im Unternehmensmaßstab ohne zusätzlichen Infrastrukturaufwand zu extrahieren.