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

本文最后更新于:9 个月前

前言

在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 http://website.diehunter1024.work/csdnImg/;
}

然而使用了之后依旧是403

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

location /csdnImg/ {
    proxy_pass http://website.diehunter1024.work/csdnImg/;
    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部署