Node.js爬蟲實例

今天來用Node.js作一個小小的爬蟲項目

爬蟲目標:http://songshuhui.net/(科學松鼠會)

  • 咱們須要建立一個文件夾,本身命名就好,而後在文件夾裏建立兩個文件夾分別命名爲data和img,進入到這個總文件夾的目錄終端下。html

  • 終端輸入npm init,建立package.json配置文件,根據本身的實際狀況填寫,或者一路回車。web

  • 再次輸入npm install cheerio request --save,會下載好cheerio(用法幾乎和Jquery同樣),request依賴包。npm

  • 在總文件夾裏再建立index.js,用來編寫咱們的主體邏輯代碼。json

下面就是代碼

var http = require('http');
var fs = require('fs');

var cheerio = require('cheerio');
var request = require('request');

var i = 0;
var url = "http://songshuhui.net/archives/96881";//初始化的地址

function fetchPage(x){
    startFetch(x);
}//封裝函數

function startFetch(x){
    //採用http模塊向服務器發起一次get請求
    http.get(x,function(res){
        var html = ""; //用來儲存整個頁面的html內容
        res.setEncoding("utf-8");//防止中文亂碼
        res.on('data',function(chunk){
            html  += chunk;
        });//監聽data事件,每次取一塊數據
        res.on('end',function(){
            var $ = cheerio.load(html);//用cheerio模塊解析html

            var author = $(".metax_single a:first-child").text().trim();//獲取文章的做者

            var title = $(".atrctitle .contenttitle a").text().trim();//獲取文章的標題

            var link = $(".atrctitle .contenttitle a").attr("href");//獲取文章的網頁地址

            var new_item = {
                Title: title,
                Author: author,
                Link: link,
                i: i =i + 1//用來判斷獲取了多少文章
            };
            console.log(new_item);

            savedContent($,title);//儲存文章的文字內容

            savedImg($,title);//儲存文章的圖片內容

            var nextLink = $(".navilinks .prevlink a").attr("href");

            var str = encodeURI(nextLink);

            if(i <= 500){
                fetchPage(str);
            }//經過控制i控制抓取的文章的數目
        });//監聽end事件,若是整個網頁內容都獲取完畢,執行回調函數
    }).on('error',function (err) {
        console.log(err);
    });
}

function savedContent($,title){
    $(".entry p").each(function(index,item) {
        var x = $(this).text();

        x = x + "\n";

        fs.appendFile("./data/" + title + ".txt", x, "utf-8", function (err) {
            if (err) {
                console.log(err);
            }
        });
    });
}
//本地儲存爬取的文字資源
function savedImg($,title){
    $(".entry .wp-caption img").each(function(index,item) {
        var img_title = $(this).attr("alt");

        var img_filename = img_title + ".jpg";

        var img_src = $(this).attr("src");

        request.head(img_src,function(err,res,body){
            if(err){
                console.log(err);
            }
        });

        request(img_src).pipe(fs.createWriteStream("./img/" + title + "--" + img_filename));
        //採起request模塊向服務器發起一次請求,獲取圖片資源
    });
}
//本地儲存爬取的圖片資源
fetchPage(url);
  • 代碼部分完成,在webstorm上運行index.js文件,直接選中index.js,點擊右上角的綠色三角按鈕。服務器

  • 選取的這個網址,分析網站源代碼,每一個文章都有上一頁或者下一頁的內容,這樣咱們能夠串聯式的獲取dom節點的不一樣url,所以得到每一個url的內容。app

控制檯的輸出

圖片描述

獲取的圖片

圖片描述

獲取的文章

圖片描述

爬蟲成功!

相關文章
相關標籤/搜索