Skip to content

Ghostwritten/csdn_to_md

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

10 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

csdn 文章批量转换markdown格式下载至本地

1. 背景

最近准备搭建新博客,尽管csdn的在线编辑、发布、专栏、自定义模块、模板等比较成熟,但实在没有美感,这一点令人比较失望,但在线编辑确实速度会很快,做笔记非常方便,检索也还算可以,前阵阿里云开发者社区infoQ中国社区运营人员相继邀请去他们平台发布,但我更想尝试本地利用Obsidian工具编写笔记试试,并同步githubgitee仓库存储,博客也许会以github page依托利用hexoJekyll等工具发布,如果还可以同步notion云雀就更完美。

2.功能

    1. 通过传入id确立个人用户主页;
    1. 创建个人博客目录、专栏目录;
    1. 获取专栏URL、名称、篇数量;
    1. 依靠专栏URL获取对应的多页文章URL、标题;
    1. 遍历文章URL通过cookie获取文章内容并转换markdown格式;
    1. 自动下载文章内嵌图片到本地,存放于各分类目录的 images/ 子目录,并将 markdown 中的远程图片链接替换为本地相对路径(./images/)。

3. 下载

$ 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

4. 环境要求

  • Python 3.9+
  • 依赖见 requirements.txt

安装依赖:

pip install -r requirements.txt

注意:本项目使用 curl_cffi 模拟 Chrome 浏览器的真实 TLS 指纹,以绕过 Cloudflare 等反爬机制,请勿替换为标准 requests 库。

5. 配置

Chrome 浏览器登录 CSDN 平台,按 F12 找到当前登录态 Cookie。

推荐通过环境变量传入,而不是直接修改源码:

export CSDN_COOKIE='你的_cookie'

也可以通过命令行参数传入:

python3 csdn_to_md.py -i xixihahalelehehe --cookie '你的_cookie'

获取cookie

6. 演示

$ 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

7. 技术

8. 常见问题

  • 缺少 Cookie:脚本会直接退出,请通过 --cookie 或环境变量 CSDN_COOKIE 提供。
  • Cookie 失效:如果接口未返回 markdowncontent,通常是登录态已过期,需要重新从浏览器获取。
  • 文件名异常:脚本会自动替换路径中的非法字符,避免创建文件失败。

9. 参考


About

csdn批量转换MD格式并下载至本地

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages