需要 用到的模块有 fs,patn 用来操作文件,使用selenium-web来操作浏览器
其中 selenium-webdriver 模块是需要自己安装一下的。
npm i selenium-webdriver
var driver = new Builder().forBrowser('firefox').build();
const fs = require('fs') const path = require('path') let file = path.resolve(__dirname, './file.txt'); //存入文件位置 const { Builder, By, Key, until } = require('selenium-webdriver'); var currentPageNum = 1; //第一章节 var maxPageNum = 2059; //最大章节数 var driver = new Builder().forBrowser('firefox').build(); var list = [] start() async function start() { await driver.get('https://www.xbiquge.la/34/34525/'); //小说 目录首页 let listLength = await driver.findElements(By.css('.box_con dl dd')); //获取小说所有章节的标签 maxPageNum = listLength.length; //更新最大章节数 inWeb(); //进入小说章节页面 }; async function inWeb() { console.log(`当前正在获取第${currentPageNum}页数据,共${maxPageNum}页`) if (currentPageNum < maxPageNum + 1) { console.log("------------开始点击 进入文章-------------") let pageItem = await driver.findElements(By.css('.box_con dl dd')); let item = await pageItem[currentPageNum - 1].findElement(By.css("a")) //根据章节数进入小说页面 let href = await item.getAttribute("href") await driver.get(href); //小说 内容页面 通过a标签的href地址进入 // item.click();//点击事件来进入页面 setTimeout(() => { getData(); //获取小说数据 }, 200); //增加延迟时间给页面加载,如果没有加载完成无法获取元素 } } async function getData() { while (true) { let notError = true; try { //更具css样式获取对应内容 let title = await driver.findElement(By.css('.bookname h1')); let text = await driver.findElement(By.id("content")); title = await title.getText(); //标题 text = await text.getText(); //内容 currentPageNum++; //获取内容后增加章节数 let str = "\n" + title + "\n" + text // 异步写入数据到文件 fs.appendFile(file, str, { //把获得的章节名称和内容写入文档 encoding: 'utf8' }, err => {}) if (currentPageNum < maxPageNum + 1) { //如果章节数没有达到最大章节数就继续爬取数据 start() } } catch (error) { if (e) notError = false console.log("error ------------", error.message); } finally { if (notError) break; } } }