不知不覺做nodejs開發已經將近一年多了,過程中學了很多,也忘了很多,所以還是堅持在博客裡面留下點內容,方便以後查看。 本文主要實現一個簡單的網站爬蟲功能,抓取網站裡面的圖片以及內容。 在抓取之前用到了superagent、cheerio、request、fs模塊。 superagent和http ...
不知不覺做nodejs開發已經將近一年多了,過程中學了很多,也忘了很多,所以還是堅持在博客裡面留下點內容,方便以後查看。
本文主要實現一個簡單的網站爬蟲功能,抓取網站裡面的圖片以及內容。
在抓取之前用到了superagent、cheerio、request、fs模塊。
superagent和http用途其實是差不多的,都是通過url模擬請求,為了記錄一下用法,這裡兩個都用了;cheerio我個人理解就相當於一個服務端的jquery,可以對響應的內容進行過濾,用法跟jquery一樣;fs模塊是nodejs裡面的文件操作模塊。
以爬取360網站為例:
1 /** 2 * 網路爬蟲 3 */ 4 5 let sup = require("superagent"); 6 let cheer = require("cheerio"); 7 let request = require("request"); 8 let fs = require("fs"); 9 const domain = "www.360.com"; 10 const url = "https://" + domain + "/"; 11 sup.get(url).end(function (err, res, body) { 12 if (err) { 13 console.log(err); 14 } else { 15 console.log('----------------------'); 16 //找出頁面響應的文本內容 17 let $ = cheer.load(res.text); 18 //通過cheerio過濾內容 用法與jquery一樣 如:找出裡面所有的圖片 19 let rst = $("img"); 20 rst.each(function (idx, item) { 21 //這裡request.get的encoding一定要設置為null,api文檔有說明,為null的時候響應文本會返回一個buffer 22 let imgUrl = ((item.attribs.src.includes(('http://', 'https://'))) ? url : 'http:') + item.attribs.src;
23 console.log('********************', imgUrl);
24 request.get({ url: imgUrl, encoding: null }, function (error, response, body) { 25 if (error) { 26 console.error(error); 27 } else { 28 //持續下載數據 29 let dir = domain + "/" + item.attribs.src.replace('//', ''); 30 let path = dir.split('/'); 31 //去掉最後的文件名部分 32 path.pop(); 33 if (fs.existsSync(path.join('/')) == false) { 34 //迴圈創建文件夾 35 var dirInfo = ""; 36 for (var i = 0; i < path.length; i++) { 37 dirInfo += path[i] + "/" 38 if (fs.existsSync(dirInfo) == false && dirInfo != '') 39 fs.mkdirSync(dirInfo); 40 } 41 } 42 //把body的的string轉為object寫入到文件 43 fs.writeFile(dir, body, (err) => { 44 console.log('----------------', err); 45 }) 46 } 47 }) 48 }) 49 } 50 })
以上為個人學習記錄,只是一個學習的知識點分享,如果不對之處,請留言指出。