Node實現CSDN博客導出(后續)
前言
在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/";
}
以上就是文章的全部內容,希望能幫助你

浙公網安備 33010602011771號