【2020/08/02更新】CSDN更新了接口API,之前的方法已经失效
写在前面
最近沉迷于个人网站开发,买了长期服务器和域名,一直在搞事情。
这篇文章的主要任务是将个人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中的代码发生了混淆,导致解析失败。将这段代码删除,则问题解决。