天天看點

使用node爬取小說内容并儲存到本地

1. 先下載下傳node

2. 建立一個以 .js 結尾的檔案

3. 建立一個存放小說的檔案夾名稱自定義

4. 下載下傳 cheerio 和 request 包

npm i cheerio

npm i request

5. 在檔案内導入需要用到的子產品

// npm下載下傳子產品後,引入cheerio子產品
let cheerio = require('cheerio');
// 引入fs檔案子產品,幫助爬取的頁面寫入檔案裡面
let fs = require('fs');
// 引入請求子產品
let request = require('request');
           

6. 擷取每一章的連結

這裡可以在頁面按F12打開類似于這樣的界面 

使用node爬取小說内容并儲存到本地
// cheerio子產品操作本地的現有的HTML頁面的DOM節點,進而通過節點進行篩查擷取資訊
request("http://book.zongheng.com/showchapter/1215587.html",
    (err, res, body) => {
        if (err) return false; //如果請求報錯就退出

        // 類似于jquery選擇器傳回$,
        // Cheerio的選擇器實作與jQuery幾乎相同,是以API非常相似。
        let $ = cheerio.load(body);
        // 通過$這個選擇器,選擇我們爬取内容所在的節點
        // return false相當于break ; return true相當于continue
        // 根據上圖選擇對應的節點擷取每一章的連結
        $(".col-4 a").each(function (index) {
             if (index > 100) {
                 return false; //break,當小說章節達到100章則退出循環
             }
             // 這裡的this等于$擷取的a節點,同prop方法捕獲a節點中的href屬性内容
             let strurl = $(this).prop("href");
             // 判斷頁面連結是否存在
             if (strurl) {
                 // 調用擷取小說内容的函數
                 getNoveltext(strurl, index);
             }

        })
    }
)
           

7. 擷取小說内容

跟第6步一樣的先按f12

使用node爬取小說内容并儲存到本地

 擷取對應節點資料

// 擷取小說内容的函數
function getNoveltext(url, index) {
    // 通過傳入每一章節小說内容的連結,擷取小說的内容
    request(url, (err, res, body) => {
        if (err) return false; //如果請求報錯就退出
        let $ = cheerio.load(body); //擷取Cheerio的選擇器
        // 擷取每一章的标題
        let strtext = $('.title .title_txtbox').text() + '\n\r'  // 進行換行
        // 擷取文字内容
        $(".content p").each((index, el) => {
            strtext += $(el).text() + '\r'  
        })

        // 通過fs檔案子產品将小說内容異步寫入text文檔,這裡必須建立fiction的檔案夾
        fs.writeFileSync(`./fiction/page${index + 1}.txt`, strtext);
    })
}
           

完整内容

// npm下載下傳子產品後,引入cheerio子產品
let cheerio = require('cheerio');
// 引入fs檔案子產品,幫助爬取的頁面寫入檔案裡面
let fs = require('fs');
// 引入請求子產品
let request = require('request');

// cheerio子產品操作本地的現有的HTML頁面的DOM節點,進而通過節點進行篩查擷取資訊
request("http://book.zongheng.com/showchapter/1215587.html",
    (err, res, body) => {
        if (err) return false; //如果請求報錯就退出

        // 類似于jquery選擇器傳回$,
        // Cheerio的選擇器實作與jQuery幾乎相同,是以API非常相似。
        let $ = cheerio.load(body);
        // 通過$這個選擇器,選擇我們爬取内容所在的節點
        // return false相當于break ; return true相當于continue
        // 根據上圖選擇對應的節點擷取每一章的連結
        $(".col-4 a").each(function (index) {
             if (index > 100) {
                 return false; //break,當小說章節達到100章則退出循環
             }
             // 這裡的this等于$擷取的a節點,同prop方法捕獲a節點中的href屬性内容
             let strurl = $(this).prop("href");
             // 判斷頁面連結是否存在
             if (strurl) {
                 // 調用擷取小說内容的函數
                 getNoveltext(strurl, index);
             }

        })
    }
)

// 擷取小說内容的函數
function getNoveltext(url, index) {
    // 通過傳入每一章節小說内容的連結,擷取小說的内容
    request(url, (err, res, body) => {
        if (err) return false; //如果請求報錯就退出
        let $ = cheerio.load(body); //擷取Cheerio的選擇器
        // 擷取每一章的标題
        let strtext = $('.title .title_txtbox').text() + '\n\r'  // 進行換行
        // 擷取文字内容
        $(".content p").each((index, el) => {
            strtext += $(el).text() + '\r'  
        })

        // 通過fs檔案子產品将小說内容異步寫入text文檔,這裡必須建立fiction的檔案夾
        fs.writeFileSync(`./fiction/page${index + 1}.txt`, strtext);
    })
}
           

完整目錄結構

使用node爬取小說内容并儲存到本地
 在目前檔案夾下運作 node ./1.js

 就可以在fiction檔案夾下得到所有章節的text檔案

使用node爬取小說内容并儲存到本地

繼續閱讀