基于node.js制作簡(jiǎn)單爬蟲(chóng)教程
前言:最近想學(xué)習(xí)node.js,突然在網(wǎng)上看到基于node的爬蟲(chóng)制作教程,所以簡(jiǎn)單學(xué)習(xí)了一下,把這篇文章分享給同樣初學(xué)node.js的朋友。
目標(biāo):爬取 http://tweixin.yueyishujia.com/webapp/build/html/ 網(wǎng)站的所有門(mén)店發(fā)型師的基本信息。
思路:訪問(wèn)上述網(wǎng)站,通過(guò)chrome瀏覽器的network對(duì)網(wǎng)頁(yè)內(nèi)容分析,找到獲取各個(gè)門(mén)店發(fā)型師的接口,對(duì)參數(shù)及返回?cái)?shù)據(jù)進(jìn)行分析,遍歷所有門(mén)店的所有發(fā)型師,直到遍歷完畢,同事將信息存儲(chǔ)到本地。
步驟一:安裝node.js
下載并安裝node,此步驟比較簡(jiǎn)單就不詳細(xì)解釋了,有問(wèn)題的可以直接問(wèn)一下度娘。
步驟二:建立工程
1)打開(kāi)dos命令條,cd進(jìn)入想要?jiǎng)?chuàng)建項(xiàng)目的路徑(我將此項(xiàng)目直接放在了E盤(pán),以下皆以此路徑為例);
2)mkdir node (創(chuàng)建一個(gè)文件夾用來(lái)存放項(xiàng)目,我這里取名為node);
3)cd 進(jìn)入名為node的文件夾,并執(zhí)行npm init初始化工程(期間會(huì)讓填寫(xiě)一些信息,我是直接回車的);
步驟三:創(chuàng)建爬取到的數(shù)據(jù)存放的文件夾
1)創(chuàng)建data文件夾用來(lái)存放發(fā)型師基本信息;
2)創(chuàng)建image文件夾用來(lái)存儲(chǔ)發(fā)型師頭像圖片;
此時(shí)工程下文件如下:

步驟四:安裝第三方依賴包(fs是內(nèi)置模塊,不需要單獨(dú)安裝)
1)npm install cheerio –save
2)npm install superagent –save
3)npm install async –save
4)npm install request –save
分別簡(jiǎn)單解釋一下上面安裝的依賴包:
cheerio:是nodejs的抓取頁(yè)面模塊,為服務(wù)器特別定制的,快速、靈活、實(shí)施的jQuery核心實(shí)現(xiàn),則能夠?qū)φ?qǐng)求結(jié)果進(jìn)行解析,解析方式和jQuery的解析方式幾乎完全相同;
superagent:能夠?qū)崿F(xiàn)主動(dòng)發(fā)起get/post/delete等請(qǐng)求;
async:async模塊是為了解決嵌套金字塔,和異步流程控制而生,由于nodejs是異步編程模型,有一些在同步編程中很容易做到的事情,現(xiàn)在卻變得很麻煩。Async的流程控制就是為了簡(jiǎn)化這些操作;
request:有了這個(gè)模塊,http請(qǐng)求變的超簡(jiǎn)單,Request使用簡(jiǎn)單,同時(shí)支持https和重定向;
步驟五:編寫(xiě)爬蟲(chóng)程序代碼
打開(kāi)hz.js,編寫(xiě)代碼:
var superagent = require('superagent');
var cheerio = require('cheerio');
var async = require('async');
var fs = require('fs');
var request = require('request');
var page=1; //獲取發(fā)型師處有分頁(yè)功能,所以用該變量控制分頁(yè)
var num = 0;//爬取到的信息總條數(shù)
var storeid = 1;//門(mén)店ID
console.log('爬蟲(chóng)程序開(kāi)始運(yùn)行......');
function fetchPage(x) { //封裝函數(shù)
startRequest(x);
}
function startRequest(x) {
superagent
.post('http://tweixin.yueyishujia.com/v2/store/designer.json')
.send({
// 請(qǐng)求的表單信息Form data
page : x,
storeid : storeid
})
// Http請(qǐng)求的Header信息
.set('Accept', 'application/json, text/javascript, */*; q=0.01')
.set('Content-Type','application/x-www-form-urlencoded; charset=UTF-8')
.end(function(err, res){
// 請(qǐng)求返回后的處理
// 將response中返回的結(jié)果轉(zhuǎn)換成JSON對(duì)象
if(err){
console.log(err);
}else{
var designJson = JSON.parse(res.text);
var deslist = designJson.data.designerlist;
if(deslist.length > 0){
num += deslist.length;
// 并發(fā)遍歷deslist對(duì)象
async.mapLimit(deslist, 5,
function (hair, callback) {
// 對(duì)每個(gè)對(duì)象的處理邏輯
console.log('...正在抓取數(shù)據(jù)ID:'+hair.id+'----發(fā)型師:'+hair.name);
saveImg(hair,callback);
},
function (err, result) {
console.log('...累計(jì)抓取的信息數(shù)→→' + num);
}
);
page++;
fetchPage(page);
}else{
if(page == 1){
console.log('...爬蟲(chóng)程序運(yùn)行結(jié)束~~~~~~~');
console.log('...本次共爬取數(shù)據(jù)'+num+'條...');
return;
}
storeid += 1;
page = 1;
fetchPage(page);
}
}
});
}
fetchPage(page);
function saveImg(hair,callback){
// 存儲(chǔ)圖片
var img_filename = hair.store.name+'-'+hair.name + '.png';
var img_src = 'http://photo.yueyishujia.com:8112' + hair.avatar; //獲取圖片的url
//采用request模塊,向服務(wù)器發(fā)起一次請(qǐng)求,獲取圖片資源
request.head(img_src,function(err,res,body){
if(err){
console.log(err);
}else{
request(img_src).pipe(fs.createWriteStream('./image/' + img_filename)); //通過(guò)流的方式,把圖片寫(xiě)到本地/image目錄下,并用發(fā)型師的姓名和所屬門(mén)店作為圖片的名稱。
console.log('...存儲(chǔ)id='+hair.id+'相關(guān)圖片成功!');
}
});
// 存儲(chǔ)照片相關(guān)信息
var html = '姓名:'+hair.name+'<br>職業(yè):'+hair.jobtype+'<br>職業(yè)等級(jí):'+hair.jobtitle+'<br>簡(jiǎn)介:'+hair.simpleinfo+'<br>個(gè)性簽名:'+hair.info+'<br>剪發(fā)價(jià)格:'+hair.cutmoney+'元<br>店名:'+hair.store.name+'<br>地址:'+hair.store.location+'<br>聯(lián)系方式:'+hair.telephone+'<br>頭像:<img src='+img_src+' style="width:200px;height:200px;">';
fs.appendFile('./data/' +hair.store.name+'-'+ hair.name + '.html', html, 'utf-8', function (err) {
if (err) {
console.log(err);
}
});
callback(null, hair);
}
步驟六:運(yùn)行爬蟲(chóng)程序
輸入node hz.js命令運(yùn)行爬蟲(chóng)程序,效果圖如下:

