Nodejs書寫爬蟲工具


看了幾天的nodejs,的確是好用,全當是練手了,就寫了一個爬蟲工具。

爬蟲思路都是一致的,先抓取頁面數據,然后分析頁面,獲取到所需要的數據,最后獲得這些數據,是寫入到硬盤,還是顯示到網頁,自己看着辦。

其中最難的是分析頁面,如果不用其他工具,那就只能用正則表達式來分析了。這里采用cheerio這個模塊,這個很好用,不要有抵觸心理(因為剛開始我比較抵觸這個,想不用任何別的東西,結果自己搞崩了,還是用了它)。cheerio網上介紹很多,它可以根據div,根據class ,href等html標簽,獲取里面的數據。

這次是抓的本人博客首頁( http://www.cnblogs.com/juepei/ )的文章標題,希望站長別生氣,實地演練么。

先說下如何得到這個頁面下的數據。

代碼如下,簡單的一比(不過nodejs寫出來的東西本來就很簡潔):

  request(url,function(error,res,body){
                if(!error && res.statusCode == 200){
                     console.log(body);
                }
        });
    

body就是數據了,

然后開始分析下數據。

查看首頁文章部分代碼,如下:

<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 &quot;描述&quot; 提交你當前開發到暫存區,可以理解為你本...<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,這個才是正路。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM