nodejs學習筆記(1)——網絡爬蟲

不知不覺作nodejs開發已經將近一年多了,過程當中學了不少,也忘了不少,因此仍是堅持在博客裏面留下點內容,方便之後查看。node

本文主要實現一個簡單的網站爬蟲功能,抓取網站裏面的圖片以及內容。jquery

在抓取以前用到了superagent、cheerio、request、fs模塊。api

superagent和http用途實際上是差很少的,都是經過url模擬請求,爲了記錄一下用法,這裏兩個都用了;cheerio我我的理解就至關於一個服務端的jquery,能夠對響應的內容進行過濾,用法跟jquery同樣;fs模塊是nodejs裏面的文件操做模塊。網絡

以爬取360網站爲例:dom

 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 })

 

以上爲我的學習記錄,只是一個學習的知識點分享,若是不對之處,請留言指出。學習

相關文章
相關標籤/搜索