Der Hauptzweck von Crawlern besteht darin, bestimmte Daten zu sammeln, die im Internet öffentlich verfügbar sind. Mithilfe dieser Daten können wir einige Trends analysieren und vergleichen oder Modelle für Deep Learning usw. trainieren. In dieser Ausgabe stellen wir ein node.js
Paket vor, das speziell für das Web-Crawling verwendet wird – node-crawler
– und verwenden es, um einen einfachen Crawler-Fall abzuschließen, um Bilder auf Webseiten zu crawlen und sie lokal herunterzuladen.
node-crawler
ist ein leichtes Crawler-Tool node.js
, das sowohl Effizienz als auch Komfort berücksichtigt. Es unterstützt verteilte Crawler-Systeme, Hard-Coding und http-Front-End-Agenten. Darüber hinaus ist es vollständig in nodejs
geschrieben und unterstützt von Natur aus nicht blockierende asynchrone E/A, was dem Pipeline-Betriebsmechanismus des Crawlers großen Komfort bietet. Gleichzeitig unterstützt es die schnelle Auswahl von DOM
(Sie können jQuery
-Syntax verwenden), was als Killerfunktion für das Crawlen bestimmter Teile von Webseiten bezeichnet werden kann. Es ist nicht erforderlich, reguläre Ausdrücke von Hand zu schreiben. Dies verbessert die Effizienz der Crawler-Entwicklung.
erstellen wir zunächst ein neues Projekt und erstellen index.js als Einstiegsdatei.
Installieren Sie dann die Crawler-Bibliothek node-crawler
.
#PNPM pnpm Crawler hinzufügen #NPM npm i -S Crawler #Garn Garn fügt Crawler hinzu
und verwendet dann require
um es einzuführen.
// index.js const Crawler = require("crawler");
// index.jserstellen
let crawler = new Crawler({ Zeitüberschreitung: 10000, jQuery: wahr, }) Funktion getImages(uri) { crawler.queue({ uri, Rückruf: (err, res, done) => { if (err) throw err; } }) }
Von nun an beginnen wir mit dem Schreiben einer Methode, um das Bild der HTML-Seite abzurufen. Nachdem crawler
instanziiert wurde, wird er hauptsächlich zum Schreiben von Links und Rückrufmethoden in seine Warteschlange verwendet. Diese Rückruffunktion wird aufgerufen, nachdem jede Anfrage verarbeitet wurde.
Hier ist auch zu beachten, dass Crawler
die request
verwendet, sodass die für Crawler
-Konfiguration verfügbare Parameterliste eine Obermenge der Parameter der request
ist, d. h. alle Konfigurationen in request
gelten für Crawler
.
Vielleicht haben Sie gerade auch den jQuery
Parameter gesehen. Sie haben es richtig erraten, er kann jQuery
Syntax verwenden, um DOM
-Elemente zu erfassen.
// index.js let data = [] Funktion getImages(uri) { crawler.queue({ uri, Rückruf: (err, res, done) => { if (err) throw err; sei $ = res.$; versuchen { let $imgs = $("img"); Object.keys($imgs).forEach(index => { let img = $imgs[index]; const { Typ, Name, Attribute = {} } = img; let src = attribs.src || ""; if (type === "tag" && src && !data.includes(src)) { let fileSrc = src.startsWith('http') ? src : `https:${src}` let fileName = src.split("/")[src.split("/").length-1] downloadFile(fileSrc, fileName) // So laden Sie Bilder herunter data.push(src) } }); } fangen (e) { console.error(e); Erledigt() } Erledigt(); } }) }
Sie können sehen, dass Sie gerade $
verwendet haben, um das img
-Tag in der Anfrage zu erfassen. Dann verwenden wir die folgende Logik, um den Link zum fertigen Bild zu verarbeiten und den Namen zu entfernen, damit es gespeichert und später benannt werden kann. Hier wird auch ein Array definiert, dessen Zweck darin besteht, die erfasste Bildadresse zu speichern. Wenn bei der nächsten Erfassung dieselbe Bildadresse gefunden wird, wird der Download nicht wiederholt verarbeitet.
Die folgenden Informationen werden mit $("img")
gedruckt, um den HTML-Code der Nuggets-Homepage zu erfassen:
wir das Image herunterladen,
müssen wir ein nodejs
-Paket installieren – axios
. Ja, Sie haben es richtig gelesen. axios
wird nicht nur für das Frontend bereitgestellt, es kann auch vom Backend verwendet werden. Da das Herunterladen von Bildern jedoch in einen Datenstrom verarbeitet werden muss, ist responseType
auf stream
festgelegt. Anschließend können Sie die Datenflussdatei mit der pipe
-Methode speichern.
const { default: axios } = require("axios"); const fs = require('fs'); asynchrone Funktion downloadFile(uri, name) { let dir = "./imgs" if (!fs.existsSync(dir)) { Warten auf fs.mkdirSync(dir) } let filePath = `${dir}/${name}` let res = waiting axios({ URL: uri, Antworttyp: 'Stream' }) let ws = fs.createWriteStream(filePath) res.data.pipe(ws) res.data.on("close",()=>{ ws.close(); }) }
Da möglicherweise viele Bilder vorhanden sind, müssen Sie, wenn Sie sie in einem Ordner ablegen möchten, feststellen, ob ein solcher Ordner vorhanden ist. Wenn nicht, erstellen Sie einen. Verwenden Sie dann die Methode createWriteStream
, um den erhaltenen Datenstrom in Form einer Datei im Ordner zu speichern.
Dann können wir es versuchen. Wir erfassen beispielsweise das Bild unter dem HTML der Nuggets-Homepage:
// index.jsNachdem Sie
getImages ("https://juejin.cn/") ausgeführt haben,
können Sie feststellen, dass alle Bilder im statischen HTML erfasst wurden.
Knoten index.js
Fazit
Am Ende sehen Sie auch, dass dieser Code möglicherweise nicht für SPA (Single Page Application) funktioniert. Da es in einer Einzelseitenanwendung nur eine HTML-Datei gibt und der gesamte Inhalt der Webseite dynamisch gerendert wird, können Sie die Datenanforderung, die Sie benötigen, direkt verarbeiten .
Eine andere Sache ist, dass viele Freunde request.js
verwenden, um Anfragen zum Herunterladen von Bildern zu verarbeiten, und selbst die Codemenge ist geringer. Ich möchte jedoch sagen, dass diese Bibliothek bereits verwendet wurde im Jahr 2020. Es ist besser, zu einer Bibliothek zu wechseln, die ständig aktualisiert und gewartet wird.