news 2026/7/31 2:58:57

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/7/28 13:25:28

Spring Boot 3 步完成日志脱敏,简单实用~

在我们写代码的时候&#xff0c;会书写许多日志代码&#xff0c;但是有些敏感数据是需要进行安全脱敏处理的。对于日志脱敏的方式有很多&#xff0c;常见的有&#xff1a;①使用conversionRule标签&#xff0c;继承MessageConverter ②书写一个脱敏工具类&#xff0c;在打印日志…

作者头像 李华
网站建设 2026/7/30 9:21:07

12.2 太牛了!批量传输技术竟然还能这样用?

太牛了!批量传输技术竟然还能这样用? 在WebSocket网关中,批量传输技术是提升系统吞吐量和降低网络开销的重要手段。通过将多个小消息合并为一个大消息进行传输,可以显著减少网络交互次数,提高传输效率。本章将深入探讨批量传输技术的实现原理和应用场景。 1. 批量传输概…

作者头像 李华
网站建设 2026/7/28 1:10:09

Spring AI Embedding 实战:从语义搜索到商品推荐系统

Spring AI Embedding 实战:从语义搜索到商品推荐系统 关键词:Spring AI / Embedding / 向量数据库 / PGVector / 推荐系统 / RAG 一、什么是 Spring AI Embedding Spring AI 中的 Embedding 技术核心在于将文本、图像等非结构化数据转化为高维向量(即 Embedding)。这些向量…

作者头像 李华
网站建设 2026/7/30 12:37:51

16.1 批量任务调度和心跳优化竟然还能这样做?

16.1 太震撼了!批量任务调度和心跳优化竟然还能这样做? 在分布式任务调度系统中,性能优化是确保系统能够处理大规模任务的关键。今天我们将深入探讨批量任务调度和心跳优化技术,这些技术能够显著提升系统的吞吐量和响应速度。 批量任务调度机制 批量任务调度是提升系统性…

作者头像 李华
网站建设 2026/7/28 3:42:38

java juc 01 进程与线程

进程和线程的概念 并行和并发的概念 线程基本应用ps &#xff1a;随便写写&#xff0c;今天就是开个新章对比维度进程&#xff08;Process&#xff09;线程&#xff08;Thread&#xff09;基本概念程序运行时的一个实例&#xff0c;用来加载指令、管理内存、管理 IO进程内部的一…

作者头像 李华
网站建设 2026/7/23 1:21:52

Ella陈嘉桦「艾拉主意」巡演南宁站两晚连唱 现场嗦粉打造出圈名场面

Ella 陈嘉桦「It’s Me 艾拉主意」巡演继长沙、杭州、广州、上海站后&#xff0c;持续保持场场秒罄、口碑爆棚的火爆势头。2026年2月7日至8日&#xff0c;这场音乐盛宴落地绿城南宁&#xff0c;于广西体育中心体育馆一连两晚盛大开唱。其中2月8日场是整轮巡演中的第十场演出&am…

作者头像 李华