news 2026/5/19 17:37:30

centos+python批量导出csdn里的文章

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
centos+python批量导出csdn里的文章

首先,需要在centos里安装3.8版本以上的python,这里不再赘述,网上有的是安装步骤

检查是否安装成功

pip3 --version

安装后执行

pip3 install requests beautifulsoup4 markdownify

新建脚本

vimcsdn_downloader.py

脚本如下:

# -*- coding: utf-8 -*-importosimportreimportrequestsimporttimefrombs4importBeautifulSoupfrommarkdownifyimportmarkdownifyasmdfromurllib.parseimporturlparse,unquoteimporthashlib# 配置CSDN_USERNAME="123455"# 替换为目标博主用户名SAVE_DIR="csdn_articles"# 文章保存根目录HEADERS={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36","Referer":"https://blog.csdn.net/"}defget_article_list(username):"""获取博主文章列表(标题和URL)"""url=f"https://blog.csdn.net/{username}/article/list"articles=[]page=1whileTrue:response=requests.get(f"{url}/{page}",headers=HEADERS)soup=BeautifulSoup(response.text,'html.parser')items=soup.select(".article-list .article-item-box")ifnotitems:breakforiteminitems:title=item.select_one("h4 a").text.strip()link=item.select_one("h4 a")["href"]articles.append({"title":title,"url":link})page+=1time.sleep(1)# 避免请求过于频繁returnarticlesdefdownload_image(img_url,save_path):"""下载单张图片到本地"""try:# 设置图片下载的特定headersimg_headers=HEADERS.copy()img_headers["Accept"]="image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8"response=requests.get(img_url,headers=img_headers,stream=True,timeout=30)ifresponse.status_code==200:withopen(save_path,'wb')asf:forchunkinresponse.iter_content(chunk_size=8192):ifchunk:f.write(chunk)returnTrueelse:print(f"图片下载失败(状态码:{response.status_code}):{img_url}")returnFalseexceptExceptionase:print(f"图片下载异常:{img_url},错误:{str(e)}")returnFalsedefget_image_extension(img_url):"""从URL中获取图片扩展名"""parsed_url=urlparse(img_url)path=parsed_url.path.lower()# 常见图片格式extensions=['.jpg','.jpeg','.png','.gif','.webp','.bmp','.svg']forextinextensions:ifextinpath:returnext# 如果URL中没有明确扩展名,默认使用.jpgreturn'.jpg'defprocess_images_in_content(content,article_title):"""处理内容中的图片,下载并替换为本地路径"""soup=BeautifulSoup(content,'html.parser')img_tags=soup.find_all('img')ifnotimg_tags:returncontent# 无图片,直接返回原内容# 创建全局图片目录global_image_dir=os.path.join(SAVE_DIR,"images")os.makedirs(global_image_dir,exist_ok=True)# 创建文章特定的图片目录article_image_dir=os.path.join(global_image_dir,article_title.replace('/','_').replace('\\','_'))os.makedirs(article_image_dir,exist_ok=True)forimginimg_tags:img_url=img.get('src','')ifnotimg_url:continue# 处理相对路径的图片URLifnotimg_url.startswith(('http://','https://')):ifimg_url.startswith('//'):img_url='https:'+img_urlelse:# 如果是相对路径,可能需要拼接基础URL,这里简单跳过continuetry:# 生成唯一的图片文件名img_hash=hashlib.md5(img_url.encode()).hexdigest()[:8]img_ext=get_image_extension(img_url)img_filename=f"{img_hash}{img_ext}"# 本地图片保存路径local_img_path=os.path.join(article_image_dir,img_filename)# Markdown中使用的相对路径(相对于文章MD文件)# 提前处理文章标题,替换 '/' 和 '\' 为 '_'safe_title=article_title.replace('/','_').replace('\\','_')# 再拼接路径(此时 f-string 中无反斜杠)md_img_path=f"./images/{safe_title}/{img_filename}"# 下载图片(仅当文件不存在时)ifnotos.path.exists(local_img_path):print(f" 下载图片:{os.path.basename(img_filename)}")ifdownload_image(img_url,local_img_path):# 替换HTML中的图片URL为本地路径img['src']=md_img_pathelse:# 下载失败,保留原链接print(f" 图片下载失败,保留原链接:{img_url}")else:# 图片已存在,直接替换路径img['src']=md_img_pathexceptExceptionase:print(f" 处理图片时出错:{img_url},错误:{str(e)}")continuereturnstr(soup)defdownload_article(url,article_title):"""下载单篇文章,处理图片后转为Markdown"""try:response=requests.get(url,headers=HEADERS,timeout=30)soup=BeautifulSoup(response.text,'html.parser')content=soup.select_one("article")ifnotcontent:print(f" 未找到文章内容")returnNone# 处理图片(下载并替换路径)processed_content=process_images_in_content(str(content),article_title)# 转为Markdownmarkdown_content=md(processed_content)returnmarkdown_contentexceptExceptionase:print(f" 下载文章时出错:{str(e)}")returnNonedefsave_to_markdown(title,content,save_dir):"""保存Markdown文件"""# 创建保存目录os.makedirs(save_dir,exist_ok=True)# 文件名处理:替换特殊字符safe_title=re.sub(r'[\/:*?"<>|]','_',title)filename=f"{save_dir}/{safe_title}.md"withopen(filename,"w",encoding="utf-8")asf:f.write(f"#{title}\n\n")f.write(content)print(f" 已保存:{filename}")returnfilenameif__name__=="__main__":print("开始获取文章列表...")articles=get_article_list(CSDN_USERNAME)print(f"找到{len(articles)}篇文章")# 创建主目录os.makedirs(SAVE_DIR,exist_ok=True)success_count=0fail_count=0fori,articleinenumerate(articles,1):title=article["title"]url=article["url"]print(f"\n[{i}/{len(articles)}] 处理文章:{title}")content=download_article(url,title)ifcontent:save_to_markdown(title,content,SAVE_DIR)success_count+=1else:print(f" 文章下载失败:{title}")fail_count+=1time.sleep(2)# 添加延迟,避免请求过于频繁print(f"\n处理完成!成功:{success_count}篇,失败:{fail_count}篇")print(f"文章保存在:{os.path.abspath(SAVE_DIR)}")print("图片保存在:./images/ 目录下,Markdown文件可离线查看")

