importrequestsimportosfromtqdmimporttqdmfromurllib.parseimporturlparseimporttimedefdownload_audio_with_progress(url,output_filename=None,chunk_size=8192):""" 下载音频文件并显示进度条 Args: url: 音频文件的URL output_filename: 输出文件名(可选) chunk_size: 下载块大小 """# 如果未指定输出文件名ifoutput_filenameisNone:parsed_url=urlparse(url)filename=os.path.basename(parsed_url.path)iffilename.endswith('.m4a'):filename=filename[:-4]+'.mp3'else:filename='audio.mp3'output_filename=filename# 确保是mp3扩展名ifnotoutput_filename.endswith('.mp3'):output_filename+='.mp3'# 请求头headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36','Referer':'https://music.163.com/','Accept-Encoding':'identity',# 不压缩,避免进度条计算错误}try:print(f"开始下载:{url}")print(f"目标文件:{output_filename}")# 先发送HEAD请求获取文件信息head_response=requests.head(url,headers=headers,timeout=10,allow_redirects=True)ifhead_response.status_code!=200:print(f"无法访问文件,状态码:{head_response.status_code}")returnFalse# 获取文件大小total_size=int(head_response.headers.get('content-length',0))iftotal_size==0:print("无法获取文件大小,使用简单下载方式...")response=requests.get(url,headers=headers,timeout=30)ifresponse.status_code==200:withopen(output_filename,'wb')asf:f.write(response.content)print(f"下载完成:{output_filename}")returnTrueelse:print(f"下载失败,状态码:{response.status_code}")returnFalseprint(f"文件大小:{total_size}bytes ({total_size/1024/1024:.2f}MB)")# 下载文件response=requests.get(url,headers=headers,stream=True,timeout=30)response.raise_for_status()# 使用进度条progress_bar=tqdm(total=total_size,unit='B',unit_scale=True,desc="下载进度")start_time=time.time()downloaded=0withopen(output_filename,'wb')asfile:forchunkinresponse.iter_content(chunk_size=chunk_size):ifchunk:file.write(chunk)downloaded+=len(chunk)progress_bar.update(len(chunk))progress_bar.close()# 计算下载速度download_time=time.time()-start_time download_speed=downloaded/download_time/1024# KB/sprint(f"\n✓ 下载完成!")print(f"文件:{output_filename}")print(f"大小:{downloaded}bytes ({downloaded/1024/1024:.2f}MB)")print(f"用时:{download_time:.2f}秒")print(f"平均速度:{download_speed:.2f}KB/s")returnTrueexceptrequests.exceptions.RequestExceptionase:print(f"网络请求错误:{e}")returnFalseexceptExceptionase:print(f"下载过程出错:{e}")returnFalse# 使用示例if__name__=="__main__":url="https://m804.music.126.net/20260109213219/ee92fda0d2911d7370c96aa34eb815cb/jdyyaac/obj/w5rDlsOJwrLDjj7CmsOj/32476997212/2f07/079a/b3d6/8d7289ffa74ff0440ef61a183f2bb5a3.m4a?vuutv=MRWyryPhgRfUqVNXymxtqJwVWD7my2buPLQ0Tfa7IqdyJXX+CoI8CokjgMRbmooCGheI8cBob0+D9z7L3f+8ktVpmdJEeFic3eXu9BX++G0=&authSecret=0000019ba2de593002870a64a80a0006"# 指定输出文件名output_filename="my_music.mp3"# 下载文件success=download_audio_with_progress(url,output_filename)ifsuccess:print("\n🎵 音频文件下载完成!")else:print("\n❌ 下载失败")python爬取音乐的代码。
张小明
前端开发工程师
大数据数据复制中的容错机制设计与实现
大数据数据复制中的容错机制设计与实现:从"快递备份"到"系统保命符"的故事关键词:大数据复制、容错机制、数据一致性、分布式系统、故障恢复摘要:在大数据时代,数据就像"数字石油",但数…
Sambert-HifiGan在公共广播系统的应用:智能语音播报方案
Sambert-HifiGan在公共广播系统的应用:智能语音播报方案 背景与需求:传统广播的智能化转型 在机场、地铁、学校、医院等公共场所,广播系统承担着信息传递的重要职责。传统的预录音频播报方式存在内容固定、更新滞后、维护成本高等问题&#x…
【水果检测】植物果实检测方法研究与仿真【含Matlab源码 14893期】
💥💥💥💥💥💥💥💥💞💞💞💞💞💞💞💞💞Matlab武动乾坤博客之家💞…
程序员必看:大模型技术全面解析,从LLM到多模态模型,建议收藏学习
本文全面介绍大模型基础知识,包括大语言模型(LLM)的定义、架构与核心能力,视觉基础模型的主流架构与应用,语音大模型的多任务处理能力,多模态大模型(MLLM)的跨模态处理技术,以及推理大模型的能力增强方法。文章详细解析…
2026年预测:AI Agent告别“打杂”时代,全面接管核心业务流的转折点已来!
引言:从“玩具”到“工具”的惊险一跃 站在 2026 年的开端,我们必须承认,AI Agent(智能体)经历了一场惊险的“物种跨越”。 回望 2024 年,大多数企业对 AI 的应用还停留在“边缘地带”:让它写…
OrCAD在工业电源冗余设计中的深度剖析
OrCAD在工业电源冗余设计中的实战解析:从建模到签核的全流程精进当系统不能停机时,电源必须更聪明在地铁信号控制系统中突然断电,在手术室的生命支持设备上出现电压跌落——这些不是假设,而是工业现实中真实存在的风险。现代高端制…