前言
在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); }
我们在自己nginx的服务器中新建一个路由,配置反代,使访问/csdnImg/的请求都代理到图片的路径中
location /csdnImg/ { proxy_pass https://ucc.alicdn.com/images/user-upload-01/; }
然而使用了之后依旧是403
由于HTTP Referer防盗链的校验,我们需要在nginx中增加Referer伪装绕过校验,此外,我们可以增加User-Agent伪装隐藏真实身份、绕过一些限制,伪装成浏览器防止封禁
location /csdnImg/ { proxy_pass https://ucc.alicdn.com/images/user-upload-01/; 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/"; }
以上就是文章的全部内容,希望能帮助你