寫在前面
最近沉迷於個人網站開發,買了長期服務器和域名,一直在搞事情。
這篇文章的主要任務是將個人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
相關問題
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中的代碼發生了混淆,導致解析失敗。將這段代碼刪除,則問題解決。