You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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}")

关键修改说明

  1. 用urljoin拼接URL:自动识别页面内链接是相对路径还是绝对路径,生成合法的下载地址,彻底避免手动拼接的错误。
  2. 使用requests.Session():维持会话状态,模拟浏览器的持续连接,部分网站需要通过会话验证请求合法性,才能返回真实音频内容。
  3. 增加目录检查与状态码验证:确保下载目录存在,同时过滤请求失败的情况,避免把错误页面保存为损坏文件。

内容的提问来源于stack exchange,提问作者Victor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 16:42:46