node.js 刷csdn博客访问量

app.js

javascript 复制代码
const express = require('express');
const csdn = require('./csdn.js');
 
const app = express();
 
app.use(csdn);
 
app.listen(3000, function() {
  console.log('running in http://127.0.0.1:3000');
});

csdn.js

javascript 复制代码
var express = require('express')
var router = express.Router()
const iconv = require('iconv-lite')
// 添加依赖
var request = require('request')
var cheerio = require('cheerio')
/* GET users listing. */

let intervalArticle = function (urls) {
  var count = 0 // 刷了多少次
  var len = urls.length // 需要刷的文章篇数
  var co = 0 // 为了循环刷新

  setInterval(function () {
    count = count + 1
    // 随机生成0~len的数字,可以按顺序刷,也可以随机刷
    // co = Math.floor(Math.random() * len)
    // 请求博客地址
    request(urls[co].url, function (error, response, body) {
      if (!error && response.statusCode === 200) {
        let buffer = iconv.encode(`seeEount: ${count} , title: ${urls[co].title} , loadTimes: ${parseInt((count + len) / len)}`, 'binary')
        let bufferStr = iconv.decode(buffer, 'cp936')
        console.log(bufferStr)
      }
    })
    ++co
    if (co === len) {
      co = 0
    }
  }, 1500)
}

// 当前页码,这个可以自定义也可以从页面抓取,这里我就不赘述了
let indexPage = 6
// 博客地址 + /article/list/ + 页码  表示当前网页
let url = 'https://blog.csdn.net/qq_43592064/article/list/' + indexPage
// 获取博客主页
router.get('/reptile', function (req, res, next) {
  request(url, (error, response, body) => {
    if (!error && response.statusCode === 200) {
      // 获取html文档
      let $ = cheerio.load(body)
      // 计算总页数
      let allCount = $('#blog_statistics li span').first().text() || 20
      let page = parseInt(allCount) / 20
      let pageStr = page.toString()
      // 不能被整除
      if (pageStr.indexOf('.') > 0) {
        page = parseInt(pageStr.split('.')[0]) + 1
      }
      // 返回的json数据
      let data = {}
      // 文章集合
      let articles = []
      data.allPages = page
      data.currentPage = parseInt(indexPage)
      // 博客主页列表网址存在 .article-list h4 a 标签中,这个随时可能变
      $('.article-list h4 a').each((ins, el) => {
        let article = {} // 每篇文章的字典
        $(el).find(".article-type").remove()
        // 获取文本去除空格以及回车换行
        let text = ($(el).text().replace(/\ +/g, "")).replace(/[\r\n]/g, "")
        // 获取博客网址
        let url = ($(el).attr('href').replace(/\ +/g, "")).replace(/[\r\n]/g, "")
        // title太长可以隐藏
        if (text.length > 20) {
          text = text.substring(0, 20).concat('...')
        }
        article.title = text
        article.url = url
        articles.push(article)
      })
      data.articles = articles
      // 执行函数,开启定时任务,请求博客
      intervalArticle(articles)
      res.set('Content-Type', 'text/html; charset=utf8')
      res.end(JSON.stringify(data))
    } else {
      // 返回的json数据
      let data = {}
      data.msg = '爬取失败'
    }
  })
})

module.exports = router

打开浏览器输入:http://localhost:3000/reptile

后续优化:获取所有的博客链接后拼接,刷新用户名下所有的博客文章

可参考链接:https://github.com/QiYuOr2/node-spider-csdn

相关推荐
damoluomu6 小时前
SSG 的后台怎么补:Node.js 生态里的三条路(番外二)
javascript·css·typescript·node.js·html
花开富贵城7 小时前
使用fnm安装node.js包管理器
node.js
濮水大叔17 小时前
NestJS Dynamic Providers 与 Cabloy/Vona Provider Scene:同接口多实现的两种装配哲学
typescript·node.js·nestjs
silvamux_1 天前
Node.js 调用大模型 API 排错实录
node.js
Amumu121381 天前
NodeJs介绍
前端·node.js
孟陬1 天前
利用 TypeScript `asserts` function 语法定制一个类型缩窄的 `assertIncludes`
typescript·node.js
damoluomu1 天前
静态站点生成器怎么选:Node.js 生态里常用的五个(番外一)
javascript·css·typescript·node.js·html
濮水大叔1 天前
Cabloy/Vona 如何避开 NestJS 的循环依赖问题:懒属性注入机制源码解析
typescript·node.js·nestjs
月走乂山2 天前
DSH 桌面版用 DeepSeek 报 REQUEST_EXTENSION 的根因定位与修复
electron·node.js·插件系统·deepseek·bug排查·dsh·deepseek harness
斯晨的AI笔记2 天前
在服务器上跑 npm ci 四十分钟没装完,我打包把 node_modules 扔了过去
服务器·node.js