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打開類似于這樣的界面
// 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
擷取對應節點資料
// 擷取小說内容的函數
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 ./1.js
就可以在fiction檔案夾下得到所有章節的text檔案