所謂爬蟲,能夠簡單理解爲利用程序操做文件,只是這些文件不在本地,須要咱們拉取過來。html
Node 提供了不少接口來獲取遠程地址代碼,就拿 AlloyTeam 的頁面舉例吧,把他首頁幾篇文章的信息爬取過來。由於 AlloyTeam 使用的協議是 http:// ,本文就不介紹 Node 中 https:// 的使用了。node
var http = require("http"); var url = "http://www.alloyteam.com/"; var data = ""; // 建立一個請求 var req = http.request(url, function(res){ // 設置顯示編碼 res.setEncoding("utf8"); // 數據是 chunked 發送,意思就是一段一段發送過來的 // 咱們使用 data 給他們串接起來 res.on('data', function(chunk){ data += chunk; }); // 響應完畢時間出發,輸出 data res.on('end', function(){ // dealData(data); console.log(data); }); }); // 發送請求 req.end();
上面短短七八行代碼,就拿到了 AlloyTeam 首頁的代碼,真的十分簡單,若是是 https:// 就得引用 https 模塊咯,都是差很少的。jquery
先看下咱們要抓取的內容:git
因爲沒有使用其餘庫,咱們沒辦法像操做 DOM 同樣獲取目標內容,不過寫正則也挺簡單的,好比咱們要 獲取標題/文章連接/摘要 這些內容,正則表達式爲:github
// function dealData var reg = /<ul\s+class="articlemenu">\s+<li>\s+<a[^>]*>.*?<\/a>\s+<a href="(.*?)"[^>]*>(.*?)<\/a>[\s\S]*?<div\s+class="text">([\s\S]*?)<\/div>/g; var res = []; while(match = reg.exec(data)) { res.push({ "url": match[1], "title": match[2], "excerpt": match[3] }); }
這裏的正則看起來有點晦澀,不過呢,正則在編程中十分基礎的東西,若是沒有太多的瞭解,建議先去搞清楚,這裏就不細說啦。這裏要強調的一點是:正則表達式
reg.exec(data);
若是隻寫上面這句話,只會拿到第一個匹配結果,因此須要使用 while 循環來處理,沒處理一次,正則匹配的位置就會日後推一下。其實上面這條語句執行後返回的是一個對象,其中包含一個 index 屬性,具體能夠查閱 JavaScript 正則的內容。數據庫
這裏返回(res)的數據格式是:npm
<編程
pre class="prettyprint linenums">api
[{ "url: url, "title": title, "excerpt" excerpt }];
上面雖然拿到了內容,不過咱們須要的是純文本,其餘標籤什麼的得過濾掉,excerpt 中包含了一些標籤:
var excerpt = excerpt.replace(/(<.*?>)((.*?)(<.*?>))?/g, "$3");
雖然說文章中有不少代碼,有些標籤是不該該刪除的,不過這裏是摘要內容,這些內容的標籤都刪除掉,方便咱們儲存。而後把長度處理下:
excerpt = excerpt.slice(0, 120);
我這裏是把文件儲存到文件之中,存放格式爲:
[title](url) > excerpt
哈哈,很熟熟悉吧,markdown 語法,看起來也比較清晰。
var str = ""; for(var i = 0, len = data.length; i < len; i++){ str += "[" + data[i].title + "](" + data[i].url + ")\n" + data[i].excerpt.replace("\n\s*\n?", ">\n") + "\n\n"; }
先拼接數據,而後寫入到文件:
fs.writeFile('index.md', str, function (err) { if (err) throw err; console.log('數據已保存~'); });
大功告成,過程實際上是很簡單的。拿到的內容:
![圖片上傳中...]
若是對正則不太熟悉,上面的工做是不太好完成的,不少開發者爲 Node 提供了工具庫,使用 npm 能夠安裝,若是不習慣正則,使用一些工具包輔助處理,能夠把拿到的數據看成 DOM 來解析。
我瞭解到的有一個叫作 node-jquery 的庫貌似還不錯,具體請讀者本身去網上搜吧,應該挺多的。
(收藏學習一下)
做者:Barret Lee
出處:http://barretlee.github.io/spider-with-node