• node爬虫爬取小说


    node爬虫爬取小说

    node爬虫爬取小说

    最近发现自己喜欢的一个小说无法下载,网页版广告太多,操作太难受,只能自己写个爬虫把内容爬下来放在阅读器里面看

    直接上代码

    const cheerio = require("cheerio");
    const puppeteer = require("puppeteer");
    const axios = require("axios");
    const fs = require("fs");
    
    /**
     * 公共请求链接方法
     * @param url 请求链接后缀(例:https://www.baidu.com/zhangsan/111 中 /张三/111 是后缀)
     */
    const getPage = async (url) => {
      //请求链接
      const { data } = await axios.get(`https://www.9biquge.com${url}`, {
        headers: {
          "user-agent":
            "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36 Edg/99.0.1150.36",
        },
      });
      //返回请求结果
      return data;
      // console.log('抓取网页成功')
    };
    
    //主方法
    const main = async () => {
      //请求小说章节列表(找那种所有章节都在一个目录下的页面,如果有翻页的话比较麻烦)
      const pageData = await getPage("/25/25538/");
      //转换页面数据变为节点
      const $ = cheerio.load(pageData);
      //获取到所有章节标题节点(可通过f12查看)
      const $list = $("#list dd a");
      //查看有多少章
      console.log($list.length);
    
      //开始循环标题节点
      for (let i = 0; i < $list.length; i++) {
        //拿到标题节点中的页面链接并请求数据(这里可以灵活获取,只要能拿到就行,拿到之后看一下数据是什么样的,完整的还是只有后缀,我这里是只有后缀的)
        const pageItemData = await getPage($list[i].attribs.href);
        //同样转化为节点
        const $$ = cheerio.load(pageItemData);
        //获取所有文本数据,我这里是一行行进行处理,因为前后中间都有空格,所以我处理一下,不然到时候排版我不喜欢
        let datailText = "";
        for (let j = 0; j < $$(".content_detail").length; j++) {
          datailText +=
            $$(".content_detail")[j].children[0].data.replace(/\s/g, "") + "\n";
        }
        //写入文件,文件需要新建好,就在项目根目录下下面新建,这里需要替换文件名
        fs.appendFileSync(
          "./我一个史莱姆.txt",
          "\n\n" + $$(".bookname h1").text() + "\n\n" + datailText
        );
        console.log($$(".bookname h1").text());
        //睡眠一秒钟,防止请求频繁被封ip
        await sleep(1000);
      }
    };
    
    /*
    休眠函数sleep
    调用 await sleep(1500)
     */
    function sleep(ms) {
      return new Promise((resolve) => setTimeout(resolve, ms));
    }
    
    main();
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
  • 相关阅读:
    存储资源盘活助力网络强国
    38基于matlab的期货预测,利用PSO优化SVM和未优化的SVM进行对比,得到实际输出和期望输出结果。
    【Pytorch实用教程】nn.LogSoftmax的详细用法及公式
    cocosCreator 之 dispatchEvent事件分发
    HTML5期末大作业dreamweaver作业静态HTML网页设计——甜点店(11页) 学生网页设计作品
    文本文件的读取+操作
    软件自动化测试代码覆盖率
    算法分析基础
    Clickhouse 实现 MaterializedPostgreSQL
    【Linux】Docker部署sock shop
  • 原文地址:https://blog.csdn.net/aa494661239/article/details/126103198