Wie man einen Proxy mit Node Fetch verwendet und einen Web Scraper erstellt

Mihnea-Octavian Manolache am 24. April 2023

blog-image

Erstens sind Proxys beim Aufbau eines Web Scrapers definitiv sehr wichtig. Zweitens ist node-fetch einer der beliebtesten JavaScript-HTTP-Clients. Es macht also Sinn, die beiden zu kombinieren und einen Web Scraper zu erstellen.

Deshalb werden wir heute besprechen, wie man einen Proxy mit node-fetch verwendet. Und als Bonus werden wir einen Web Scraper auf dieser Infrastruktur aufbauen.

Am Ende dieses Artikels:

  • Sie haben ein solides Verständnis dafür, wie Proxys beim Web Scraping funktionieren
  • Sie werden lernen, wie man einen Proxy mit node-fetch integriert
  • Sie werden ein Projekt zu Ihrem persönlichen Portfolio hinzufügen

Was ist ein Proxy und warum sollte man ihn für Web Scraping verwenden?

In Computernetzwerken fungieren Proxys als "Middlewares" zwischen einem Client und einem Server. Die Architektur eines Proxy-Servers ist ziemlich komplex, aber im Großen und Ganzen passiert Folgendes, wenn Sie einen Proxy verwenden:

  1. Sie "zapfen" den Proxy-Server an und geben das Ziel (den Server) an, das Sie erreichen wollen (scrapen)
  2. Der Proxy-Server stellt eine Verbindung zu Ihrem Ziel her und ruft die Ergebnisse ab (z. B. die HTML-Dateien einer Website)
  3. Der Proxyserver gibt Ihnen dann die Antwort zurück, die er vom Zielserver erhalten hat
blog-image

In dieser Kette bleibt Ihre IP-Adresse vor dem Zielserver verborgen, da Sie sich nie mit ihm verbinden. Und das ist der Hauptgrund, warum Proxys ein so wichtiger Bestandteil des Web Scraping sind. Sie "verstecken" die IP-Adresse des Web Scrapers, so dass sie nicht von Anti-Bot-Systemen blockiert werden kann.

Warum node-fetch für Web Scraping verwenden?

Wenn JavaScript Ihre bevorzugte Programmiersprache ist, gibt es viele HTTP-Clients, die Sie zum Erstellen eines Web Scrapers verwenden können. Zu den beliebtesten gehören axios, got und einige andere, die hier aufgeführt sind. Aber node-fetch bleibt eines der am häufigsten heruntergeladenen npm-Pakete, und das hat einen Grund.

Zunächst ist es das erste Paket, das die Fetch-API in Node JS implementiert. Ab Version 17.5.0 fügte das Node-JS-Team dann die Fetch-API hinzu, so dass sie nicht mehr als Abhängigkeit von Dritten benötigt wird. Bis heute, in Node JS Version 19.3.0, ist Fetch immer noch als experimentell gekennzeichnet. Node-Fetch bleibt also die stabilere Lösung.

Scraping-spezifisch ist node-fetch ein großartiges Werkzeug, weil es, wie der Name schon sagt, zum Abrufen von Ressourcen aus verschiedenen Quellen verwendet wird. Und das ist vielleicht die grundlegendste Definition von Scraping.

Wie kann man node-fetch mit Proxys verwenden?

Lange Rede, kurzer Sinn: Es gibt keine eingebaute Methode zur Verwendung eines Proxys mit Node-Fetch. Wenn Sie also einen Web Scraper bauen wollen, Ihre Infrastruktur aber auf Node-Fetch basiert, riskieren Sie, Ihre echte IP-Adresse preiszugeben. Das bedeutet, dass Sie Gefahr laufen, von Antibot-Software blockiert zu werden.

Glücklicherweise gibt es jedoch Umgehungsmöglichkeiten. Eine davon wird uns von Nathan Rajlich angeboten, der ein Modul gebaut hat, das http.Agent implementiert und https-proxy-agent heißt. Die Installation ist über npm verfügbar. Auch die Implementierung mit node-fetch ist ziemlich einfach:

import fetch from 'node-fetch';

import HttpsProxyAgent from "https-proxy-agent";

const fetch_proxy = async () => {

const proxy = new HttpsProxyAgent('http://1.255.134.136:3128');

const response = await fetch('https://httpbin.org/ip', { agent: proxy});

const data = await response.text();

console.log(data);

}

fetch_proxy()

Für diesen Test habe ich einen kostenlosen Proxy von Proxy Scrape verwendet. Wie erwartet, zeigt die Antwort an, dass die Anfrage von der Proxy-IP und nicht von meiner lokalen IP stammt:

"Herkunft": "1.255.134.136"