運(yùn)行成功后,發(fā)型師基本信息以html文件的形式存儲(chǔ)在data文件夾中,發(fā)型師頭像圖片存儲(chǔ)在image文件夾下:


后記:到此一款基于node.js制作的簡(jiǎn)單爬蟲(chóng)就大功告成了,由于我也是初學(xué)者,好多地方也不是很理解,但好在是自己完成了,不足之處敬請(qǐng)諒解。
代碼下載地址:https://github.com/yanglei0323/nodeCrawler
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- node.js實(shí)現(xiàn)簡(jiǎn)單爬蟲(chóng)示例詳解
- node.js做一個(gè)簡(jiǎn)單的爬蟲(chóng)案例教程
- node.js爬蟲(chóng)框架node-crawler初體驗(yàn)
- Node.js爬蟲(chóng)如何獲取天氣和每日問(wèn)候詳解
- 基于node.js實(shí)現(xiàn)爬蟲(chóng)的講解
- node.js學(xué)習(xí)筆記之koa框架和簡(jiǎn)單爬蟲(chóng)練習(xí)
- 淺談Node.js爬蟲(chóng)之網(wǎng)頁(yè)請(qǐng)求模塊
- 使用 Node.js 開(kāi)發(fā)資訊爬蟲(chóng)流程
- 利用node.js寫(xiě)一個(gè)爬取知乎妹紙圖的小爬蟲(chóng)
- node.js爬蟲(chóng)爬取拉勾網(wǎng)職位信息
- Node.js?實(shí)現(xiàn)簡(jiǎn)單爬蟲(chóng)的示例代碼
相關(guān)文章
nodeJS代碼實(shí)現(xiàn)計(jì)算交社保是否合適
本文通過(guò)nodejs的一個(gè)具體示例來(lái)對(duì)比分析現(xiàn)階段我們交社保合不合適,主要是對(duì)nodejs的一個(gè)小的應(yīng)用,當(dāng)然大家也可以改成其他語(yǔ)言的,程序猿們,來(lái)算算吧。2015-03-03
使用NodeJS?5分鐘?連接?Redis?讀寫(xiě)操作的詳細(xì)過(guò)程
這篇文章主要介紹了NodeJS?5分鐘?連接?Redis?讀寫(xiě)操作,本文給大家介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07
nodejs?express路由匹配控制及Router模塊化使用詳解
這篇文章主要為大家介紹了nodejs?express路由匹配控制及Router模塊化使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10
Node.js中DNS模塊學(xué)習(xí)總結(jié)
本篇文章給大家詳細(xì)介紹了Node.js中DNS模塊的相關(guān)知識(shí)點(diǎn),以及相關(guān)的實(shí)例代碼做了分享,有興趣的朋友參考下。2018-02-02
教你在heroku云平臺(tái)上部署Node.js應(yīng)用
heroku是構(gòu)建在AWS之上的一個(gè)PaaS云平臺(tái),現(xiàn)在支持Ruby, Node.js, Python, Java, 和 PHP,代碼的部署是通過(guò)git進(jìn)行,編譯和運(yùn)行都是自動(dòng)的。2014-07-07
win7下安裝配置node.js+express開(kāi)發(fā)環(huán)境
windows7下安裝nodejs及框架express,從誕生至今一直被熱捧,筆者最近也裝了個(gè)環(huán)境打算了解一下。安裝步驟簡(jiǎn)單比較簡(jiǎn)單,這里分享給大家,希望大家能夠喜歡。2015-12-12
Node.js實(shí)現(xiàn)大文件斷點(diǎn)續(xù)傳示例詳解
這篇文章主要為大家介紹了Node.js實(shí)現(xiàn)大文件斷點(diǎn)續(xù)傳示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11