其中,脚本里CSDN_USERNAME的值,改为要获取的csdn用户名,用户名如下(URL链接里)

执行脚本

python3 csdn_downloader.py

执行日志入下:

由于要下载图片,所以很慢,静静等待即可。下载过程中,会在脚本所在目录生成一个csdn_articles文件夹,里边是md文件以及存md里的图片的文件夹。

执行后可以进行压缩保存,如压缩为zip

zip-r csdn_articles.zip csdn_articles
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/15 13:47:10

我们用过的 3种订单超时自动取消方案

大家对电商购物应该都比较熟悉了&#xff0c;我们应该注意到&#xff0c;在下单之后&#xff0c;通常会有一个倒计时&#xff0c;如果超过支付时间&#xff0c;订单就会被自动取消。下单今天&#xff0c;我们来聊聊订单超时未支付自动取消的几种方案。1.定时任务这是最容易想到…

作者头像 李华
网站建设 2026/5/16 23:41:02

13.1 分布式任务调度架构竟然可以这样做?

震撼!分布式任务调度架构竟然可以这样做? 分布式任务调度系统是现代企业级应用的重要组成部分,负责在分布式环境中高效、可靠地执行各种定时和异步任务。一个设计良好的分布式任务调度系统不仅要支持高并发和高可用,还要具备灵活的任务编排、复杂的调度策略和完善的监控能…

作者头像 李华
网站建设 2026/5/13 16:01:08

BiliPai 5.1.2 | B站开源第三方应用,纯净无广流畅

BiliPai 是一个基于 Jetpack Compose 和 Material Design 3 构建的第三方 B 站客户端&#xff0c;提供首页推荐、视频播放、账号登录&#xff08;扫码/网页&#xff09;、主题切换等核心功能。它支持高清播放、瀑布流浏览、动态配色、骨架屏加载、Lottie 动画等现代交互体验&am…

作者头像 李华
网站建设 2026/5/11 10:46:58

16.2 太牛了!分库分表和智能分片竟然还能这样实现?

16.2 太牛了!分库分表和智能分片竟然还能这样实现? 在分布式任务调度系统中,随着业务规模的增长,单一数据库往往无法满足海量数据存储和高并发访问的需求。分库分表技术是解决这一问题的关键手段。今天我们将深入探讨如何实现分库分表和智能分片策略。 分库分表架构设计 …

作者头像 李华
网站建设 2026/5/9 4:37:20

Agent Skills 检索全攻略(非常详细),颠覆你对传统 RAG 的认知!

使用 Agent Skills 做知识库检索&#xff0c;是一种什么体验&#xff1f; 它能比传统的分块向量匹配的 RAG 效果更好吗&#xff1f; 基础回顾 我们上期视频介绍了 Skills 的工作原理和使用方法&#xff0c;我们简单回顾一下&#xff1a; Skills 是最近 Anthropic 推出的一个…

作者头像 李华
网站建设 2026/5/14 16:41:02

什么是裸金属服务器(Bare Metal Server)?

什么是裸金属服务器&#xff08;Bare Metal Server)&#xff1f; 文章目录什么是裸金属服务器&#xff08;Bare Metal Server)&#xff1f;bare_metal核心特点&#xff08;与虚拟机和传统物理服务器的区别&#xff09;裸金属服务器的关键优势主要应用场景一个简单的比喻裸金属服…

作者头像 李华