前文提到,nodejs可以做很多東西。但是,我一直覺得,nodejs是不合適去寫網站的,至少現在不合適。所以,在這裏我介紹怎麼用nodejs去做一個簡單的爬蟲。
接下來我要實現的爬蟲的功能:訪問一個url,然後獲取裏面需要的信息。
準備條件:安裝好nodejs的環境,(建議在linux上學習,因爲windows上面,很多第三方庫都不支持,常常安裝失敗。)
預備知識:用nodejs寫過helloworld的demo。
(我的筆記本常常出問題,所以現在我的教程只能基於windows的環境 &&nodejs.version = v.0.10.10 , 不過代碼在linux下一樣照樣可以正常運行)
第一步:按照 Infoq上面的田永強叔叔的建議,我習慣採用如下的目錄結構,所以,大家新建一個這樣的目錄結構:
├── Makefile // 構建文件,通常用於啓動單元測試運行等操作
├── app.js // 應用文件
├── automation // 自動化測試目錄
├── bin // 存放啓動應用相關腳本的目錄
├── conf // 配置文件目錄
├── controllers // 控制層目錄
├── helpers // 幫助類庫
├── middlewares // 自定義中間件目錄
├── models // 數據層目錄
├── node_modules // 第三方模塊目錄
├── package.json // 項目包描述文件
├── public // 靜態文件目錄
│ ├── images // 圖片目錄
│ ├── libs // 第三方前端JavaScript庫目錄
│ ├── scripts // 前端JavaScript腳本目錄
│ └── styles // 樣式表目錄
├── test // 單元測試目錄
└── views // 視圖層目錄
第二步:在你的package.json敲下:
{
"name": "simple_spider",
"version": "0.0.1",
"scripts": {
"start": "node app.js"
},
"dependencies": {
"jQuery" :"*",
"jsdom" : "https://github.com/tmpvar/jsdom/tarball/4cf155a1624b3fb54b2eec536a0c060ec1bab4ab",
"xmlhttprequest" : "*",
"request" : "*",
"htmlparser" : "*"
}
}
這個配置文件,主要是用來解決nodejs中的包依賴關係,就像linux系統中各種包管理器來安裝軟件一樣。
name = 應用的名字 ; version = 應用的版本 ;
dependencies = 依賴關係主要在這裏聲明。例如上面的配置文件,就說明了本應用需要:jQuery包(與前端的jquery庫不是一個東西,但功能差不多。jsdom , xmlhttprequest,request,htmlparser這四個東西,都是jQuery需要的依賴包)。
這裏我需要特別說明一下,在linux下,如果你需要使用jQuery這個nodejs庫的話,你是不需要配置jsdom,xmlhttprequest ,,,這四個東西的。但是,我的環境是windows,所以,對nodejs的依賴不是很好。所以,我要手動自行配置好jQuery的關係。所以,你是linux用戶的話,可以直接這樣配置:
{
"name": "simple_spider",
"version": "0.0.1",
"scripts": {
"start": "node app.js"
},
"dependencies": {
"jQuery" :"*"
}
}
第三步:打開命令行,跳轉到當前目錄,輸入:npm install -d
然後五顏六色的東西開始不停地跑。這就說明,我們已經開始下載應用所需要的依賴包了。(依賴關係由上面的dependencies給出。)
這個命令表示只安裝應用裏缺少的依賴包到本地目錄(不會全局污染)。
安裝完畢,你的目錄下面的node_modules就會多幾個文件,如下圖所示:
等它安裝完畢,就進入第四步。
第四步:在app.js輸入如下內容:
var http = require('http'),
$ = require('jQuery');
var options = {
host: 'www.google.com.hk',
port: 80,
path: '/',
method: 'GET'
};
var req = http.get(options, function(res){
var pageData = '';
res.setEncoding('utf8');
res.on('data', function(chunk){
pageData += chunk;
});
res.on('end', function(){
var dom = $(pageData);
var elList = dom.find('#addlang a');
console.log(elList.eq(1).text());
});
});
上面的代碼就實現了非常簡單的網絡爬蟲。
第五步:在終端窗口運行node app.js
你會看到 "English" 的結果輸出。
過程:
1:http句柄發出get請求,請求google.hk的網頁內容,然後內容存在pageData這個變量裏面。
2:我們在用jQuery去分析,獲取我們需要的內容,再打印出來。(如果你覺得內容很重要,你也可以入庫保存。)
這樣,簡單的網絡爬蟲就完成了。