这个应该比较符合
[Python] 纯文本查看 复制代码 import requests
import os
from urllib.parse import urlparse
from bs4 import BeautifulSoup
# 场景一:已知URL列表时直接下载
def download_mp3s(url_list, save_dir='sound'):
"""已知MP3地址列表时的下载方法"""
os.makedirs(save_dir, exist_ok=True)
for url in url_list:
try:
# 提取文件名
filename = os.path.basename(urlparse(url).path)
filepath = os.path.join(save_dir, filename)
# 带浏览器标识的请求
headers = {'User-Agent': 'Mozilla/5.0'}
response = requests.get(url, headers=headers, stream=True, timeout=10)
response.raise_for_status()
# 流式下载(适合大文件)
with open(filepath, 'wb') as f:
for chunk in response.iter_content(chunk_size=8192):
if chunk: # 过滤保持连接的空白块
f.write(chunk)
print(f'✅ 下载成功: {filename}')
except Exception as e:
print(f'❌ 下载失败 [{url}]: {str(e)}')
# 场景二:从网页抓取MP3链接后下载
def crawl_and_download(page_url, save_dir='sound'):
"""从网页抓取MP3链接并下载"""
try:
# 获取网页内容
headers = {'User-Agent': 'Mozilla/5.0'}
response = requests.get(page_url, headers=headers, timeout=10)
response.raise_for_status()
# 解析页面获取MP3链接
soup = BeautifulSoup(response.text, 'html.parser')
mp3_urls = []
# 查找所有包含.mp3的链接
for tag in soup.find_all(['a', 'audio', 'source']):
url = tag.get('href') or tag.get('src')
if url and url.endswith('.mp3'):
full_url = requests.compat.urljoin(page_url, url)
mp3_urls.append(full_url)
# 去重处理
mp3_urls = list(set(mp3_urls))
print(f'🎯 发现{len(mp3_urls)}个MP3文件')
# 调用下载函数
download_mp3s(mp3_urls, save_dir)
except Exception as e:
print(f'⛔ 页面抓取失败: {str(e)}')
# 使用方法示例
if __name__ == '__main__':
# 方式一:直接使用已知URL列表
# url_list = [
# 'http://example.com/Sound/135x4x.mp3',
# 'http://example.com/Sound/t47a56.mp3'
# ]
# download_mp3s(url_list)
# 方式二:从指定网页抓取链接
crawl_and_download('http://example.com/sound-page')
|