CSDN的文章轉化為Hexo的markdown格式
阿新 • • 發佈:2019-02-05
開發環境
- python3.7
引用的包
import json
import logging
import logging.handlers
import re
import urllib.request
from lxml import etree
實現思路
通過瀏覽器開發模式發現,CSDN的進入編輯器之後會通過連結
https://mp.csdn.net/mdeditor/getArticle?id=xxxx 請求到文章的markdown格式,從這裡入手就可以直接得到想要的markdown文字。
而訪問這個連結則需要登入CSDN之後獲取的cookie,可以直接在連結的header檢視得到。
實現
# 裝載cookie
opener = urllib.request.build_opener()
opener.addheaders = [('Cookie', '')]
urllib.request.install_opener(opener)
html = urllib.request.urlopen('https://mp.csdn.net/mdeditor/getArticle?id=xxxx')).read()
j = json.loads(html)
if not j['status']:
print('cookie過期')
print(j)
return
title = j['data']['title']
markdowncontent = j['data']['markdowncontent']
categories = j['data']['categories']
c_list = categories.split(',')
c_str = ""
# 新增分類
for i in c_list:
c_str += " - [{0}]\n".format(i)
tags = j['data']['tags']
# 得到Hexo的所需的markdown格式
string = "---\ntitle: {0}\nid: {4}\ndate: {3}\ntags: [{1}]\ncategories:\n{2}\n\n---\n\n<!--more-->\n\n\n\n" .format(title, tags, c_str, dic[ 'data'],dic['id'])
result = string + markdowncontent
file = open(self.output + '{0}.md'.format(title), 'w')
file.write(result)
file.close()
print(self.output + '{0}.md'.format(title) + '新增成功!')
博主用的hexo-next主題由於不支援特殊字元URL轉碼,所以標題如果帶特殊字元會無法訪問,這裡建議可以在title欄位後面新增一個id欄位,存放文章的id,並且修改hexo的_config.yml裡面的permalink為
permalink: :year/:month/:day/:id/
新版的CSDN部落格編輯器的markdown語法為CommonMark spec,暫時沒發現使用CSDN的格式之後hexo顯示異常的問題
轉換為Hexo格式實現
# 最終所有文章id和日期的陣列
result_list = []
# 獲得文章連結,由於頁面有一些評論的連結,需要過濾掉
r_str = '^https\:\/\/blog\.csdn\.net\/{0}\/article\/details\/[0-9]+$'.format(self.user)
url_re = re.compile(r_str)
# 替換url得到文章的id
replace_re = re.compile('^https\:\/\/blog\.csdn\.net\/.+\/article\/details\/')
j = 1
# 這裡直接使用迴圈代替頁碼的獲取了,當檢索不到資料的時候跳出迴圈
while True:
r = urllib.request.urlopen(self.blog_url + str(j))
html = etree.HTML(r.read())
# 獲得所有的連結
u_list = html.xpath('//*[@id="mainBox"]/main//a[@href]')
id_list = []
for uri in u_list:
ri = url_re.match(uri.attrib['href'])
if ri is not None:
# 獲取文章id和日期
data = uri.getparent().getparent().xpath('div[1]/p[1]/span')[0].text
id_list.append({'id': replace_re.sub('', uri.attrib['href']), 'data': data})
# 去掉重複的資料
temp_list = delete_duplicate(id_list)
# temp_list = id_list
if len(temp_list) == 0:
self.logger.info('結束')
break
j += 1
result_list += temp_list
# 刪除字典陣列重複的元素
def delete_duplicate(li):
temp_list = list(set([str(i) for i in li]))
li = [eval(i) for i in temp_list]
return li