【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 blogsdef 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中的代码发生了混淆,导致解析失败。将这段代码删除,则问题解决。

博客迁移之从CSDN导出markdown格式文章相关推荐

  1. 计算机技术博客博客知乎,我的技术博客的选择:CSDN、博客园、简书、知乎专栏仍是Github Page?...

    有不少技术人员在学习到必定程度后发现了写博客的重要性,一方面帮助本身记忆,一方面也能帮助他人解决问题,因而会选择本身开始写博客,以后又发现平台太多不知从何下手,在这里我根据本身写博客的经验比较一下各个 ...

  2. 个人技术博客的选择:CSDN、博客园、简书、知乎专栏还是Github Page?

    有很多技术人员在学习到一定程度后发现了写博客的重要性,一方面帮助自己记忆,一方面也能帮助他人解决问题,于是会选择自己开始写博客,之后又发现平台太多不知从何下手,在这里我根据自己写博客的经验比较一下各个 ...

  3. github博客迁移——图床搭建

    之前在github自己搭的博客写了一段时间,但是用多了还是感觉没有第三方平台维护舒适,遂回退csdn,要把之前的博客迁移回来,但是最麻烦的就是博客中的图片太多,这时候就要用到图床了. 1. PicGo ...

  4. 技术博客哪家强:CSDN、博客园、简书、开源中国OSChina等博客的详细分析比较

    技术博客哪家强 文章目录 技术博客哪家强 前言 为什么要写博客 技术博客哪家好 几家主要网站的对比 初步结论 参考资料 前言 最近这段时间不是很忙,想干点儿什么有意义的事儿.抽空系统学学Python这 ...

  5. 如何用 Windows Live Writer 和 Word 2013 分别发表博客到Cnblog 和CSDN

    ps CSDN 老是505错误,放弃了 为什么会写这篇 最近写博客在 Cnblog 上面写博客, 发现图片不能复制了直接粘贴上,这对于把博客当随手笔记的人来说无疑非常痛苦.求助于博客园,他们让我用 W ...

  6. 博客迁移至http://www.vlix.org/

    博客迁移至 http://www.vlix.org/  敬请关注 多谢关注,如有疑问可以在www.vlix.org/留言. 转载于:https://blog.51cto.com/weiliu/1582 ...

  7. 博客搬迁地址到csdn了

    博客搬迁地址到csdn了 转载于:https://www.cnblogs.com/YangBinChina/p/3724403.html

  8. 在word上写博客直接发到CSDN

    转载自maofgit的博客:http://blog.csdn.net/maofgit/article/details/50715628 用csdn自带的网页编辑器,最不方便的,不是排版,而是图片的发布 ...

  9. Hexo博客迁移到腾讯云

    一开始博客在github pages上,速度比较慢.后来在网上发现许多人说托管到Netify很快,还自带CDN加速.但我迁移过去,发现国内的网根本就登不上,又检测了一下在大陆访问博客的速度,惨不忍睹. ...

最新文章

  1. pangilin 安装编译
  2. 「深入浅出」了解语音识别的技术原理和应用价值?
  3. 洛谷P2178 品酒大会
  4. hdu 4289 Control
  5. IDEA中安装MyBatis Log Plugin插件完整显示执行的mybatis的sql语句
  6. OpenGL 面剔除Face culling
  7. 学Android的学习规划
  8. for in for of区别_Python 第5课:for…in循环黄金搭档之列表
  9. 【Qt开发经验】Qt信号槽连接不成功问题原因汇总
  10. Python pytest框架之@pytest.fixture()和conftest详解
  11. 事务演练 mysql
  12. Caused by: java.lang.NumberFormatException: For input string: 18446744073709551615
  13. XJTU_选课小助手
  14. paypal 支付接口开发--Java版
  15. 一款开源免费的网站监控系统
  16. 第四周项目3--单链表应用之逆置
  17. ESP8266-Arduino编程实例-BMM150数字地磁传感器驱动
  18. Delphi 2009发布
  19. Struts2通配符映射/Struts action name=/*/* method={2} class=com.jxc.action.{1}Action result
  20. PostgreSql数据库增删改查以及其他基本命令

热门文章

  1. 无限磁力_磁力链_给力的磁力搜索网站你都知道吗?
  2. 公交卡测试用例 / qq登录测试用例 / 微信红包测试用例 / qq表情收藏测试用例
  3. springmvc集成freemarker_晏无心_新浪博客
  4. DxO Optics Pro 9.5 builder 114 汉化版
  5. 二叉树非递归后序遍历
  6. 自学Python 58 Socket套接字编程 (一)
  7. 58. 缓冲区溢出篇——缓冲区溢出原理简介
  8. 离散傅里叶变换(DTFT) MATLAB实例
  9. as608指令c语言,单片机+AS608的使用,并带程序
  10. 大连27中学距离计算机学校多远,62中学附近学校