前言
在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部署