L’objectif principal des robots d’exploration est de collecter certaines données spécifiques accessibles au public sur Internet. Grâce à ces données, nous pouvons analyser certaines tendances et les comparer, ou former des modèles pour le deep learning, etc. Dans ce numéro, nous présenterons un package node.js
spécifiquement utilisé pour l'exploration du Web - node-crawler
, et nous l'utiliserons pour réaliser un cas d'exploration simple permettant d'explorer des images sur des pages Web et de les télécharger localement.
node-crawler
est un outil d'exploration node.js
léger qui prend en compte à la fois l'efficacité et la commodité. Il prend en charge les systèmes d'exploration distribués, le codage en dur et les agents frontaux http. De plus, il est entièrement écrit en nodejs
et prend intrinsèquement en charge les E/S asynchrones non bloquantes, ce qui offre une grande commodité pour le mécanisme de fonctionnement du pipeline du robot. En même temps, il prend en charge la sélection rapide du DOM
(vous pouvez utiliser la syntaxe jQuery
), ce qui peut être considéré comme une fonctionnalité exceptionnelle pour la tâche d'exploration de parties spécifiques de pages Web. Il n'est pas nécessaire d'écrire manuellement des expressions régulières. ce qui améliore l’efficacité du développement des robots.
, nous créons d'abord un nouveau projet et créons index.js comme fichier d'entrée.
Installez ensuite la bibliothèque de robots node-crawler
.
#PNPM pnpm ajouter un robot #NPM npm i -S robot d'exploration #fil Yarn Add Crawler
, puis utilisez require
pour l'introduire.
// index.js const Crawler = require("crawler");
// index.js laissez robot = nouveau robot ({ délai d'attente : 10000, jQuery : vrai, }) fonction getImages(uri) { robot.queue({ Uri, rappel : (err, res, done) => { if (err) throw err; } }) }
A partir de maintenant, nous allons commencer à écrire une méthode pour obtenir l'image de la page html. Une fois crawler
instancié, il est principalement utilisé pour écrire des liens et des méthodes de rappel dans sa file d'attente. Cette fonction de rappel sera appelée après le traitement de chaque requête.
Il convient également de noter ici que Crawler
utilise la bibliothèque request
, donc la liste des paramètres disponibles pour la configuration Crawler
est un sur-ensemble des paramètres de la bibliothèque request
, c'est-à-dire que toutes les configurations de request
sont applicables à Crawler
.
Peut-être avez-vous également vu le paramètre jQuery
tout à l'heure. Vous l'avez bien deviné, il peut utiliser la syntaxe jQuery
pour capturer des éléments DOM
.
// index.js laissez les données = [] fonction getImages(uri) { robot.queue({ Uri, rappel : (err, res, done) => { if (err) throw err; soit $ = rés.$; essayer { laissez $imgs = $("img"); Objet.keys($imgs).forEach(index => { laissez img = $imgs[index]; const { type, nom, attributs = {} } = img; laissez src = attribs.src || if (type === "tag" && src && !data.includes(src)) { laissez fileSrc = src.startsWith('http') src : `https:${src}` laissez fileName = src.split("/")[src.split("/").length-1] downloadFile(fileSrc, fileName) // Comment télécharger des images data.push(src) } }); } attraper (e) { console.erreur(e); fait() } fait(); } }) }
Vous pouvez voir que vous venez d'utiliser $
pour capturer la balise img
dans la requête. Ensuite, nous utilisons la logique suivante pour traiter le lien vers l'image terminée et supprimer le nom afin qu'il puisse être enregistré et nommé ultérieurement. Un tableau est également défini ici, son but est de sauvegarder l'adresse de l'image capturée. Si la même adresse d'image est trouvée lors de la prochaine capture, le téléchargement ne sera pas traité de manière répétée.
Voici les informations imprimées à l'aide $("img")
pour capturer le code HTML de la page d'accueil des Nuggets :
télécharger l'image,
nous devons installer un package nodejs
- axios
. Oui, vous avez bien lu, axios
n'est pas seulement fourni pour le front-end, il peut également être utilisé par le back-end. Mais comme le téléchargement d’images doit être traité dans un flux de données, responseType
est défini sur stream
. Ensuite, vous pouvez utiliser la méthode pipe
pour enregistrer le fichier de flux de données.
const { par défaut : axios } = require("axios"); const fs = require('fs'); fonction asynchrone downloadFile(uri, nom) { laissez rép = "./imgs" si (!fs.existsSync(dir)) { attendre fs.mkdirSync(dir) } laissez filePath = `${dir}/${name}` laissez res = attendre axios({ URL : uri, Type de réponse : « flux » }) soit ws = fs.createWriteStream(filePath) res.data.pipe(ws) res.data.on("close",()=>{ ws.close(); }) }
Parce qu'il peut y avoir beaucoup d'images, donc si vous souhaitez les placer dans un seul dossier, vous devez déterminer s'il existe un tel dossier. Sinon, créez-en un. Utilisez ensuite la méthode createWriteStream
pour enregistrer le flux de données obtenu dans le dossier sous la forme d'un fichier.
Ensuite, nous pouvons l'essayer. Par exemple, nous capturons l'image sous le html de la page d'accueil des Nuggets :
// index.js.Après avoir exécuté
getImages("https://juejin.cn/"),
vous pouvez constater que toutes les images du code HTML statique ont été capturées.
nœud index.js
Conclusion
À la fin, vous pouvez également voir que ce code peut ne pas fonctionner pour SPA (Single Page Application). Puisqu'il n'y a qu'un seul fichier HTML dans une application monopage et que tout le contenu de la page Web est rendu dynamiquement, il reste le même Quoi qu'il en soit, vous pouvez directement gérer sa demande de données pour collecter les informations souhaitées. .
Une autre chose à dire est que de nombreux amis utilisent request.js
pour traiter les demandes de téléchargement d'images. Bien sûr, cela est possible, et même la quantité de code est plus petite. Cependant, ce que je veux dire, c'est que cette bibliothèque a déjà été utilisée. en 2020. Il est obsolète. Il est préférable de passer à une bibliothèque constamment mise à jour et entretenue.