NodeJS寫個爬蟲

所謂爬蟲,能夠簡單理解爲利用程序操做文件,只是這些文件不在本地,須要咱們拉取過來。html

一. 爬蟲代碼解析

1. 拿到目標頁碼源碼

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

2. 正則提取目標內容

先看下咱們要抓取的內容:git

clipboard.png

因爲沒有使用其餘庫,咱們沒辦法像操做 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
}];

3. 數據的過濾

上面雖然拿到了內容,不過咱們須要的是純文本,其餘標籤什麼的得過濾掉,excerpt 中包含了一些標籤:

var excerpt = excerpt.replace(/(<.*?>)((.*?)(<.*?>))?/g, "$3");

雖然說文章中有不少代碼,有些標籤是不該該刪除的,不過這裏是摘要內容,這些內容的標籤都刪除掉,方便咱們儲存。而後把長度處理下:

excerpt = excerpt.slice(0, 120);

4. 存到數據庫(或者文件)

我這裏是把文件儲存到文件之中,存放格式爲:

[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

相關文章
相關標籤/搜索