Eine andere Möglichkeit ist die Verwendung von node-fetch-with-proxy. Dieses Paket verwendet proxy-agent als eigene Abhängigkeit zusätzlich zu node-fetch. Damit dies funktioniert, müssen Sie nur die Umgebungsvariable "HTTP_PROXY" setzen. Sie nimmt die IP-Adresse Ihres Proxyservers und die Portnummer als Wert an. Dann können Sie die reguläre node-fetch-Syntax für Ihre Aufrufe verwenden, die automatisch an den Proxyserver weitergeleitet werden. Hier ist ein Beispiel:

import fetch from "node-fetch-with-proxy";

fetch('http://httpbin.org/ip')

.then(res => res.json())

.then(json => console.log(json));

Wie baut man einen Web Scraper unter Verwendung eines Proxys mit node-fetch?

Das Beste daran ist, dass wir bereits einen Web Scraper gebaut haben. Die Code-Beispiele von oben tun genau das, was jeder Web-Scraper tut, nämlich Daten von einer Website sammeln. In einem realen Szenario ist ein Web Scraper jedoch ein wenig komplexer. Zum Beispiel müssen die Rohdaten verarbeitet werden, oder wir müssen die gesammelten Header oder Cookies überprüfen und analysieren. Lassen Sie uns also etwas tiefer eintauchen und unser erstes Beispiel in einen echten Scraper verwandeln. Legen wir einige Erwartungen fest:

  1. Wir sollten in der Lage sein, das rohe HTML zurückzugeben
  2. Wir sollten in der Lage sein, die gesamte Antwort als JSON-Objekt zurückzugeben
  3. Wir sollten in der Lage sein, Elemente auf der Grundlage von bestimmten Selektoren zu extrahieren

Unter der Annahme, dass Sie node-fetch und https-proxy-agent bereits installiert haben, brauchen wir noch etwas: einen HTML-Parser. Für Web Scraping verwende ich immer cheerio. Stellen Sie also sicher, dass Sie ihn in Ihrem Projekt installieren. Nachdem das gesagt ist, lassen Sie uns anfangen:

#1: Abhängigkeiten importieren

Das erste, was wir tun wollen, ist die Pakete zu importieren, die wir oben besprochen haben. Ich denke, dieser Teil bedarf keiner weiteren Erklärung:

import fetch from 'node-fetch';

import HttpsProxyAgent from "https-proxy-agent";

import * as cheerio from 'cheerio';

#Nr. 2: Scraper-Logik

Unser Scraper muss drei Aktionen ausführen können: Rückgabe der HTML-Zeile, Rückgabe der gesamten Antwort und Rückgabe eines Elements auf der Grundlage seines CSS-Selektors. Eine dieser Aktionen haben wir bereits teilweise implementiert. Aber lassen Sie uns alles in drei Funktionen aufteilen:

const raw_html = async (proxyServer, targetURL) => {

const proxy = new HttpsProxyAgent(proxyServer);

const response = await fetch(targetURL, { agent: proxy});

const data = await response.text();

return data;

}

const json_response = async (proxyServer, targetURL) => {

const proxy = new HttpsProxyAgent(proxyServer);

const response = await fetch(targetURL, { agent: proxy});

const data = {

url: response.url,

status: response.status,

Headers: response.headers,

body: await response.text()

}

return data;

}

const select_css = async (proxyServer, targetURL, cssSelector) => {

const proxy = new HttpsProxyAgent(proxyServer);

const response = await fetch(targetURL, { agent: proxy});

const html = await response.text();

const $ = cheerio.load(html);

return $(cssSelector).text();

}

#3: Argument-Parser

Wir können Terminal-Argumente verwenden, um zwischen den drei Optionen zu unterscheiden, die wir in unserem Scraper implementiert haben. Es gibt Optionen, die Sie verwenden können, um Terminalargumente in Node zu parsen, aber ich möchte die Dinge einfach halten. Deshalb werden wir process.argv verwenden, das ein Array von Argumenten erzeugt. Beachten Sie, dass die ersten beiden Elemente dieses Arrays "node" und der Name Ihres Skripts sind. Wenn Sie zum Beispiel `node scraper.js raw_html` ausführen, sieht das Argumenten-Array wie folgt aus:

[

'/usr/local/bin/node',

'path_to_directory/scraper.js',

'raw_html'

]

Wir ignorieren die ersten beiden Elemente und verwenden die folgende Logik:

  1. das erste Argument gibt die Funktion an, die wir ausführen wollen;
  2. die zweite verweist auf unser Ziel (die Website, die wir auslesen wollen);
  3. der dritte verweist auf den Proxyserver;
  4. und eine vierte verweist auf den css-Selektor.

