準備用cheerio去抓一些網頁看看。html
能夠參考的材料有:node
http://www.cnblogs.com/CraryPrimitiveMan/p/3674421.htmlgit
http://cnodejs.org/topic/5203a71844e76d216a727d2egithub
首先打開WebStorm,新建一個空項目,名爲HelloWorld,而後在主目錄新建一個HelloWorld.js,內容npm
console.log("Hello World");數組
而後直接Run,命令行會自動調用node命令來運行:curl
/usr/local/bin/node /Users/baidu/Documents/Data/Work/Code/Self/nodejs/helloworld/HelloWorld.js Hello World! Process finished with exit code 0
主要是看這個url上面的例子:函數
http://www.cnblogs.com/CraryPrimitiveMan/p/3674421.htmlui
先安裝一下cheeriourl
npm install cheerio
先寫了個curl.js,代碼以下:
/** * Created by baidu on 16/10/17. */ var http = require("http"); function download(url, callback) { var data = ''; http.get(url, function(res) { res.on('data', function(chunk) { data += chunk; }); res.on('end', function () { callback(data); }); }).on('error', function () { callback('error'); }) } exports.download = download;
而後主程序HelloWorld.js中引用該函數:
/** * Created by baidu on 16/10/17. */ console.log("Hello World"); var cheerio = require('cheerio'); var curl = require('./curl'); var iconv = require('iconv-lite'); var url = 'http://open.163.com/special/opencourse/englishs1.html'; curl.download(url, function (data) { if (data) { var $ = cheerio.load(data); $('a.downbtn').each(function (i, e) { var str = $(e).attr('data-name'); console.log(str); }); console.log('done'); } else { console.log('error'); } });
可是結果都是亂碼。。
上網查發現須要使用 iconv-lite 包,在引入這個包以後:
var str = $(e).attr('data-name');
str = iconv.decode(str, 'gbk');
發現報錯,而且提示查閱:
https://github.com/ashtuchkin/iconv-lite/wiki/Use-Buffers-when-decoding
原來是在 data += chunk的時候,已經發生的默認針對utf-8的轉碼,使得文字的碼發生了混亂。
按照上文中給出的例子,使用chunks數組存數組,而後使用Buffer.concat合併數組的內容。修改了以上兩個文件的代碼,curl.js:
/** * Created by baidu on 16/10/17. */ var http = require("http"); function download(url, callback) { var chunks = []; http.get(url, function(res) { res.on('data', function(chunk) { chunks.push(chunk); }); res.on('end', function () { callback(chunks); }); }).on('error', function () { callback(chunks); }) } exports.download = download;
HelloWorld.js:
/** * Created by baidu on 16/10/17. */ console.log("Hello World"); var cheerio = require('cheerio'); var curl = require('./curl'); var iconv = require('iconv-lite'); var url = 'http://open.163.com/special/opencourse/englishs1.html'; curl.download(url, function (chunks) { if (chunks) { var data = iconv.decode(Buffer.concat(chunks), 'gbk'); var $ = cheerio.load(data); $('a.downbtn').each(function (i, e) { var str = $(e).attr('data-name'); console.log(str); }); console.log('done'); } else { console.log('error'); } });
而後運行,獲得以下結果:
/usr/local/bin/node /Users/baidu/Documents/Data/Work/Code/Self/nodejs/helloworld/HelloWorld.js Hello World 新西蘭國立南方理工學院公開課:英語強化課程I > be動詞、冠詞、指示代詞、情態動詞、通常如今時 新西蘭國立南方理工學院公開課:英語強化課程I > 可數名詞、不可數名詞、不定代詞、形容詞比較級、最高級、通常過去時、如今進行時 新西蘭國立南方理工學院公開課:英語強化課程I > 形態動詞、疑問詞、經常使用的時間短語 新西蘭國立南方理工學院公開課:英語強化課程I > 如何詢問價格和質量、疑問句詞序、人稱代詞如何配搭動詞、不一樣時態中的時間短語 新西蘭國立南方理工學院公開課:英語強化課程I > 過去式中動詞的用法、如何使用定冠詞 新西蘭國立南方理工學院公開課:英語強化課程I > 動名詞、通常如今時與通常過去時中的被動語態、過去完成時、虛擬條件句 新西蘭國立南方理工學院公開課:英語強化課程I > 四種形態的助動詞、通常如今時、如今進行時、規則動詞與不規則動詞、如今完成時、如今完成進行時 新西蘭國立南方理工學院公開課:英語強化課程I > 未來時、未來時從句、特殊形容詞、主動句與被動句、禮貌請求用語 新西蘭國立南方理工學院公開課:英語強化課程I > 預測、過去完成時、間接引語、義務和許可、虛擬語氣 新西蘭國立南方理工學院公開課:英語強化課程I > 各類動詞形式、助動詞、名詞後綴、形容詞後綴、單詞前綴、陳述句、如今進行時 新西蘭國立南方理工學院公開課:英語強化課程I > be動詞、冠詞、指示代詞、情態動詞、通常如今時 新西蘭國立南方理工學院公開課:英語強化課程I > 可數名詞、不可數名詞、不定代詞、形容詞比較級、最高級、通常過去時、如今進行時 新西蘭國立南方理工學院公開課:英語強化課程I > 形態動詞、疑問詞、經常使用的時間短語 新西蘭國立南方理工學院公開課:英語強化課程I > 如何詢問價格和質量、疑問句詞序、人稱代詞如何配搭動詞、不一樣時態中的時間短語 新西蘭國立南方理工學院公開課:英語強化課程I > 過去式中動詞的用法、如何使用定冠詞 新西蘭國立南方理工學院公開課:英語強化課程I > 動名詞、通常如今時與通常過去時中的被動語態、過去完成時、虛擬條件句 新西蘭國立南方理工學院公開課:英語強化課程I > 四種形態的助動詞、通常如今時、如今進行時、規則動詞與不規則動詞、如今完成時、如今完成進行時 新西蘭國立南方理工學院公開課:英語強化課程I > 未來時、未來時從句、特殊形容詞、主動句與被動句、禮貌請求用語 新西蘭國立南方理工學院公開課:英語強化課程I > 預測、過去完成時、間接引語、義務和許可、虛擬語氣 新西蘭國立南方理工學院公開課:英語強化課程I > 各類動詞形式、助動詞、名詞後綴、形容詞後綴、單詞前綴、陳述句、如今進行時 新西蘭國立南方理工學院公開課:英語強化課程I > 複習四種時態、通常如今時、完成時、冠詞、關係代詞、量詞、動名詞、不定式、連詞 新西蘭國立南方理工學院公開課:英語強化課程I > 情態動詞及其過去式、未來時、未來進行時、未來完成時、虛擬語氣及其過去式、間接引語 done Process finished with exit code 0