30行js爬取頂點全網任意小說

wendux發表於2017-03-30

之前連續多篇文章介紹客戶端爬取平臺(dspider),今天我們從零開始,實現爬取頂點小說網任意一本小說的功能。

如果你還不知道客戶端爬取,可以先看下我的前幾篇部落格:

爬蟲技術( 一) 一篇文章瞭解爬蟲技術現狀

爬蟲技術(二) 客戶端爬蟲

爬蟲技術(三)-客戶端爬取Android SDK釋出

客戶端爬蟲 ios sdk 釋出了!

客戶端爬取-答網友問

DSpider簡介

整合sdk

dspider官方網站有詳細的整合文件, 並提供了demo, 我們本節的示例基於該demo開始,請先下載相應平臺的demo(github),下面是整合文件:

ios: dspider.dtworkroom.com/document/io…

android: dspider.dtworkroom.com/document/an…

如何整合、爬取文章中很詳細,下面我們主要看一下如何寫爬取指令碼

編寫爬取指令碼

分析網頁

由於我們爬取的手機版網站,開啟頂點小說主頁 m.23us.com/ ,為了簡單起見,我們在進入具體小說的目錄頁後就開始爬取。下面以《擇天記》為例:
介紹頁url:m.23us.com/book/52234
我們提取特徵字串“/book/”。
目錄頁url: m.23us.com/html/52/522…
我們提取小說目錄頁url特徵"html/數字/數字/"。

那麼基本的爬取流程如下:

//我們將小說標題作為sessionKey
var sessionKey="小說標題"
dSpider(sessionKey, function(session,env,$){
    //在介紹頁
    if(location.href.indexOf("/book/")!=-1){
       //新增爬取按鈕
    }else if(/.+html\/\d+\/\d+\/$/.test(location.href)) {  
      //目錄頁自動開始爬取
    }
})複製程式碼

dSpider為指令碼爬取的入口函式,類似於c裡面的main函式,詳細的請移步dspider javascript api文件

介紹頁新增爬取按鈕

為了啟動爬取,我們在介紹頁新增一個爬取按鈕,原來的介紹頁如下:

30行js爬取頂點全網任意小說
介紹頁.png

因為在進入目錄頁會自動爬取,所以我們只需要將進入章節目錄的按鈕文字變一下,同時為了醒目,背景換成綠色。

30行js爬取頂點全網任意小說
修改後的介紹頁.png

具體程式碼:

$(".more a").text("爬取本書").css("background","#1ca72b");複製程式碼

目錄頁爬取

  1. 在目錄頁我們獲取所有章節的url。

    var list = $(".chapter li a");複製程式碼
  2. 然後通過ajax請求每一個url,獲取資料並解析

     $.get(e.attr("href")).done(function (data) {
                    //獲取章節名
                    var text = e.text().trim() + "\r\n";
                    //獲取正文,進行格式處理
                    text+= $(data).find("#txt").html()
                           .replace(/ /g,"  ").replace(/<br>/g,"\n")+"\r\n";
                    //將資料傳遞給端
                    session.push(text)
     })複製程式碼

在爬取的時候,我們輸出進度訊息給端,完整的程式碼如下:

var sessionKey=dQuery(".index_block h1").text()
dSpider(sessionKey, function(session,env,$){
    if(location.href.indexOf("/book/")!=-1){
        $(".more a").text("爬取本書").css("background","#1ca72b");
    }else if(/.+html\/\d+\/\d+\/$/.test(location.href)) {
        log(sessionKey)
        var list = $(".chapter li a");
        session.showProgress();
        session.setProgressMax(list.length);
        var curIndex = 0
        function getText() {
            var e = list.eq(list.length-curIndex-1);
            $.get(e.attr("href")).done(function (data) {
                var text = e.text().trim() + "\r\n";
                text+= $(data).find("#txt").html()
                      .replace(/ /g," ").replace(/<br>/g,"\n")+"\r\n";
                session.push(text)
            }).always(function () {
                if (++curIndex < list.length) {
                    session.setProgress(curIndex);
                    session.setProgressMsg("正在爬取《"+sessionKey+"》 "+e.text())
                    getText();
                } else {
                    session.setProgress(curIndex);
                    session.finish();
                }
            })
        }
        getText()
    }
})複製程式碼

怎麼樣,簡單強大吧!

我們看看執行效果:

30行js爬取頂點全網任意小說
Screenshot_20170330-165659.png

爬取成功後,我將資料儲存在txt中,然後用qq閱讀開啟

30行js爬取頂點全網任意小說
目錄

30行js爬取頂點全網任意小說
正文

指令碼已經發布到了爬蟲商店:dspider.dtworkroom.com/spider/12

整合注意事項

下載的demo預設的包名是:wendu.dspiderdemo, appid是5,這是官方賬號下的app。 如果你要換包名,需要在後臺先建立應用,建立好之後獲得appid, 將sdk初始化時的appid換成你自己的appid,然後在爬蟲商店找到“頂點小說”,然後將它新增到你的應用,這一步很重要,否則你的應用就沒有執行該爬蟲的許可權。 我們在“頂點小說”詳情頁獲取其id(12),然後在demo中將sid換成12就可以了。爬取的結果可以自己拼接儲存在txt中。

ps:別忘了star一下哦。

相關文章