最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

如何利用Node.js做簡(jiǎn)單的圖片爬取

 更新時(shí)間:2022年06月27日 08:42:52   作者:??jsmask????  
這篇文章主要介紹了如何利用Node.js做簡(jiǎn)單的圖片爬取,爬蟲的主要目的是收集互聯(lián)網(wǎng)上公開(kāi)的一些特定數(shù)據(jù),本文介紹用于網(wǎng)絡(luò)抓取的node.js包,完成一個(gè)簡(jiǎn)單的爬蟲案例來(lái)爬取網(wǎng)頁(yè)上圖片并下載到本地

介紹

爬蟲的主要目的是收集互聯(lián)網(wǎng)上公開(kāi)的一些特定數(shù)據(jù)。利用這些數(shù)據(jù)我們可以能進(jìn)行分析一些趨勢(shì)對(duì)比,或者訓(xùn)練模型做深度學(xué)習(xí)等等。本期我們就將介紹一個(gè)專門用于網(wǎng)絡(luò)抓取的 node.js 包—— node-crawler ,并且我們將用它完成一個(gè)簡(jiǎn)單的爬蟲案例來(lái)爬取網(wǎng)頁(yè)上圖片并下載到本地。

node-crawler 是一個(gè)輕量級(jí)的 node.js 爬蟲工具,兼顧了高效與便利性,支持分布式爬蟲系統(tǒng),支持硬編碼,支持http前級(jí)代理。而且,它完全是由 nodejs 寫成,天生支持非阻塞異步IO,為爬蟲的流水線作業(yè)機(jī)制提供了極大便利。同時(shí)支持對(duì) DOM 的快速選擇(可以使用 jQuery 語(yǔ)法),對(duì)于抓取網(wǎng)頁(yè)的特定部分的任務(wù)可以說(shuō)是殺手級(jí)功能,無(wú)需再手寫正則表達(dá)式,提高爬蟲開(kāi)發(fā)效率。

安裝引入

我們先新建一個(gè)項(xiàng)目,在里面創(chuàng)建index.js作為入口文件。

然后進(jìn)行爬蟲庫(kù) node-crawler 的安裝。

# PNPM
pnpm add crawler
# NPM
npm i -S crawler
# Yarn 
yarn add crawler

然后用過(guò) require 引入進(jìn)去。

// index.js
const Crawler = require("crawler");

創(chuàng)建實(shí)例

// 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)在我們將開(kāi)始寫一個(gè)拿到html頁(yè)面的圖片的方法,crawler 實(shí)例化后,在其隊(duì)列中主要是為了寫入鏈接和回調(diào)方法。在每個(gè)請(qǐng)求處理完畢后將調(diào)這個(gè)回調(diào)函數(shù)。

這里還要說(shuō)明一下, Crawler 使用了 request 庫(kù),所以 Crawler 可供配置的參數(shù)列表是 request 庫(kù)的參數(shù)的超集,即 request 庫(kù)中所有的配置在 Crawler 中均適用。

元素捕獲

剛才或許你也看到了 jQuery 這個(gè)參數(shù),你猜的沒(méi)錯(cuò),它可以使用 jQuery 的語(yǔ)法去捕獲 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();
        }
    })
}

可以看到剛才通過(guò) $ 來(lái)完成對(duì)請(qǐng)求中 img 標(biāo)簽的捕獲。然后我們下面的邏輯去處理補(bǔ)全圖片的鏈接和剝離出名字為了后面可以保存取名用。這里還定義了一個(gè)數(shù)組,它的目的是保存已經(jīng)捕獲到的圖片地址,如果下次捕獲發(fā)現(xiàn)同一個(gè)圖片地址,那么就不再重復(fù)處理下載了。

以下是掘金首頁(yè)html用 $("img") 捕獲到的信息打印:

下載圖片

下載之前我們還要安裝一個(gè) nodejs 包—— axios ,是的你沒(méi)看錯(cuò),axios 不僅提供給前端,它也可以給后端去使用。但是因?yàn)橄螺d圖片要把它處理成數(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))
}

因?yàn)榭赡軋D片很多,所以要統(tǒng)一放在一個(gè)文件夾下,就要判斷有沒(méi)有這個(gè)文件夾如果沒(méi)有就創(chuàng)建一個(gè)。然后通過(guò) createWriteStream 方法來(lái)把獲取到的數(shù)據(jù)流以文件的形式保存到文件夾里面。

然后我們可以嘗試一下,比如我們捕獲用一下掘金首頁(yè)html下的圖片:

// index.js
getImages("https://juejin.cn/")

執(zhí)行后發(fā)現(xiàn)就可以發(fā)現(xiàn)已經(jīng)捕獲到靜態(tài)html里面的所有圖片了。

node index.js

結(jié)語(yǔ)

到了最后,你也可以看到,此代碼可能不適用于SPA(單頁(yè)面應(yīng)用)。由于單頁(yè)應(yīng)用程序中只有一個(gè) HTML 文件,并且網(wǎng)頁(yè)上的所有內(nèi)容都是動(dòng)態(tài)呈現(xiàn)的,但是萬(wàn)變不離其宗,不管怎樣,你可以直接處理其數(shù)據(jù)請(qǐng)求,來(lái)收集到想要的信息也未嘗不可。

