迁移、备份博客_从CSDN批量导出markdown格式的文章(Python+BeautifulSoap)
发布日期: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()

    四、注意事项

  • API密钥和会话信息:在实际使用中需要替换为个人账号的 cookie 和 session ID
  • 页眉页脚处理:需要根据不同分页实现是否需要停留时长3.しょっぱい: 使用代理或者更高级的请求方式以应对限制
  • schoepfer: 定期清理旧文件或设置定期备份策略
  • 以上代码提供了一个可扩展的批量导出框架,具体使用中可根据实际需要调整参数和处理逻辑。

    上一篇:Xcode11控件位置_Mac
    下一篇:Win10_cmd下提示:‘xxx’不是内部或外部命令,也不是可运行的程序 或批处理文件

    发表评论

    最新留言

    初次前来,多多关照!
    [***.217.46.12]2025年05月21日 22时30分24秒