Node Unblocker für Web Scraping

Suciu Dan am 16. Januar 2023

blog-image

Wir alle hassen die Momente, in denen wir versuchen, auf eine Seite zuzugreifen und die Website unsere Anfrage ohne guten Grund blockiert. Geoblocking kann zum Beispiel nur durch die Verwendung eines Proxys umgangen werden. 

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

Was ist Node-Unblocker?

Node unblocker ist eine universelle Bibliothek, um einen Web-Proxy zu erstellen, Anfragen und Antworten abzufangen und zu verändern. 

Diese Bibliothek wird auch beim Web-Scraping verwendet, um von der Website implementierte Beschränkungen wie Geoblocking, Verbergen der IP-Adresse und Ratenbegrenzung zu umgehen oder um Authentifizierungstoken zu senden. 

Um es kurz zu machen: Wenn Sie diese Bibliothek verwenden, können Sie sich von blockierten und zensierten Inhalten verabschieden.

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

Voraussetzungen

Bevor wir beginnen, sollten Sie sicherstellen, dass Sie die neueste Version von Node.JS installiert haben. Die Installation von Node.JS für jede Plattform (Windows, Linux, Mac) wäre Thema eines eigenen Artikels. Anstatt ins Detail zu gehen, sollten Sie die offizielle Website besuchen und den Anweisungen folgen.

Vorbereitung der Dinge

Wir beginnen mit der Erstellung eines Verzeichnisses für unser Projekt namens unblocked und initialisieren darin ein Node.JS-Projekt:

mkdir unblocked
cd unblocked
npm init

Abhängigkeiten installieren

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

npm install express unblocker

Erstellen Sie die Basisanwendung

Erstellen der Express-Anwendung

Da node.unblocker innerhalb einer Express-Instanz läuft, müssen wir das Hello World-Beispiel in unserer Anwendung einrichten.

Erstellen Sie eine index.js-Datei 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(`Beispiel-App hört auf Port ${port}`) })

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

node index.js

Wenn wir auf http://localhost:8080 zugreifen, 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 unbloker-Instanz und übergeben den Proxy-Parameter. Die vollständige Liste der verfügbaren Parameter finden Sie hier.

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

Wir registrieren die Node-Unblocker-Bibliothek bei Express als Middleware, so dass die 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(`Beispiel-App hört auf Port ${port}`) }).on('upgrade', unblocker.onUpgrade)

Nach der Durchführung all dieser Schritte 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 prüfen die Registerkarte Netzwerk. Alle Anfragen sollten über den Proxy laufen.

blog-image

Bei Problemen, die der Proxy auslösen könnte, empfiehlt es sich, den Debug-Modus zu aktivieren, indem Sie die Umgebungsvariable DEBUG setzen. Verwenden Sie diesen Befehl, um den Proxy im Debug-Modus zu starten:

DEBUG=unblocker:* node index.js

Es ist nie eine gute Idee, diese Funktion in der Produktion zu aktivieren, also sollten wir sie nur für die Entwicklungsumgebung verwenden.

Verwendung von Middlewares

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

Wir können diese Funktion nutzen, um das Laden bestimmter Ressourcen auf der Grundlage des Ressourcentyps oder der Domäne zu blockieren, den User Agent zu aktualisieren, zurückgegebene Inhalte zu ersetzen oder Authentifizierungstoken in die Header von Anfragen einzubauen.

Eine vollständige Liste von Beispielen finden Sie hier.

Beginnen wir mit der Erstellung einer Middleware für die Einstellung eines benutzerdefinierten Benutzeragenten. 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 nimmt den benutzerdefinierten Benutzeragenten mit dem Parameter userAgent entgegen und registriert ihn im Datenobjekt mit der Funktion setUserAgent. Node unblocked ruft die Funktion setUserAgent bei jeder Anfrage auf.

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

Wir setzen die requestMiddleware Parameter im Unblocker-Konstruktor, und wir sollten startklar sein.

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

Unsere index.js-Datei sollte 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 überprüfen, ob unser Code funktioniert. Wir müssen die Node-Unblocker-URL ändern, um sicherzustellen, dass die Header richtig 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 Website nodeunblocker/1.5 anzeigt, funktioniert unsere Middleware.

blog-image

Bereitstellung auf Heroku

Jetzt, wo unser Proxy läuft, ist es an der Zeit, ihn bei Heroku einzusetzen, einer Platform as a Service (PaaS), mit der wir Anwendungen vollständig in der Cloud erstellen, starten und verwalten können.

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

Nachdem wir den rechtlichen Teil besprochen haben, wollen wir unser Projekt für die Bereitstellung vorbereiten.

Skript und Motor

Wir müssen das Startskript und die Motoren 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 haben müssen. Das Startskript wird ausgeführt, wenn die Umgebung festgelegt ist und unsere Anwendung bereit ist, ausgeführt zu werden.

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"
}
}

Mit Heroku ist die Bereitstellung einer Node.JS-Anwendung ein Kinderspiel. Bevor Sie zum nächsten Abschnitt übergehen, stellen Sie sicher, dass Sie das 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-anmeldung

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

heroku apps:create

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

git init
heroku git:remote -a [YOUR_APP_ID]

Da die Versionierung des Ordners node_modules nie eine gute Idee ist, erstellen wir eine .gitignore-Datei und fügen den Ordner hinzu.

Bereitstellung von

Der letzte Schritt, bevor unser Code in die Produktion geht, ist das Commit und die Bereitstellung. Wir fügen alle Dateien hinzu, erstellen einen Commit und führen den Master-Zweig mit dem Heroku-Zweig zusammen.

git add .
git commit -am "Erste Übergabe"
git push heroku master

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