還有一點(diǎn)要說(shuō)的是,很多小伙伴處理下載圖片的請(qǐng)求用到了 request.js ,當(dāng)然這樣可以的,甚至代碼量更少,但是,我想說(shuō)的是這個(gè)庫(kù)在2020年的時(shí)候就已經(jīng)被棄用了,最好換一個(gè)一直在更新維護(hù)的庫(kù)比較好。

到此這篇關(guān)于如何利用Node.js做簡(jiǎn)單的圖片爬取的文章就介紹到這了,更多相關(guān)Node.js圖片爬取內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • npm報(bào)錯(cuò):npm?WARN?config?global?'--global',?'--local'?are?deprecated解決

    npm報(bào)錯(cuò):npm?WARN?config?global?'--global',?&apo

    這篇文章主要給大家介紹了關(guān)于npm報(bào)錯(cuò):npm?WARN?config?global?'--global',?'--local'?are?deprecated.?Use?`--location=global`?instead.的解決方法,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-08-08
  • nodejs前端模板引擎swig入門詳解

    nodejs前端模板引擎swig入門詳解

    這篇文章主要介紹了nodejs前端模板引擎swig入門詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05
  • 詳解koa2學(xué)習(xí)中使用 async 、await、promise解決異步的問(wèn)題

    詳解koa2學(xué)習(xí)中使用 async 、await、promise解決異步的問(wèn)題

    這篇文章主要介紹了詳解koa2學(xué)習(xí)中使用 async 、await、promise解決異步的問(wèn)題,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-11-11
  • node連接redis的方法實(shí)現(xiàn)

    node連接redis的方法實(shí)現(xiàn)

    本文主要介紹了node連接redis的方法實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • Nodejs實(shí)現(xiàn)的一個(gè)簡(jiǎn)單udp廣播服務(wù)器、客戶端

    Nodejs實(shí)現(xiàn)的一個(gè)簡(jiǎn)單udp廣播服務(wù)器、客戶端

    這篇文章主要介紹了Nodejs實(shí)現(xiàn)的一個(gè)簡(jiǎn)單udp廣播服務(wù)器、客戶端,本文直接給出實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2014-09-09
  • Node.js 中 http 模塊的深度剖析與實(shí)戰(zhàn)應(yīng)用小結(jié)

    Node.js 中 http 模塊的深度剖析與實(shí)戰(zhàn)應(yīng)用小結(jié)

    本文詳細(xì)介紹了Node.js中的http模塊,從創(chuàng)建HTTP服務(wù)器、處理請(qǐng)求與響應(yīng),到獲取請(qǐng)求參數(shù),每個(gè)環(huán)節(jié)都通過(guò)代碼示例進(jìn)行解析,旨在幫助開(kāi)發(fā)者熟練掌握http模塊,構(gòu)建高效的網(wǎng)絡(luò)應(yīng)用,感興趣的朋友一起看看吧
    2025-01-01
  • Node.js常用三大模塊之path模塊

    Node.js常用三大模塊之path模塊

    在node.js中常用的三大模塊中還有一個(gè)是path模塊,主要是為了便利用戶處理路徑問(wèn)題,如果我們?cè)谝胛募臅r(shí)候經(jīng)常會(huì)受到../和./的干擾,那么這個(gè)path模塊將會(huì)很好的幫助你
    2022-09-09
  • node.js中使用Export和Import的方法

    node.js中使用Export和Import的方法

    這篇文章主要介紹了node.js中使用Export和Import的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-09-09
  • 如何用Node.js編寫內(nèi)存效率高的應(yīng)用程序

    如何用Node.js編寫內(nèi)存效率高的應(yīng)用程序

    這篇文章主要介紹了如何用Node.js編寫內(nèi)存效率高的應(yīng)用程序,對(duì)Node.js感興趣的同學(xué),可以參考下
    2021-04-04
  • 使用nvm切換node版本的實(shí)現(xiàn)方法

    使用nvm切換node版本的實(shí)現(xiàn)方法

    我們?cè)诠ぷ髦锌赡軙?huì)碰到這樣的情況:一個(gè)人要負(fù)責(zé)多個(gè)項(xiàng)目的維護(hù),而項(xiàng)目中的插件又各有不同,插件下載所需的node版本可能也不同,所以只有一個(gè)node版本是無(wú)法滿足工作需求的,所以就有了nvm,volta等node版本管理工具,在本節(jié)將介紹nvm的使用方法
    2023-10-10

最新評(píng)論

平果县| 探索| 大英县| 鞍山市| 西华县| 丘北县| 沙坪坝区| 灌南县| 石渠县| 乌拉特中旗| 洪雅县| 余庆县| 宜兰县| 股票| 肇源县| 香河县| 青川县| 南川市| 太湖县| 拉萨市| 鸡西市| 县级市| 仁布县| 西峡县| 五峰| 辽阳县| 临夏市| 巴林右旗| 淮北市| 治县。| 孝义市| 巴里| 抚远县| 吕梁市| 湟源县| 同德县| 赤峰市| 雅江县| 小金县| 曲松县| 田林县|