news 2026/4/15 22:03:29

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/4/16 10:16:44

肠道菌群防御新解:多样性驱动的营养竞争是抵抗病原体定植的核心

一、肠道菌群定植抗性机制&#xff1a;营养竞争抑制病原体入侵 肠道菌群构成一个复杂的生态系统&#xff0c;可依据其功能特性划分为三类&#xff1a;有益菌、中性菌与病原菌。其中&#xff0c;有益菌作为肠道定植菌的核心组成部分&#xff0c;在维持肠道稳态与健康中发挥关键…

作者头像 李华
网站建设 2026/4/16 10:17:17

12.1 性能优化秘籍:如何将网关性能提升10倍?

性能优化秘籍:如何将网关性能提升10倍? WebSocket网关作为实时通信系统的核心组件,其性能直接影响用户体验和系统扩展能力。在高并发场景下,如何优化网关性能、提升吞吐量、降低延迟是每个架构师和开发者都需要面对的挑战。本章将深入探讨WebSocket网关的性能优化技术和实…

作者头像 李华
网站建设 2026/4/16 10:16:26

15.2 太牛了!任务超时控制和重试策略竟然还能这样实现?

15.2 太牛了!任务超时控制和重试策略竟然还能这样实现? 在分布式任务调度系统中,任务超时控制和重试策略是确保系统稳定性和任务可靠执行的重要机制。今天我们将深入探讨如何实现这些关键功能。 任务超时控制机制 任务超时控制是防止任务执行时间过长而阻塞系统资源的重要…

作者头像 李华
网站建设 2026/4/8 13:56:56

微信小程序 基于物联网技术的宠物定位与监控系统设计

目录微信小程序与物联网技术的宠物定位监控系统设计摘要项目技术支持可定制开发之功能亮点源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作微信小程序与物联网技术的宠物定位监控系统设计摘要 该系统结合微信小程序与物联网技术&#xff0c…

作者头像 李华
网站建设 2026/4/16 12:32:31

Java毕设选题推荐:基于springboot的软件协作跟踪平台的设计与开发基于springboot的软件开发项目任务跟踪系统的设计与实现【附源码、mysql、文档、调试+代码讲解+全bao等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/4/16 12:05:39

本地 LLM 实战基础教程(非常详细),手把手教你做文本情感分析!

我们已经把一整套“大模型落地环境”铺好了&#xff1a; 用 Ollama 把开源大模型跑在本地学会 API 调用 LLM 封装把 AI 塞进 VS Code Remote SSH尝试了更偏工程和性能的 vLLM 推理框架 但这一步都会有一个真实的疑问&#xff1a; “环境是搭好了&#xff0c;但它到底能帮我…

作者头像 李华