Node实现CSDN博客导出(后续)

news2024/12/23 18:19:10

前言

在2021年我实现了一个Node导出博客的功能:爬取接口及博客页面并导出为md文件格式。中途有许多迭代及优化以及解决了一些关键问题,写篇文章做个记录和review

博客更新功能

在原有的导出功能上增加了博客更新的功能,避免了每次都全部导出,是否消耗时间。在命令中新增-update命令进行升级操作,如使用node server -type:csdn -id:time_____ -update
更新时会对比博客名称是否存在,如果没有则会单独导出这篇文章。核心代码是

  startLoadBlogItem: async () => {
    const newData = getBlogConfig().blogList;
    let temp = newData;
    console.log(`获取列表成功,共${newData.length}篇文章`);
    if (global.update) {
      const oldData = (await readFile(global.type, "./temp/")).toString(
        "utf-8"
      );
      // temp表示待导出的博客列表
      temp = getArrayAddItems(stringToJson(oldData) ?? [], newData);
      console.log(`本次更新${temp.length}篇文章`);
    }
    writeFile(global.type, JSON.stringify(newData), "./temp/");
    return messageCenter.emit("getBlogInfo", temp);
  },

以及下面的更新数据操作,我的做法是在根目录新增了一个文章缓存的temp目录,第一次加载时会将文章列表存在文件中,后续update时只需对比一下列表长度并截取新增的文章列表即可

// 获取数组更新项
function getArrayAddItems(oldList = [], newList = [], key = "title") {
  return newList.filter((it) => !!!oldList.find((i) => i[key] === it[key]));
}

具体改动见:博客更新

同时,我们可以在Jenkins中修改一下pipeline,以及使用构建触发器通过定时自动触发,这样就可以每天自动更新博客了

图片防盗链

由于爬取博客使用的是原图片,一般图片都会使用图片防盗链防止异常请求,如果使用非法Referer访问对方的资源就会抛错

如果使用浏览器打开就正常此时就来到了第二个优化点:反代,使用replace替换原有的img地址到我的本地nginx服务器上,下面是代码中的修改点

// 替换图片地址,拿nginx做个代理
function replaceImgUrl(content) {
  const { imgUrl, imgProxyUrl } = getBlogConfig();
  const rule = new RegExp(`(${imgUrl})`, "g");
  return content.replace(rule, imgProxyUrl);
}

以及commit

参照之前的文章:Nginx常用指令,基本配置,反向代理_DieHunter1024的博客-CSDN博客

我们在自己nginx的服务器中新建一个路由,配置反代,使访问/csdnImg/的请求都代理到图片的路径中

        location /csdnImg/ {
            proxy_pass https://img-blog.csdnimg.cn/;
        }

然而使用了之后依旧是403

由于HTTP Referer防盗链的校验,我们需要在nginx中增加Referer伪装绕过校验,此外,我们可以增加User-Agent伪装隐藏真实身份、绕过一些限制,伪装成浏览器防止封禁

        location /csdnImg/ {
            proxy_pass https://img-blog.csdnimg.cn/;
            proxy_set_header User-Agent "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36";
            proxy_set_header Referer "http://blog.csdn.net/";
        }

以上就是文章的全部内容,希望能帮助你

源码地址:blog_website: 基于 node 编写的CSDN博客导出的爬虫脚本+hexo部署

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/455531.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java7

Java7 (一)、集合体系(二)、Collection(三)、Collection的遍历方式3.1迭代器3.2增强for遍历3.3 Lambda表达式遍历 (四)、List(五)、数据结构5.1 栈5.2 队列5.…

C learning_8

猜数字游戏 猜数字游戏: 1.电脑会随机产生一个数 2.猜数字 a>猜大了,提醒猜大了,继续猜 b>猜小了,提醒猜小了,继续猜 c>猜对了,恭喜你,猜对了,游戏结束 3.玩完之后可以继续…

给httprunnermanager接口自动化测试平台加点颜色(一)

文章目录 一、背景1.1、部署过程略 二、使用过程2.1、新增接口列2.2、实现搜索效果 三、总结 一、背景 https://github.com/httprunner/HttpRunnerManager.git从github上找的接口测试平台,引入公司作为测试协同测试的平台,底层框架基于httprunner(reque…

SOLIDWORKS钣金设计需要考虑的折弯问题

设计需要考虑,究竟哪些是成型前加工,究竟哪些是成型后加工。 考虑工作制作工艺过程中,必须先折弯,后加工部分孔的情况有: 距离折弯边很近的圆孔,方孔,腰圆孔,螺纹等,下…

如何测试信号源或者发射机的回波损耗

信用源或者发射机的return loss测试过程 1.用网分线缆的第一步就是看线的抖动情况,后面还是要多注意 经过一系列排查后,选用两个抖动比较小的线缆,然后开始测试另外一台仪器。 2.检查测试仪器的输出功率,见图1 打开信号源或者发射…

项目管理-项目经理的5种权力

1、项目团队:是执行项目工作,以实现项目目标的一组人员,由为了完成项目而承担不同角色与职责的人员组成。 项目团队成员可能具备不同的技能,可能是全职的或兼职的,也可能随项目进展而增加或减少。尽管项目团队成员被分…

Mysql列的类型定义(二进制类型)

文章目录 前言一、类型图二、类型 1.BINARY和VARBINARY2.BIT类型3.BLOB类型三、实战建议总结 前言 二进制数据和文本数据在mysql 中的最大区别在于: 二进制类型存储原始的二进制数据(如图片,视频,exe文件等)。文本类型(TEXT)用来存储字符字…

