使用Python下载星际争霸2网站MP3文件时出现损坏问题
解决Python下载星际争霸2音效文件损坏的问题
你遇到的文件损坏问题,核心原因是URL拼接错误和缺少会话维持导致请求无法获取真实音频内容,以下是具体修复方案:
问题分析
原代码手动拼接URL时,若页面内的MP3链接已是完整绝对路径,会重复拼接域名生成无效地址(比如https://nuclearlaunchdetected.com//https://nuclearlaunchdetected.com/xxx.mp3),导致请求返回的是错误页面而非音频文件,最终保存的360字节文件就是错误页面的内容。
修复后的代码
import requests from bs4 import BeautifulSoup import os from urllib.parse import urljoin headers = { "User-Agent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:91.0) Gecko/20100101 Firefox/91.0" } url = 'https://nuclearlaunchdetected.com/' download_dir = 'C:/Users/SC2 Sounds/' # 初始化会话,维持请求状态(模拟浏览器会话) session = requests.Session() session.headers.update(headers) # 确保下载目录存在,避免保存失败 os.makedirs(download_dir, exist_ok=True) response = session.get(url, verify=False) soup = BeautifulSoup(response.text, 'html.parser') links = soup.find_all('a') counter = 0 for link in links: href = link.get('href') if href and href.endswith('.mp3'): # 自动处理相对/绝对路径,生成正确下载链接 file_url = urljoin(url, href) file_name = os.path.basename(file_url) print('Downloading:', file_name) file_response = session.get(file_url, verify=False) # 检查请求是否成功,避免保存错误页面 if file_response.status_code == 200: with open(os.path.join(download_dir, file_name), 'wb') as f: f.write(file_response.content) counter += 1 if counter == 10: break else: print(f"下载失败 {file_name},状态码:{file_response.status_code}")
关键修改说明
- 用
urljoin拼接URL:自动识别页面内链接是相对路径还是绝对路径,生成合法的下载地址,彻底避免手动拼接的错误。 - 使用
requests.Session():维持会话状态,模拟浏览器的持续连接,部分网站需要通过会话验证请求合法性,才能返回真实音频内容。 - 增加目录检查与状态码验证:确保下载目录存在,同时过滤请求失败的情况,避免把错误页面保存为损坏文件。
内容的提问来源于stack exchange,提问作者Victor
相关产品推荐
相关产品推荐

