【nodejs】 用node內(nèi)置模塊實現(xiàn)簡單 爬蟲(http理朋、fs)

我對爬蟲有一點點執(zhí)念絮识,想著非要自己上手寫一個試試。在看到 http的get方法的時候 感覺像是看到了希望嗽上。于是就只使用get方法次舌,加一個 fs的保存文件的方法,來實現(xiàn)一個簡單的爬蟲兽愤。

http get方法簡介

首先讓我們來看一下 get方法的書寫格式:

const http = require('http');

http.get(url, function(res){

     // data method 
    res.on('data', function(data){
        console.log(data);
        console.log('傳輸數(shù)據(jù)中....')
    });
    
    // end method
    res.on('end', function(){
        console.log('數(shù)據(jù)傳輸完畢');
    })
}).on('error', function(err){
    console.log('報錯了')
})

此方法首先接收一個 url的地址作為訪問參數(shù)彼念, 第二個參數(shù)則為一個回調(diào)函數(shù)。 此回調(diào)函數(shù) 接收一個 對象 浅萧,這個對象中會有兩個方法 逐沙,分別是 dataend。 我們可以通過 on的形式 對 這兩個方法進行 監(jiān)聽洼畅。當 被請求的網(wǎng)頁數(shù)據(jù)量很大時吩案,此data會被 觸發(fā)幾次, 每次都會返回一個數(shù)據(jù)片段土思。 數(shù)據(jù)片段之和就是整個網(wǎng)頁了务热。
但是在這里需要注意的是, data默認返回的 是Buffer類己儒。如果要轉(zhuǎn)成 字符串的話崎岂, 需要調(diào)用 buffer.toString('utf8')方法。 當然這里的參數(shù)亦可以是 進制數(shù)闪湾。我們也可以在 data監(jiān)聽函數(shù)上進行 設(shè)置

res.on('data', 'utf8', function(res){
    console.log(res);  // string
})

在請求地址的過程中冲甘,如果出現(xiàn)錯誤的話, 就會返回一個錯誤給error方法途样。 所以有必要時江醇,可以在error回調(diào)中寫一些 失敗的邏輯。

保存一張網(wǎng)圖

const http = require('http');
const fs = require('fs');

let img = 'http://dpic.tiankong.com/r3/w8/QJ6871380245.jpg';

http.get(img, function(res){
    let arr = [];
    res.on('data', function(data){
        arr.push(data);
        
    })

    res.on('end', function(){
        buf = Buffer.concat(arr);

        fs.writeFileSync('./4.jpg', buf);

        console.log('end....')
    })
})

爬取整個網(wǎng)頁的圖片

其實 想要獲取整個頁面的圖片很簡單

  • 通過get請求獲取整個網(wǎng)頁的buffer數(shù)據(jù)何暇,并轉(zhuǎn)成字符串拼接
  • 利用cheerio模塊中的 語法實現(xiàn) 對 html字符串進行jq操作
  • jq操作 提取出所有img標簽上的 src地址
  • 再調(diào)用一次get方法請求每個圖片地址陶夜,獲取圖片的buffer數(shù)據(jù)
  • 將buffer數(shù)據(jù)存到arr中, 并 通過Buffer.concat(arr)的方法將 arr轉(zhuǎn)成一個Buffer對象
  • 通過fs.writeFileSync 保存 buffer對象為一張圖片即可

以下展示代碼

let https = require('https');
let http = require('http');
let cheerio = require('cheerio'); // html字符串版的 jq
let fs = require('fs');

let url = 'https://www.quanjing.com/creative/topic/1';


https.get(url , function(res){  
    
    var str = '';

    res.on('data', function(data){
       
        str+= data.toString('utf8');
        
    })

    res.on('end', function(){

        let $ = cheerio.load(str);

        addImg($);

        console.log('傳輸完畢');
    })
}).on('error', function(err){
    console.log(err);
})



function addImg($){

    $('img').each(function(index, ele){
        let src = $(ele).attr('src');
        
       if(index > 3){

          saveImg(src, index);
        }
    })
}

function saveImg(url,index){

    http.get(url,function(res){
            let arr = [];
            res.on('data', function(data){
                arr.push(data);
                
            })
        
            res.on('end', function(){
                let buf = Buffer.concat(arr);
                
                fs.writeFileSync('./img/'+(index+1)+'.jpg', buf);
                console.log('圖片保存成功')
            })
        })
}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末裆站,一起剝皮案震驚了整個濱河市条辟,隨后出現(xiàn)的幾起案子黔夭,更是在濱河造成了極大的恐慌,老刑警劉巖羽嫡,帶你破解...
    沈念sama閱讀 222,378評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件本姥,死亡現(xiàn)場離奇詭異,居然都是意外死亡杭棵,警方通過查閱死者的電腦和手機婚惫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來魂爪,“玉大人先舷,你說我怎么就攤上這事∽沂蹋” “怎么了密浑?”我有些...
    開封第一講書人閱讀 168,983評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長粗井。 經(jīng)常有香客問我,道長街图,這世上最難降的妖魔是什么浇衬? 我笑而不...
    開封第一講書人閱讀 59,938評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮餐济,結(jié)果婚禮上耘擂,老公的妹妹穿的比我還像新娘。我一直安慰自己絮姆,他們只是感情好醉冤,可當我...
    茶點故事閱讀 68,955評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著篙悯,像睡著了一般蚁阳。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上鸽照,一...
    開封第一講書人閱讀 52,549評論 1 312
  • 那天螺捐,我揣著相機與錄音,去河邊找鬼矮燎。 笑死定血,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的诞外。 我是一名探鬼主播澜沟,決...
    沈念sama閱讀 41,063評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼峡谊!你這毒婦竟也來了茫虽?” 一聲冷哼從身側(cè)響起刊苍,我...
    開封第一講書人閱讀 39,991評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎席噩,沒想到半個月后班缰,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,522評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡悼枢,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,604評論 3 342
  • 正文 我和宋清朗相戀三年埠忘,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片馒索。...
    茶點故事閱讀 40,742評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡莹妒,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出绰上,到底是詐尸還是另有隱情旨怠,我是刑警寧澤,帶...
    沈念sama閱讀 36,413評論 5 351
  • 正文 年R本政府宣布蜈块,位于F島的核電站鉴腻,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏百揭。R本人自食惡果不足惜爽哎,卻給世界環(huán)境...
    茶點故事閱讀 42,094評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望器一。 院中可真熱鬧课锌,春花似錦、人聲如沸祈秕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,572評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽请毛。三九已至志鞍,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間方仿,已是汗流浹背述雾。 一陣腳步聲響...
    開封第一講書人閱讀 33,671評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留兼丰,地道東北人玻孟。 一個月前我還...
    沈念sama閱讀 49,159評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像鳍征,于是被迫代替她去往敵國和親黍翎。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,747評論 2 361

推薦閱讀更多精彩內(nèi)容