Der Befehl zum Ausführen unseres Scrapers sollte also wie folgt aussehen:

~ " node scraper.js raw_html https://webscrapingapi.com http://1.255.134.136:3128 

Dies bedeutet einfach, dass wir das rohe HTML aus der Homepage von WebScrapingAPI extrahieren und http://1.255.134.136 als Proxy-Middleware verwenden. Der letzte Teil besteht nun darin, die Logik für diese Argumente zu kodieren, so dass unser Code den Ausführungsbefehl verstehen wird:

const ACTION = process.argv[2]

const TARGET = process.argv[3]

const PROXY = process.argv[4]

const SELECTOR = process.argv[5]
switch (ACTION) {

case 'raw_html':

console.log(await raw_html(PROXY, TARGET))

break

case 'json_response':

console.log(await json_response(PROXY, TARGET))

break

case 'select_css':

SELECTOR ? console.log(await select_css(PROXY, TARGET, SELECTOR)) : console.log('Please specify a CSS selector!')

break

default:

conssole.log('Please choose between `raw_html`, `json_response` and `select_css`')

}

Und das war's im Grunde. Herzlichen Glückwunsch! Sie haben erfolgreich einen voll funktionsfähigen Web Scraper unter Verwendung eines Proxys mit Node-Fetch erstellt. Ich fordere Sie nun auf, diesem Scraper weitere Funktionen hinzuzufügen, Ihre eigene Version zu erstellen und sie als Asset in Ihrem persönlichen Portfolio zu verwenden.

Die Verwendung eines Proxys mit Node-Fetch reicht für Web Scraping möglicherweise nicht aus

Wie ich zu sagen pflege, gehört zum heimlichen Scrapen mehr als nur das Verstecken der eigenen IP-Adresse. In Wirklichkeit ist die Verwendung eines Proxy-Servers für Ihren Web Scraper nur eine Ebene des Schutzes gegen Anti-Bot-Software. Eine andere Ebene ist das Ändern Ihres User-Agents durch [Setzen von benutzerdefinierten Headern für Ihre Anfrage] (LINK https://trello.com/c/n8xZswSI/14-2-8-january-article-13-http-headers-with-axios).

Bei Web Scraping API zum Beispiel arbeitet ein spezielles Team an benutzerdefinierten Umgehungstechniken. Einige von ihnen gehen so weit, dass sie die Standardwerte des Headless-Browsers ändern, um das Fingerprinting zu vermeiden.

Da moderne Websites Inhalte dynamisch mit JavaScript darstellen, reicht ein einfacher HTTP-Client wie node-fetch möglicherweise nicht aus. Vielleicht möchten Sie einen echten Webbrowser verwenden. Selenium von Python oder Puppeteer von Node sind nur zwei Optionen, die Sie in dieser Hinsicht in Betracht ziehen könnten.

Schlussfolgerungen

Die Verwendung eines Proxys mit Node-Fetch ist ein guter Ausgangspunkt für die Entwicklung eines Web Scrapers. Sie müssen jedoch berücksichtigen, dass die beiden nicht "direkt kompatibel" sind und Sie eine Lösung eines Drittanbieters verwenden müssen, um sie zu verbinden. Zum Glück gibt es viele Möglichkeiten, und die JavaScript-Gemeinschaft hilft Neueinsteigern gerne weiter.

Einen getarnten Scraper zu bauen, ist jedoch schwieriger, und man muss sich komplexere Ausweichtechniken einfallen lassen. Aber ich sehe in allem gerne eine Chance. Warum nimmst du nicht das, was du heute gelernt hast, und baust es aus. Am Ende werden Sie hoffentlich den besten Web Scraper haben, der mit Node-Fetch und Proxys geschrieben wurde. Wie immer lautet mein Rat an Sie: Lernen Sie weiter!

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ä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ädenWie man einen Scraper baut und eine Datei mit Puppeteer herunterlädt

Entdecken Sie 3 Möglichkeiten, wie Sie mit Puppeteer Dateien herunterladen und einen Web Scraper erstellen können, der genau das tut.

Mihnea-Octavian Manolache
Autorenavatar
Mihnea-Octavian Manolache
8 Minuten lesen
Vorschaubild
LeitfädenWie man Bewertungen aus Google Maps einfängt

Erfahren Sie, wie Sie Google Maps-Bewertungen mit unserer API unter Verwendung von Node.js abrufen können. Erhalten Sie Schritt-für-Schritt-Anleitungen zum Einrichten, Extrahieren von Daten und Überwinden möglicher Probleme.

Andrej Ogiolan
Autorenavatar
Andrej Ogiolan
9 Minuten lesen