【13】SCI易中期刊推荐——计算机工程 | 电子与电气(中科院4区)

💖💖>>>加勒比海带,QQ2479200884<<<💖💖 🍀🍀>>>【YOLO魔法搭配&论文投稿咨询】<<<🍀🍀 ✨✨>>>学习交流 | 温澜潮生 | 合作共赢 | 共同进步<<<✨✨ 📚📚>>>人工智能 | 计算机视觉…

【嵌入式】HC32F定时器PWM输出+PAC芯片实现模拟DA输出

目录 一 项目背景 二 原理说明 三 设计实现——定时器初始化 四 设计实现——PWM输出 五 梳理总结 一 项目背景 目前使用了TI的DAC芯片DAC7311&#xff0c;将MCU的4-20/0-20数据转化电压信号&#xff0c;经由一系列电路&#xff0c;最终输出4-20/0-20mA电流输出。 但是限于…

执行composer update报错(Segmentation fault php “${dir}/composer.phar“ “$@“)

在php项目中执行composer update&#xff0c;出现如图报错 可在php.ini文件中开启xdebug扩展&#xff0c;即可更新成功

(数字图像处理MATLAB+Python)第六章图像平滑-第二节:频域平滑滤波

文章目录 一&#xff1a;理想低通滤波&#xff08;1&#xff09;概述&#xff08;2&#xff09;程序 二&#xff1a;巴特沃斯低通滤波&#xff08;1&#xff09;概述&#xff08;2&#xff09;程序 三&#xff1a;指数低通滤波&#xff08;1&#xff09;概述&#xff08;2&…

Day1_vue集成elementUI主体布局

本次&#xff0c;将从0开始带你手撸一套SpringBootVue后台管理系统 从前端到后端&#xff0c;手把手搭建&#xff0c;方便学习从0学会基础实战&#xff01;&#xff01;&#xff01; 目录 软件版本 前端开发环境安装&#xff1a; vue-cli安装 : npm设置淘宝镜像加速: 创建v…

vue2+vue3——1~35

vue2vue3 尚硅谷vue2vue2 课程简介【02:24】vue2 Vue简介【17:59】vue2 Vue官网使用指南【14:07】vue2 搭建Vue开发环境【13:54】vue2 Hello小案例【22:25】了解&#xff1a; 不常用常用&#xff1a;id 更常用 简单class 差值总结vue 实例vue 模板 &#xff1a; 先 取 &#xf…

【香橙派+DHT11】香橙派(全志H616)+ DHT11温湿度传感器的驱动教程

目录 一、前言产品概述特点数据传送逻辑DHT11通信时序 二、代码GPIO初始化起始信号读取数据整体代码执行结果 一、前言 最近写DHT11的代码到香橙派&#xff08;全志H616&#xff09;上&#xff0c;发现网上案例基本上都是树莓派DHT11的居多&#xff0c;香橙派的少&#xff0c;…

Linux进程通信:无名管道

进程通信目的&#xff1a; &#xff08;1&#xff09;数据传输&#xff1a;进程间数据传输&#xff1b; &#xff08;2&#xff09;通知事件&#xff1a;一个进程向另一个或一组进程发送消息&#xff0c;通知某个事件的发生&#xff08;如子进程终止时需通知父进程&#xff0…

使用Lim测试平台快速完成批量造数

一、前言 在我们平时的测试过程中&#xff0c;经常遇到需要造大量数据的情况&#xff0c;比如&#xff1a;测试分页功能&#xff0c;性能压测、数据准备等。 这时我们可以通过写脚本或jmeter这类的工具来实现&#xff0c;但这些方式在团队协作的时候并不友好&#xff0c;当别人…

MySQL 函数和运算符

文章目录 一、MySQL 函数二、MySQL 运算符总结 一、MySQL 函数 MySQL 有很多内置的函数&#xff0c;以下列出了这些函数的说明。 二、MySQL 运算符 算术运算符 比较运算符 逻辑运算符 位运算符算术运算符 MySQL 支持的算术运算符包括: 除法运算和模运算中&#xf…

(2)elasticsearch环境搭建(win10)

安装jdk 版本选择&#xff1a;最好是java 8、java11或者java14 jdk兼容性&#xff1a;https://www.elastic.co/cn/support/matrix#matrix_jvm 操作系统兼容性&#xff1a;https://www.elastic.co/cn/support/matrix 自身兼容性&#xff1a;https://www.elastic.co/cn/suppo…

Linux下版本控制器(SVN) -服务器端环境搭建步骤

文章目录 进阶知识-Linux下版本控制器(SVN)4、服务器端环境搭建步骤4.1 安装服务器端程序4.2 验证是否安装成功4.3 创建并配置版本库4.4 配置 SVN对应的服务4.5 启动 SVN服务 本人其他相关文章链接 进阶知识-Linux下版本控制器(SVN) 4、服务器端环境搭建步骤 4.1 安装服务器端…

AD7356_SPI驱动程序设计_5MSPS_Verilog

好久没动手了&#xff0c;使用Verilog编写一个AD7356的SPI驱动程序。 AD7356是一个双通道、12位、低功耗的ADC。最高采样速率可达5MSPS&#xff0c;全功率输入带宽为110MHz。AD7356的引脚图如下。 SPI的时序图如下&#xff0c;为了使单通道的采样速率达到最高的5MSPS&#xff…