看了幾天的nodejs,的確是好用,全當是練手了,就寫了一個爬蟲工具。html
爬蟲思路都是一致的,先抓取頁面數據,而後分析頁面,獲取到所須要的數據,最後得到這些數據,是寫入到硬盤,仍是顯示到網頁,本身看着辦。node
其中最難的是分析頁面,若是不用其餘工具,那就只能用正則表達式來分析了。這裏採用cheerio這個模塊,這個很好用,不要有抵觸心理(由於剛開始我比較抵觸這個,想不用任何別的東西,結果本身搞崩了,仍是用了它)。cheerio網上介紹不少,它能夠根據div,根據class ,href等html標籤,獲取裏面的數據。git
此次是抓的本人博客首頁( http://www.cnblogs.com/juepei/ )的文章標題,但願站長別生氣,實地演練麼。正則表達式
先說下如何獲得這個頁面下的數據。api
代碼以下,簡單的一比(不過nodejs寫出來的東西原本就很簡潔):數組
request(url,function(error,res,body){ if(!error && res.statusCode == 200){ console.log(body); } });
body就是數據了,app
而後開始分析下數據。工具
查看首頁文章部分代碼,以下:post
<div class="day"> <div class="dayTitle"> <a id="homepage1_HomePageDays_DaysList_ctl00_ImageLink" href="http://www.cnblogs.com/juepei/archive/2015/01/09.html">2015年1月9日</a> </div> <div class="postTitle"> <a id="homepage1_HomePageDays_DaysList_ctl00_DayList_TitleUrl_0" class="postTitle2" href="http://www.cnblogs.com/juepei/p/4212595.html">git經常使用命令</a> </div> <div class="postCon"><div class="c_b_p_desc">摘要: (1)git branch 查看本地分支(2)git branch -a 查看遠程分支(3)git checkout branchname 切換分支 (4)git add yourfile (5)git commit -a -m "描述" 提交你當前開發到暫存區,能夠理解爲你本...<a href="http://www.cnblogs.com/juepei/p/4212595.html" class="c_b_p_desc_readmore">閱讀全文</a></div></div> <div class="clear"></div> <div class="postDesc">posted @ 2015-01-09 10:06 薛定諤的貓_ 閱讀(4) 評論(0) <a href ="http://i.cnblogs.com/EditPosts.aspx?postid=4212595" rel="nofollow">編輯</a></div> <div class="clear"></div> </div>
.....
不少文章麼,都是上面那些東西的循環。學習
我想要的東西在這裏:
<div class="postTitle"> <a id="..." class="postTitle2" href="http://www.cnblogs.com/juepei/p/4212595.html">git經常使用命令</a> </div>
它在<div class='postTitle'>裏面包着。要取出它,這時候cheerio就大顯身手了,此處建議看下cheerio的api。
代碼以下:
var $=cheerio.load(body); $('div').filter(function(i,e){ if($(this).attr('class')==='postTitle'){ console.log($(this).text().trim()); } });
這裏用div來定位,這樣就能夠獲取到數據了。代碼就這麼簡單。
以後能夠隨意處置拿到的數據了,我這裏是存到了本地的文本文檔中。中間用數組轉存了一下數據
所有代碼以下:
var fs=require('fs'); var buffer=require('buffer'); var url='http://www.cnblogs.com/juepei/'; var result=new Array(); function getDatas(){ request(url,function(error,res,body){ if(!error && res.statusCode == 200){ var $=cheerio.load(body); var j=0; $('div').filter(function(i,e){ if($(this).attr('class')==='postTitle'){ j++; //console.log($(this).text().trim()); result.push($(this).text().trim()); } }); console.log(result.toString()); fs.appendFile('/home/wang/data.txt',result.toString(),function(err){ if(err){ console.log('file:'+err); }else{ console.log('write ok'); } }); } else{ console.log(error); } }); } getDatas();
運行一下這段代碼,/home/wang目錄下就有data.txt生成了,網頁編碼是utf8的,系統環境也是utf8,因此沒有亂碼的產生,若是是其餘系統,編碼不同,處理下編碼。
至此,大功告成。ps:本人也學習了幾天nodejs,剛開始比較糾結,找不到好資料,感受舉步爲艱。但願你們多看api,這個纔是正路。