
迁移、备份博客_从CSDN批量导出markdown格式的文章(Python+BeautifulSoap)
API密钥和会话信息:在实际使用中需要替换为个人账号的 cookie 和 session ID 页眉页脚处理:需要根据不同分页实现是否需要停留时长3.しょっぱい: 使用代理或者更高级的请求方式以应对限制 schoepfer: 定期清理旧文件或设置定期备份策略
发布日期:2021-05-18 03:14:02
浏览次数:26
分类:精选文章
本文共 3310 字,大约阅读时间需要 11 分钟。
如何从CSDN批量导出Markdown格式的文章?
在之前的博客迁移过程中,由于每次复制粘贴的复杂性和格式混乱的问题,让我意识到需要找到一套高效的文章管理方案。于是我决定研究如何批量导出CSDN的文章并转换为统一的Markdown格式。以下是详细的实现过程及解决方案。
一、整体思路
CSDN自带导出功能是内置的,但仅能单篇导出,无法实现批量操作。因此需要利用BeautifulSoup库,通过抓取网页数据,提取文章内容并转换格式。
需要解决的问题包括:
- 如何区分每一篇文章(获取文章ID和唯一标识)
- 如何处理分页,确保能够抓取所有文章
- 如何解析获取到的数据,转换成统一格式的Markdown文件
二、实现流程
通过F12开发者工具或完美日记的网页源查看,可以发现CSDN文章页面的主要数据来源于以下几个步骤:
获取文章列表:
- 使用curl或request库发送GET请求,获取指定页数的文章列表
- 提取文章ID、发布时间等信息,建立数据模型存储
获取单篇文章内容:
- 使用文章ID调用CSDN API获取完整文章内容
- 提取Markdown格式的文本、标题、标签等信息
转换为Markdown文件:
- 使用BeautifulSoup解析获取的数据
- 按照Hexo博客格式生成Markdown文件
- 存储文件,准备迁移到目标平台
三、解决过程中的问题及解决方法
当前实现的限制:
- 获取文章列表时仅能获取前40条数据
- 部分接口请求会返回JSON解析错误
解决方法:
- 优化请求参数,确保获取完整的文章列表
- 增加请求重试机制,处理接口异常
- 添加睡眠时间,避免过度请求
三、完整代码示例
import requestsimport uuidfrom bs4 import BeautifulSoupimport jsonimport timeimport redef request_blog_list(page): """获取指定页数的文章列表""" url = f'https://blog.csdn.net/pang787559613/article/list/{page}' reply = requests.get(url, headers={ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36' }) if reply.status_code != 200: return [] parse = BeautifulSoup(reply.text, 'lxml') articles = parse.find_all('div', class_='article-item-box csdn-tracking-statistics') blogs = [] for article in articles: try: href = article.find('a', target='_blank')['href'] blog_id = href.split('/')[-1] title = article.find('h2').get_text(strip=True) date = article.find('div', class_='date').get_text(strip=True) read_num = article.find('div', class_='num').get_text(strip=True) blogs.append([blog_id, date, read_num]) except AttributeError: print(f'文章信息缺失: {href}') return blogsdef request_md(blog_id, date): """获取指定文章的Markdown内容""" url = f'https://blog-console-api.csdn.net/v1/editor/getArticle?id={blog_id}' headers = { 'cookie': f'uuid_tt_dd={uuid.uuid)}, {time.time()}; ...', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36' } reply = requests.get(url, headers=headers) if reply.status_code == 200: data = reply.json() write_hexo_md(data, date) else: print(f'请求失败: {url}')def write_hexo_md(data, date): """将数据写入Hexo格式的Markdown文件""" title = data.get('data', {}).get('title', '') title = re.sub(r'\[.*\]', '', title) tags = data.get('data', {}).get('tags', []) date = re.findall(r'\d+-\d+-\d+', date) name = '-'.join(date) + ('-' + re.sub(r'[\[\]\(]','','-'+title.replace(' ', '-') if title else '') if title else '') content = data.get('data', {}).get('markdowncontent', '') with open(f'blogs/{name}.md', 'w', encoding='utf-8') as f: f.write(content)def main(): """主函数,处理批量导出""" blogs = [] for page in range(1, 5): blogs.extend(request_blog_list(page)) for blog in blogs: blog_id, date_str, read_num = blog date = date_str.split() if len(date) < 3: continue sleep(1) request_md(blog_id, date)if __name__ == '__main__': main()
四、注意事项
以上代码提供了一个可扩展的批量导出框架,具体使用中可根据实际需要调整参数和处理逻辑。
发表评论
最新留言
初次前来,多多关照!
[***.217.46.12]2025年05月21日 22时30分24秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
MicroJob 任务注册中心添加 Nacos 支持,升级 0.0.3 版本
2025-04-14
Microsoft Access 详解-chatgpt4o作答
2025-04-14
Microsoft AI-System 开源项目教程
2025-04-14
Microsoft Project Acoustics 开源项目教程
2025-04-14
Microsoft Security Updates API 使用教程
2025-04-14
Microsoft SQL Server 2000收缩MDF数据
2025-04-14
Microsoft SQL Server 2005 提供了一些工具来监控数据库
2025-04-14
Microsoft Store 里面应用没有获取和安装按钮,无法安装应用 怎么办?
2025-04-14
Microsoft Windows XP SP3安装测试手记
2025-04-14
Microsoft.CSharp.targets不存在解决方法
2025-04-14
MIF格式详解,javascript加载导出 MIF文件示例
2025-04-14
Miller rabin
2025-04-14
miller-rabin matlab,Miller-Rabin素数判断算法
2025-04-14
mime类型大全 input file accept
2025-04-14
Mimikatz2.2 如何抓取Win11登录明文密码
2025-04-14
mina1.7
2025-04-14
mindspore生物图像分割[U-Net]演示
2025-04-14