如何利用Node.js做簡單的圖片爬取
介紹
爬蟲的主要目的是收集互聯(lián)網(wǎng)上公開的一些特定數(shù)據(jù)。利用這些數(shù)據(jù)我們可以能進(jìn)行分析一些趨勢對比,或者訓(xùn)練模型做深度學(xué)習(xí)等等。本期我們就將介紹一個專門用于網(wǎng)絡(luò)抓取的 node.js 包—— node-crawler ,并且我們將用它完成一個簡單的爬蟲案例來爬取網(wǎng)頁上圖片并下載到本地。
node-crawler 是一個輕量級的 node.js 爬蟲工具,兼顧了高效與便利性,支持分布式爬蟲系統(tǒng),支持硬編碼,支持http前級代理。而且,它完全是由 nodejs 寫成,天生支持非阻塞異步IO,為爬蟲的流水線作業(yè)機(jī)制提供了極大便利。同時支持對 DOM 的快速選擇(可以使用 jQuery 語法),對于抓取網(wǎng)頁的特定部分的任務(wù)可以說是殺手級功能,無需再手寫正則表達(dá)式,提高爬蟲開發(fā)效率。
安裝引入
我們先新建一個項目,在里面創(chuàng)建index.js作為入口文件。
然后進(jìn)行爬蟲庫 node-crawler 的安裝。
# PNPM pnpm add crawler # NPM npm i -S crawler # Yarn yarn add crawler
然后用過 require 引入進(jìn)去。
// index.js
const Crawler = require("crawler");創(chuàng)建實例
// index.js
let crawler = new Crawler({
timeout:10000,
jQuery:true,
})
function getImages(uri) {
crawler.queue({
uri,
callback: (err, res, done) => {
if (err) throw err;
}
})
}
從現(xiàn)在我們將開始寫一個拿到html頁面的圖片的方法,crawler 實例化后,在其隊列中主要是為了寫入鏈接和回調(diào)方法。在每個請求處理完畢后將調(diào)這個回調(diào)函數(shù)。
這里還要說明一下, Crawler 使用了 request 庫,所以 Crawler 可供配置的參數(shù)列表是 request 庫的參數(shù)的超集,即 request 庫中所有的配置在 Crawler 中均適用。
元素捕獲
剛才或許你也看到了 jQuery 這個參數(shù),你猜的沒錯,它可以使用 jQuery 的語法去捕獲 DOM 元素的。
// index.js
let data = []
function getImages(uri) {
crawler.queue({
uri,
callback: (err, res, done) => {
if (err) throw err;
let $ = res.$;
try {
let $imgs = $("img");
Object.keys($imgs).forEach(index => {
let img = $imgs[index];
const { type, name, attribs = {} } = 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) // 下載圖片的方法
data.push(src)
}
});
} catch (e) {
console.error(e);
done()
}
done();
}
})
}可以看到剛才通過 $ 來完成對請求中 img 標(biāo)簽的捕獲。然后我們下面的邏輯去處理補(bǔ)全圖片的鏈接和剝離出名字為了后面可以保存取名用。這里還定義了一個數(shù)組,它的目的是保存已經(jīng)捕獲到的圖片地址,如果下次捕獲發(fā)現(xiàn)同一個圖片地址,那么就不再重復(fù)處理下載了。
以下是掘金首頁html用 $("img") 捕獲到的信息打?。?/strong>

下載圖片
下載之前我們還要安裝一個 nodejs 包—— axios ,是的你沒看錯,axios 不僅提供給前端,它也可以給后端去使用。但是因為下載圖片要把它處理成數(shù)據(jù)流,所以把 responseType 設(shè)置成 stream 。然后才可以用 pipe 方法保存數(shù)據(jù)流文件。
const { default: axios } = require("axios");
const fs = require('fs');
async function downloadFile(uri, name) {
let dir = "./imgs"
if (!fs.existsSync(dir)) {
await fs.mkdirSync(dir)
}
let filePath = `${dir}/${name}`
let res = await axios({
url: uri,
responseType: 'stream'
})
res.data.pipe(fs.createWriteStream(filePath))
}因為可能圖片很多,所以要統(tǒng)一放在一個文件夾下,就要判斷有沒有這個文件夾如果沒有就創(chuàng)建一個。然后通過 createWriteStream 方法來把獲取到的數(shù)據(jù)流以文件的形式保存到文件夾里面。
然后我們可以嘗試一下,比如我們捕獲用一下掘金首頁html下的圖片:
// index.js
getImages("https://juejin.cn/")
執(zhí)行后發(fā)現(xiàn)就可以發(fā)現(xiàn)已經(jīng)捕獲到靜態(tài)html里面的所有圖片了。
node index.js

結(jié)語
到了最后,你也可以看到,此代碼可能不適用于SPA(單頁面應(yīng)用)。由于單頁應(yīng)用程序中只有一個 HTML 文件,并且網(wǎng)頁上的所有內(nèi)容都是動態(tài)呈現(xiàn)的,但是萬變不離其宗,不管怎樣,你可以直接處理其數(shù)據(jù)請求,來收集到想要的信息也未嘗不可。
還有一點要說的是,很多小伙伴處理下載圖片的請求用到了 request.js ,當(dāng)然這樣可以的,甚至代碼量更少,但是,我想說的是這個庫在2020年的時候就已經(jīng)被棄用了,最好換一個一直在更新維護(hù)的庫比較好。

到此這篇關(guān)于如何利用Node.js做簡單的圖片爬取的文章就介紹到這了,更多相關(guān)Node.js圖片爬取內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用nodejs實現(xiàn)JSON文件自動轉(zhuǎn)Excel的工具(推薦)
這篇文章主要介紹了使用nodejs實現(xiàn),JSON文件自動轉(zhuǎn)Excel的工具,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-06-06
如何構(gòu)建一個?NodeJS?影院微服務(wù)并使用?Docker?部署
微服務(wù)是一個單獨的自包含單元,與其他許多單元一起構(gòu)成一個大型應(yīng)用程序,這篇文章主要介紹了如何構(gòu)建一個NodeJS影院微服務(wù)并使用Docker部署,在這個系列中,將構(gòu)建一個 NodeJS 微服務(wù),并使用 Docker Swarm 集群進(jìn)行部署,需要的朋友可以參考下2023-08-08
nodejs利用ajax實現(xiàn)網(wǎng)頁無刷新上傳圖片實例代碼
本篇文章主要介紹了nodejs利用ajax實現(xiàn)網(wǎng)頁無刷新上傳圖片實例代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-06-06
nodejs async異步常用函數(shù)總結(jié)(推薦)
這篇文章主要介紹了nodejs async異步常用函數(shù)總結(jié)的相關(guān)資料,需要的朋友可以參考下2017-11-11
如何刪除所有node_modules和package-lock配置文件
這篇文章主要介紹了如何刪除所有node_modules和package-lock配置文件問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-02-02
node.js中的buffer.Buffer.byteLength方法使用說明
這篇文章主要介紹了node.js中的buffer.Buffer.byteLength方法使用說明,本文介紹了buffer.Buffer.byteLength的方法說明、語法、接收參數(shù)、使用實例和實現(xiàn)源碼,需要的朋友可以參考下2014-12-12
npm?install的--save和--save-dev使用說明(推薦)
這篇文章主要介紹了npm?install的--save和--save-dev使用說明,文中給大家提到了各個命令的區(qū)別及各種安裝參數(shù)的區(qū)別,需要的朋友可以參考下2022-08-08

