最近准备搭建新博客,尽管csdn的在线编辑、发布、专栏、自定义模块、模板等比较成熟,但实在没有美感,这一点令人比较失望,但在线编辑确实速度会很快,做笔记非常方便,检索也还算可以,前阵阿里云开发者社区、infoQ中国社区运营人员相继邀请去他们平台发布,但我更想尝试本地利用Obsidian工具编写笔记试试,并同步github或gitee仓库存储,博客也许会以github page依托利用hexo、Jekyll等工具发布,如果还可以同步notion或云雀就更完美。
-
- 通过传入id确立个人用户主页;
-
- 创建个人博客目录、专栏目录;
-
- 获取专栏URL、名称、篇数量;
-
- 依靠专栏URL获取对应的多页文章URL、标题;
-
- 遍历文章URL通过cookie获取文章内容并转换markdown格式;
-
- 自动下载文章内嵌图片到本地,存放于各分类目录的
images/子目录,并将 markdown 中的远程图片链接替换为本地相对路径(./images/)。
- 自动下载文章内嵌图片到本地,存放于各分类目录的
$ git clone https://github.com/Ghostwritten/csdn_to_md.git 第二阶段后,项目按轻量模块化组织:
csdn_to_md.py # 兼容旧用法的入口脚本
csdn_to_md/
cli.py # 命令行解析与流程调度
config.py # 常量与日志配置
exceptions.py # 自定义异常
exporter.py # 导出主流程
http_client.py # 请求重试与会话封装
models.py # 数据模型
utils.py # 路径和 ID 解析工具
tests/
test_utils.py
test_exporter.py
- Python 3.9+
- 依赖见 requirements.txt
安装依赖:
pip install -r requirements.txt注意:本项目使用
curl_cffi模拟 Chrome 浏览器的真实 TLS 指纹,以绕过 Cloudflare 等反爬机制,请勿替换为标准requests库。
Chrome 浏览器登录 CSDN 平台,按 F12 找到当前登录态 Cookie。
推荐通过环境变量传入,而不是直接修改源码:
export CSDN_COOKIE='你的_cookie'也可以通过命令行参数传入:
python3 csdn_to_md.py -i xixihahalelehehe --cookie '你的_cookie'$ export CSDN_COOKIE='你的_cookie'
$ python3 csdn_to_md.py -i xixihahalelehehe
download blog markdown blog:【helm】helm_快速学习手册
download blog markdown blog:【helm】如何开发一个完整的Helm_charts应用实例
download blog markdown blog:【helm】helm_将yaml文件转换json的插件helm-schema-gen
download blog markdown blog:【helm】helm_NOTES.txt
download blog markdown blog:【helm】helm_test_测试详解
download blog markdown blog:【helm】helm_charts_入门指南
download blog markdown blog:【helm】openshift_Certified_Helm_Charts_实践
download blog markdown blog:【helm】Helm_Values.yaml
......
$ cd xixihahalelehehe
$ /xixihahalelehehe# tree
.
├── ansible
│ ├── anible_【模块】_notify.md
│ ├── ansbile【模块】replace_替换.md
│ ├── ansbile_模块开发-自定义模块.md
│ ├── ansible_assert_模块.md
│ ├── ansible_become配置.md
│ ├── ansible_cron_模块.md
│ ├── ansible_debug模块.md
│ ├── ansible_delegate_to_模块.md
│ ├── ansible_file模块详解.md
│ ├── ansible_gather_facts配置.md
│ ├── ansible_hosts_and_groups配置.md
│ ├── ansible_jinja2详解.md
│ ├── ansible-playbook_role角色.md
│ ├── ansible-playbook实战.md
│ ├── ansible_script模块.md
│ ├── ansible_set_fact模块.md
│ ├── ansible_URI模块.md
│ ├── ansible【任务】安装httpd.md
│ ├── ansible变量.md
│ ├── ansible_安装.md
│ ├── ansible_快速学习手册.md
│ ├── ansible【模块】add_host.md
│ ├── ansible【模块】blockinfile.md
│ ├── ansible_【模块】find.md
│ ├── ansible【模块】include_tasks.md
│ ├── ansible【模块】linefile_文件行处理.md
│ ├── ansible【模块】modprobe.md
│ ├── ansible【模块】pause.md
│ ├── ansible_【模块】sysctl.md
│ ├── ansible【模块】systemd.md
│ ├── ansible【模块】template.md
│ ├── ansible【模块】yum.md
│ ├── ansible_系统选择性执行脚本.md
│ ├── ansible远程容器机种方法.md
│ └── ansible_配置.md
├── blog
│ ├── github如何搭建一个博客.md
│ ├── jekyll的一个主题TeXt-theme拆解.md
│ ├── jekyll配置管理github博客.md
│ ├── 如何使用jekyll插件.md
│ ├── 如何安装jekyll并搭建一个博客.md
│ └── 如何购买域名.md
├── c++
│ └── makefile入门.md
├── camera
│ ├── A7R2_图标列表.md
│ ├── sony_A7R2介绍.md
│ └── SONY_A7R2_基础操作.md
├── Cisco
│ ├── 运维之思科篇_-----1.VLAN_、_Trunk_、_以太通道及DHCP.md
│ ├── 运维之思科篇_-----2.vlan间通讯_、_动态路由.md
│ ├── 运维之思科篇_-----3.HSRP(热备份路由协议),STP(生成树协议),PVST(增强版PST).md
│ ├── 运维之思科篇_-----4._标准与扩展ACL_、_命名ACL.md
│ ├── 运维之思科篇_-----5._NAT及静态转换_、_动态转换及PAT.md
│ ├── 运维之思科篇_-----6..md
│ └── 运维之思科篇_-----6.思科项目练习.md
支持自定义输出目录:
python3 csdn_to_md.py -i xixihahalelehehe -o ./exports如需跳过图片下载、保留原始远程链接,使用 --no-images 标志:
python3 csdn_to_md.py -i xixihahalelehehe -o ./exports --no-images脚本完成后会输出总数、成功数和失败数;如果 Cookie 失效、网络超时或接口异常,会明确打印错误信息。
下载完成后,每个分类目录下会生成 images/ 子目录用于存放该分类的本地图片:
xixihahalelehehe/
├── 云原生/
│ ├── images/
│ │ ├── 119548181_01.png
│ │ ├── 119548181_02.png
│ │ └── ...
│ ├── Kubernetes_声明式API.md
│ └── ...
├── ansible/
│ ├── images/
│ │ └── ...
│ └── ...
└── ...
图片命名规则为 {文章ID}_{序号:02d}.{扩展名},例如 119548181_01.png。
- 缺少 Cookie:脚本会直接退出,请通过 --cookie 或环境变量 CSDN_COOKIE 提供。
- Cookie 失效:如果接口未返回 markdowncontent,通常是登录态已过期,需要重新从浏览器获取。
- 文件名异常:脚本会自动替换路径中的非法字符,避免创建文件失败。
