博客遷移之從CSDN導出markdown格式文章

寫在前面

最近沉迷於個人網站開發,買了長期服務器和域名,一直在搞事情。

這篇文章的主要任務是將個人CSDN博客導出爲Markdown格式保存,便於後續使用Hexo或Jekyll等框架。

主要步驟

  • Step1 抓包分析

從CSDN的寫博客頁面(https://mp.csdn.net/mdeditor)抓包分析。

因爲寫博客時使用的Markdown格式,則再重新編輯某一篇文章時,瀏覽器將從CSDN服務器上請求Markdown格式博文。

直接使用瀏覽器F12功能,刷新寫作頁面,分析數據,如下圖:
在這裏插入圖片描述
可以發現,https://mp.csdn.net/mdeditor/getArticle?id=80699321 是向服務器請求的文章,服務器返回json格式數據,具體如下圖:

在這裏插入圖片描述
可以發現,其中包含多種類型格式的文章,而 markdowncontent則是markdown格式的博文。

  • Step2 模擬請求
    這一步比較簡單,主要就是模擬發包,向服務器請求數據。
    代碼如下:
def request_md(blog_id):
    """獲取博客包含markdown文本的json數據"""
    url = f"https://mp.csdn.net/mdeditor/getArticle?id={blog_id}"
    headers = {
        "cookie": "",
        "user-agent": ""
    }
    data = {"id": blog_id}
    reply = requests.get(url, headers=headers, data=data)
    markdowncontent = reply.json()["data"]["markdowncontent"]

其中,blog_id 是博客的唯一id,直接從 url 中可以獲取;而 cookie 是用戶憑證,從抓的包中複製過來即可(cookie有一定的使用時間,但是對於短時間內爬取所有文章而言綽綽有餘,不要擔心cookie過期);user-agent 同理複製。

  • Step3 獲取博客列表
    這一步,主要是從用戶的博客首頁獲取所有博客的 id 和發表日期。如我的博客首頁是 https://blog.csdn.net/qq_36962569

分析網頁源碼,然後使用 BeautifulSoup 庫解析即可
在這裏插入圖片描述
而對於很多頁的博客,同樣通過抓包分析,可以發現實際請求的 url 是 https://blog.csdn.net/qq_36962569/article/list/page
可以通過這個 url,遍歷獲取所有的博文
代碼如下:

def request_blog_list(page=1):
    """獲取博客列表
    主要包括博客的id以及發表時間等
    """
    url = f'https://blog.csdn.net/qq_36962569/article/list/{page}'
    reply = requests.get(url)
    parse = BeautifulSoup(reply.content, "lxml")
    spans = parse.find_all('div', attrs={'class':'article-item-box csdn-tracking-statistics'})
    blogs = []
    for span in spans[:3]:
        try:
            href = span.find('a', attrs={'target':'_blank'})['href']
            read_num = span.find('span', attrs={'class':'num'}).get_text()
            date = span.find('span', attrs={'class':'date'}).get_text()
            blog_id = href.split("/")[-1]
            blogs.append([blog_id, date, read_num])
        except:
            print('Wrong, ' + href)
    return blogs
    
def main(total_pages=3):
    """
    獲取博客列表,包括id,時間
    獲取博客markdown數據
    保存hexo格式markdown
    """
    blogs = []
    for page in range(1, total_pages + 1):
        blogs.extend(request_blog_list(page))
    for blog in blogs:
        blog_id = blog[0]
        date = blog[1].split(" ")[0].split("-")
        request_md(blog_id, date)
        time.sleep(1)

最終下載文件
在這裏插入圖片描述

最終遷移結果 blog.khay.site
在這裏插入圖片描述

完整代碼 GitHub 獲取

相關問題

There is a syntax error in the ‘for’ loop on line 25 of _posts/2019-04-07-【Python技能】 QtWebView + Jinja2 + JavaScript + MySQL.md. Valid syntax is 'for in ', and the variable may not contain hyphens or quotation marks. For more information, see https://help.github.com/en/articles/page-build-failed-syntax-error-in-for-loop.

發生這個原因,導致github 上的jekyll框架無法解析部署,主要原因參考官網說明
在這裏插入圖片描述
此時,再看出錯的博客文章,是關於python中使用Jinja2的文件,其中這樣一段代碼:
在這裏插入圖片描述
初步分析,此段代碼與jekyll中的代碼發生了混淆,導致解析失敗。將這段代碼刪除,則問題解決。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章