Verwenden Sie die folgende URL-Struktur, um die Heroku-URL zu erstellen:

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

Wenn Sie die Dyno URL vergessen oder verloren haben, können Sie diesen Befehl verwenden, um die verfügbaren Informationen über die aktuelle App zu erhalten:

heroku-info

Beschränkungen

Die einfache Einrichtung dieses benutzerdefinierten Proxys hat einen Nachteil: Er funktioniert nur bei einfachen Websites gut und versagt bei fortgeschrittenen Aufgaben. Einige dieser Einschränkungen sind nicht zu überwinden und erfordern die Verwendung einer anderen Bibliothek oder von Diensten Dritter.

Ein verwalteter Dienst wie WebScrapingAPI behebt all diese Einschränkungen und fügt einige zusätzliche Funktionen hinzu, wie z. B. die automatische Captcha-Auflösung, Proxies für Privatanwender und fortgeschrittene Umgehungen, um zu verhindern, dass Dienste wie Akamai, Cloudflare und Datadome Ihre Anfrage erkennen. 

Hier ist eine Liste von Einschränkungen, die Sie kennen sollten, bevor Sie über den Einsatz von Node Unblocker in Ihrem Produktionsprojekt nachdenken.

OAuth-Probleme

OAuth ist der Authentifizierungsstandard, der von modernen Websites wie Facebook, Google, Youtube, Instagram und Twitter bevorzugt wird. Jede Bibliothek, die postMessage verwendet, wird mit Node Unblocker nicht funktionieren und, vielleicht haben Sie es schon erraten, OAuth erfordert postMessage, um richtig zu funktionieren.

Wenn Sie auf 57 % des Internetverkehrs verzichten wollen, nur um diese Bibliothek zu verwenden, können Sie sie in Ihr Projekt aufnehmen.

Komplexe Standorte

Websites wie YouTube, HBO Max, Roblox, Discord und Instagram funktionieren nicht, und es gibt keinen Zeitplan für die Veröffentlichung einer Version, mit der diese Websites funktionieren werden. 

Die Community ist eingeladen, mit Patches zur Behebung dieser Probleme beizutragen, aber bis jemand einen Pull-Request erstellt, werden Sie keine Daten von ihnen abrufen können.

Cloudflare

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

Etwa 80 % der Websites verwenden das Cloudflare CDN. Wenn Ihre Anfragen durch Captcha blockiert werden, kann das das Ende Ihres Scrapers bedeuten.

Wartung

Die Einrichtung eines benutzerdefinierten Proxys ist zwar einfach, aber die Wartungsarbeiten verursachen einen extrem hohen Aufwand und lenken Sie von Ihren Geschäftszielen ab.

Sie müssen sich mit dem Betrieb der Proxy-Instanzen, der Einrichtung einer automatisch skalierenden Infrastruktur, dem Umgang mit Gleichzeitigkeit und der Verwaltung der Cluster befassen. Die Liste ist endlos.

Schlussfolgerung

Sie haben jetzt einen Web-Proxy, der auf Heroku läuft, und wissen, wie man ihn einrichtet, wie man ihn einsetzt und wo seine Grenzen liegen. Wenn Sie planen, ihn für ein Hobbyprojekt zu verwenden, ist Node Unblocker eine gute Wahl.

Aber diese Nachteile und die schlechte Unterstützung durch die Community hindern Sie daran, es in einer produktionsreifen Anwendung einzusetzen.

Ein verwalteter Dienst wie WebScrapingAPI, der Zugang zu einem großen Pool von Proxys für Rechenzentren, Mobilgeräte und Privatanwender sowie die Möglichkeit bietet, mit Geolokalisierung zu spielen, Kopfzeilen zu ändern und Cookies mit einem einzigen Parameter zu erstellen, hat keine dieser Einschränkungen.

Nachrichten und Aktualisierungen

Bleiben Sie auf dem Laufenden mit den neuesten Web Scraping-Anleitungen und Nachrichten, indem Sie unseren Newsletter abonnieren.

We care about the protection of your data. Read our <l>Privacy Policy</l>.Privacy Policy.

Ähnliche Artikel

Vorschaubild
LeitfädenScrapy Splash Tutorial: Die Kunst des Scrapings von JavaScript-gerenderten Websites mit Scrapy und Splash beherrschen

Lernen Sie, wie Sie mit Scrapy und Splash dynamische JavaScript-gerenderte Websites scrapen können. Von der Installation über das Schreiben eines Spiders bis hin zum Umgang mit Seitenumbrüchen und der Verwaltung von Splash-Antworten bietet dieser umfassende Leitfaden Schritt-für-Schritt-Anleitungen für Anfänger und Experten gleichermaßen.

Ștefan Răcila
Autorenavatar
Ștefan Răcila
6 Minuten lesen
Vorschaubild
LeitfädenErfahren Sie, wie Sie die Cloudflare-Erkennung mit dem besten Selenium-Browser umgehen

Erfahren Sie, welcher Browser am besten geeignet ist, um Cloudflare-Erkennungssysteme beim Web-Scraping mit Selenium zu umgehen.

Mihnea-Octavian Manolache
Autorenavatar
Mihnea-Octavian Manolache
9 Minuten lesen
Vorschaubild
LeitfädenEntsperren Sie Websites und schützen Sie Ihre Identität mit Proxies und Axios Node.js

Erfahren Sie, wie Sie Proxies mit Axios & Node.js für effizientes Web Scraping nutzen können. Tipps, Code-Beispiele und die Vorteile der Verwendung von WebScrapingAPI inklusive.

Suciu Dan
Autorenavatar
Suciu Dan
7 Minuten lesen