El objetivo principal de los rastreadores es recopilar algunos datos específicos que están disponibles públicamente en Internet. Con estos datos podemos analizar algunas tendencias y compararlas, o entrenar modelos para aprendizaje profundo, etc. En este número, presentaremos un paquete node.js
utilizado específicamente para el rastreo web: node-crawler
, y lo usaremos para completar un caso de rastreo simple para rastrear imágenes en páginas web y descargarlas localmente.
node-crawler
es una herramienta de rastreo liviana node.js
que tiene en cuenta tanto la eficiencia como la conveniencia. Admite sistemas de rastreo distribuidos, codificación rígida y agentes front-end http. Además, está completamente escrito en nodejs
e inherentemente admite IO asíncrono sin bloqueo, lo que proporciona una gran comodidad para el mecanismo de operación de canalización del rastreador. Al mismo tiempo, admite la selección rápida de DOM
(puede usar la sintaxis jQuery
), que se puede decir que es una característica excelente para la tarea de rastrear partes específicas de páginas web. No es necesario escribir expresiones regulares a mano. lo que mejora la eficiencia del desarrollo del rastreador.
, primero creamos un nuevo proyecto y creamos index.js como archivo de entrada.
Luego instale la biblioteca del rastreador node-crawler
.
#PNPM pnpm agregar rastreador #MNP npm i -S rastreador #hilo hilo agregue rastreador
y luego use require
para introducirlo.
// index.js const Crawler = require("crawler");
// index.js let rastreador = nuevo rastreador ({ tiempo de espera: 10000, jQuery: verdadero, }) función obtenerImagen(uri) { rastreador.cola ({ uri, devolución de llamada: (err, res, hecho) => { si (err) tirar errar; } }) }
De ahora en adelante comenzaremos a escribir un método para obtener la imagen de la página html. Una vez que se crea crawler
, se utiliza principalmente para escribir enlaces y métodos de devolución de llamada en su cola. Esta función de devolución de llamada se llamará después de que se procese cada solicitud.
También debe tenerse en cuenta aquí que Crawler
usa la biblioteca request
, por lo que la lista de parámetros disponibles para la configuración del Crawler
es un superconjunto de los parámetros de la biblioteca request
, es decir, todas las configuraciones en request
son aplicables a Crawler
.
Quizás también hayas visto el parámetro jQuery
hace un momento. Lo has adivinado bien, puede usar la sintaxis jQuery
para capturar elementos DOM
.
// index.js dejar datos = [] función obtenerImagen(uri) { rastreador.cola ({ uri, devolución de llamada: (err, res, hecho) => { si (err) tirar errar; let $ = res.$; intentar { let $imgs = $("img"); Objeto.keys($imgs).forEach(index => { let img = $imgs[índice]; const {tipo, nombre, atributos = {} } = img; let src = atributos.src || if (tipo === "etiqueta" && src && !data.includes(src)) { let fileSrc = src.startsWith('http') src: `https:${src}` let fileName = src.split("/")[src.split("/").length-1] downloadFile(fileSrc, fileName) // Cómo descargar imágenes data.push(src) } }); } atrapar (e) { consola.error(e); hecho() } hecho(); } }) }
Puede ver que acaba de usar $
para capturar la etiqueta img
en la solicitud. Luego usamos la siguiente lógica para procesar el enlace a la imagen completa y eliminar el nombre para poder guardarlo y nombrarlo más tarde. Aquí también se define una matriz, su propósito es guardar la dirección de la imagen capturada. Si se encuentra la misma dirección de imagen en la siguiente captura, la descarga no se procesará repetidamente.
La siguiente es la información impresa usando $("img")
para capturar el HTML de la página de inicio de los Nuggets:
descargar la imagen,
necesitamos instalar un paquete nodejs
: axios
. Sí, lo leíste bien. axios
no solo se proporciona para el front-end, sino que también puede usarse en el back-end. Pero debido a que la descarga de imágenes debe procesarse en un flujo de datos, responseType
se establece en stream
. Luego puede utilizar el método pipe
para guardar el archivo de flujo de datos.
const {predeterminado: axios} = requerir("axios"); const fs = requerir('fs'); función asíncrona downloadFile(uri, nombre) { let dir = "./imgs" si (!fs.existsSync(dir)) { espere fs.mkdirSync(dir) } let filePath = `${dir}/${nombre}` let res = esperar axios({ URL: uri, tipo de respuesta: 'flujo' }) let ws = fs.createWriteStream(filePath) tubería.res.data.(ws) res.data.on("cerrar",()=>{ ws.cerrar(); }) }
Debido a que puede haber muchas imágenes, si desea colocarlas en una carpeta, debe determinar si existe dicha carpeta. Si no, cree una. Luego use el método createWriteStream
para guardar el flujo de datos obtenido en la carpeta en forma de archivo.
Entonces podemos probarlo. Por ejemplo, capturamos la imagen debajo del html de la página de inicio de Nuggets:
// index.js.Después de ejecutar
getImages ("https://juejin.cn/"),
puede encontrar que se han capturado todas las imágenes en el html estático.
nodo index.js
Conclusión
Al final, también puede ver que es posible que este código no funcione para SPA (aplicación de página única). Dado que solo hay un archivo HTML en una aplicación de una sola página y todo el contenido de la página web se representa dinámicamente, no importa qué, puede manejar directamente su solicitud de datos para recopilar la información que desee. .
Otra cosa que decir es que muchos amigos usan request.js
para procesar solicitudes para descargar imágenes. Por supuesto, esto es posible, e incluso la cantidad de código es menor. Sin embargo, lo que quiero decir es que esta biblioteca ya se ha utilizado. en 2020. Está en desuso. Es mejor cambiar a una biblioteca que se actualice y mantenga constantemente.