Основная цель сканеров — сбор определенных данных, которые общедоступны в Интернете. Используя эти данные, мы можем проанализировать некоторые тенденции и сравнить их, или обучить модели глубокому обучению и т. д. В этом выпуске мы представим пакет node.js
, специально используемый для сканирования веб-страниц — node-crawler
, и будем использовать его для выполнения простого варианта сканера для сканирования изображений на веб-страницах и их локальной загрузки.
node-crawler
— это легкий инструмент для сканирования node.js
, который учитывает как эффективность, так и удобство. Он поддерживает распределенные системы сканирования, жесткое кодирование и интерфейсные агенты HTTP. Более того, он полностью написан на nodejs
и по своей сути поддерживает неблокирующий асинхронный ввод-вывод, что обеспечивает большое удобство для механизма работы конвейера сканера. В то же время он поддерживает быстрый выбор DOM
(вы можете использовать синтаксис jQuery
), что можно назвать убийственной функцией для задачи сканирования определенных частей веб-страниц. Нет необходимости писать регулярные выражения вручную. что повышает эффективность разработки краулеров.
, мы сначала создаем новый проект и создаем index.js в качестве входного файла.
Затем установите библиотеку сканера node-crawler
.
#ПНПМ pnpm добавить сканер #НПМ сканер npm i -S #пряжа Yarn добавляет сканер
, а затем использует require
, чтобы ввести его.
// индекс.js const Crawler = require("Crawler");
// index.js let Crawler = новый Crawler({ тайм-аут: 10000, jQuery: правда, }) функция getImages(uri) { сканер.очередь({ ури, обратный вызов: (ошибка, разрешение, готово) => { если (ошибка) выбросить ошибку; } }) }
С этого момента мы начнем писать метод для получения изображения html-страницы. После создания экземпляра crawler
он в основном используется для записи ссылок и методов обратного вызова в своей очереди. Эта функция обратного вызова будет вызываться после обработки каждого запроса.
Здесь также следует отметить, что Crawler
использует библиотеку request
, поэтому список параметров, доступный для конфигурации Crawler
, является расширенным набором параметров библиотеки request
, то есть все конфигурации в библиотеке request
применимы к Crawler
.
Возможно, вы только что видели параметр jQuery
. Вы правильно догадались: он может использовать синтаксис jQuery
для захвата элементов DOM
.
// индекс.js пусть данные = [] функция getImages(uri) { сканер.очередь({ ури, обратный вызов: (ошибка, разрешение, готово) => { если (ошибка) выбросить ошибку; пусть $ = res.$; пытаться { пусть $imgs = $("img"); Object.keys($imgs).forEach(index => { пусть img = $imgs[индекс]; const {тип, имя, атрибуты = {}} = img; пусть источник = 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) // Как скачать картинки data.push(src) } }); } поймать (е) { консоль.ошибка(е); сделанный() } сделанный(); } }) }
Вы можете видеть, что вы только что использовали $
для захвата тега img
в запросе. Затем мы используем следующую логику для обработки ссылки на готовое изображение и удаления имени, чтобы его можно было сохранить и дать ему имя позже. Здесь также определяется массив, его цель — сохранить адрес захваченного изображения. Если тот же адрес изображения будет найден при следующем захвате, загрузка не будет обрабатываться повторно.
Ниже приведена информация, напечатанная с использованием $("img")
для захвата HTML-кода домашней страницы Nuggets:
загрузкой образа
нам необходимо установить пакет nodejs
— axios
. Да, вы правильно прочитали, axios
предоставляется не только для внешнего интерфейса, он также может использоваться для серверной части. Но поскольку загружаемые изображения необходимо преобразовать в поток данных, для responseType
установлено stream
. Затем вы можете использовать метод pipe
для сохранения файла потока данных.
const {default: axios } = require("axios"); const fs = require('fs'); асинхронная функция downloadFile(uri, name) { let dir = "./imgs" если (!fs.existsSync(каталог)) { ожидайте fs.mkdirSync(каталог) } пусть filePath = `${dir}/${name}` let res = await axios({ URL: Ури, Тип ответа: 'поток' }) пусть ws = fs.createWriteStream(filePath) res.data.pipe(ws) res.data.on("закрыть",()=>{ ws.закрыть(); }) }
Потому что картинок может быть много, поэтому если вы хотите поместить их в одну папку, вам нужно определить, есть ли такая папка. Если нет, создайте ее. Затем с помощью метода createWriteStream
сохраните полученный поток данных в папку в виде файла.
Тогда мы можем попробовать. Например, мы захватываем изображение в HTML-коде домашней страницы Nuggets:
// index.js.После выполнения
getImages("https://juejin.cn/")
вы обнаружите, что все изображения в статическом HTML-коде были захвачены.
узел index.js
Заключение
. В конце вы также можете увидеть, что этот код может не работать для SPA (одностраничного приложения). Поскольку в одностраничном приложении имеется только один HTML-файл, а все содержимое веб-страницы отображается динамически, оно остается неизменным, несмотря ни на что, вы можете напрямую обрабатывать его запросы данных для сбора нужной информации. .
Еще стоит сказать, что многие друзья используют request.js
для обработки запросов на загрузку изображений. Конечно, это возможно, и даже объем кода меньше. Однако я хочу сказать, что эта библиотека уже использовалась. в 2020 году. Она устарела. Лучше перейти на библиотеку, которая постоянно обновляется и поддерживается.