首页 > 编程语言 >nodejs 读取博客园自己博客列表 生成全部标题列表

nodejs 读取博客园自己博客列表 生成全部标题列表

时间:2022-08-22 09:44:53浏览次数:95  
标签:info function console nodejs 博客园 ret 列表 html const

需求

自己的博文有823篇了,但是不能在一页里面显示,本来想通过 MetaWeblog 读取,后来发现失败了。
没办法,自己写个脚本读取吧。

之前MetaWeblog 读取 失败的文章:https://www.cnblogs.com/pengchenggang/p/16593890.html

原理

装一个axios,get读取一个页面,这样就获得了html,再通过正则 提取出标题和链接,存在数组里面。

经过递归,刷一遍列表分页。为了保证顺序,所以要第一页读取完成后,再进行第二也的加载。

上截图

上代码

// cnblogs-node.js
const axios = require("axios")
const fs = require('fs')
const pageTotal = 22
let currPage = 1
let dataArr = []

getPageContent(1) // 从第1页到22页 递归调用

function getPageContent (page) {
  axios.get('https://www.cnblogs.com/pengchenggang/default.html?page='+page).then(res => {
    // console.info('res.data', res.data)
    const content = res.data
    const mainStartPosition = '<!--end: header 头部 -->'
    const mainEndPosition = '<!--end: main -->'
    let pos1 = 0, pos2 = 0
    pos1 = content.indexOf(mainStartPosition) + mainStartPosition.length
    pos2 = content.indexOf(mainEndPosition) + mainEndPosition.length
    console.info('pos1', pos1)
    console.info('pos2', pos2)

    const listContent = content.substring(pos1, pos2)
    // console.info('listContent', listContent)

    const reg = new RegExp(/<a class=\"postTitle2[\s\S]*?<\/a>/, "g")
    // const reg = new RegExp(/<a\b[^>]+\bhref="([^"]*)"[^>]*>([\s\S]*?)</a>/, "g");

    if (reg.test(listContent)) {
      // 找到内容了
      console.info('匹配上拉')
      const ret = getRegExec(reg, listContent)
      const ret1 = formatRet(ret) // 格式化所需要的对象
      // console.log("ret1", ret1)
      console.log("第"+ page + "页 读取完成")
      dataArr.push(...ret1)
      if (page === pageTotal) {
        fs.writeFile('data.json', JSON.stringify(dataArr), function () {
          console.info('data.json 写入完成!')
        })
        const renderHtml = getRenderHtml(dataArr)
        fs.writeFile('html.html', renderHtml, function () {
          console.info('html.html 写入完成!')
        })
      } else {
        getPageContent(page + 1)
      }
    } else {
      console.info('没有匹配上')
    }
  })
}

function getRenderHtml(arr) {
  return arr.map(item => {
    return '<a href="'+item.link+'" target="_blank">'+item.title+'</a>'
  }).join('\n')
}
function formatRet (arr) {
  let ret = []
  arr.map(item => {
    ret.push(getLinkAndTitle(item))
  })
  return ret
}

function getLinkAndTitle (str) {
  // const mock = '<a class="postTitle2 vertical-middle" href="https://www.cnblogs.com/pengchenggang/p/16601242.html">\n' +
  //   '    <span>\n' +
  //   '        软件发布时 生成发布日志文件 单点登录 getGitInfo.bat\n' +
  //   '    </span>\n' +
  //   '    \n' +
  //   '</a>'

  const reg2 = new RegExp(/href="([\s\S]*?)">[\s\S]*?<span>([\s\S]*?)<\/span>/, "g")
  const m2 = reg2.exec(str)
  // console.info('m2', m2)
  const link = m2[1]
  const title = m2[2].replace(/\\n/, 'g').trim()
  // console.info('link title', link, title)
  return {
    title,
    link
  }
}

function getRegExec (reg, txt) {
  var m
  var ret = []
  do {
    m = reg.exec(txt)
    // console.info('m', m)
    if (m) {
      ret.push(m[0])
    }
  } while (m)
  return ret
}

package.json

{
  "name": "cnblogs-nodejs-script",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "run": "node cnblogs-node.js"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "axios": "^0.27.2"
  }
}

all cnblogsByPengchenggang 样式显示模板

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>all cnblogsByPengchenggang</title>
  <style>
    a {
      font-size: 14px;
      /* display: block; */
      /* margin: 5px 20px; */
      color: #666666;
    }

    a:hover {
      color: #333333;
      font-size: 14px;
      background-color: #f2f2f2;
    }

    .list {
      counter-reset: main;
      /* width: 800px; */
      margin: 0 auto;
    }

    a::before {
      counter-increment: main;
      content: counter(main);
      padding-right: 10px;
    }
  </style>
</head>

<body class="">
  <div class="list">
    $TemplateListSlot
  </div>
</body>

</html>

复盘

这里主要3个知识点

  1. 读取数据 用axios
  2. 解析数据 用正则
  3. 存储数据 用nodejs

标签:info,function,console,nodejs,博客园,ret,列表,html,const
From: https://www.cnblogs.com/pengchenggang/p/16611780.html

相关文章

  • babel运行nodejs
    babel运行nodejs安装依赖yarnadd@babel/core@babel/cli@babel/node@babel/preset-env-D或者全局安装yarnglobaladd@babel/core@babel/cli@babel/node@bab......
  • 博客园主题推荐awescnb-自定义
    后台-设置博客皮肤:Custom页面定制CSS代码#loading{bottom:0;left:0;position:fixed;right:0;top:0;z-index:9999;background-color:......
  • 列表
    str  储存少量的数据   切片还是对其他进行任何操作,获取的内容全都是str类型,储存的数据单一。 list  l1=[100,'alex',true,,[1,2,3]] 承载任意数据类......
  • 数据类型_列表
    一、列表数据类型“列表”是一个值,它包含多个字构成的序列。1spam=["hello",3.14159,True,"elephant"]2[]变量spam只被赋予值:列表值,但列表值本身包含多个值。[]......
  • vue列表和数组
    数组<!DOCTYPEhtml><htmllang="zh"><head> <metacharset="UTF-8"> <metahttp-equiv="X-UA-Compatible"content="IE=edge"> <metaname="viewport"content="w......
  • MarkDown 本地图片快速上传到博客园
    到.NETDownloads下载.NET5打开CMD之类的终端,运行dotnettoolinstall--globaldotnet-cnblog安装dotnet-cnblogs-tool到博客后台创建Token,并复制运行......
  • 解决Notepad++ 中写的代码粘贴到博客园中,代码对不齐问题
    在Notepad++中写代码之前,在 设置->首选项..   在首选项页面上,进行如下操作,将制表符都替换为空格,就OK了  可以在视图->显示符号 -> 显示空格与制......
  • python 中生成列表矩阵
     001、>>>[[0]*5foriinrange(3)]##生成3行5列,元素为0的矩阵[[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0]] 002、>>>......
  • python 中 判断列表、元组、字符串、字典、集合为空的方法
     001、>>>test1=[]>>>test1[]>>>ifnottest1:##判断列表为空...print("noelement")...noelement 002、>>>test......
  • 列表的循环遍历、列表嵌套、综合案例
    1.whilename_list=['aaa','bbb','ccc']i=0#len是访问数据个数whilei<len(name_list):#查看下标数据print(name_list[i])i+=1#结果:......