Python 实现音乐数据自动化采集与代理方案
一、背景与挑战
最近想做一个每日推荐歌单存档小工具,每天自动获取推荐歌曲并保存为 Excel。但在实际开发中发现,直接访问目标接口很容易触发反爬机制:刷新几次就会遇到验证,导致无法获取数据。
尝试过免费代理池,但失效快且速度慢,成功率低;手动切换热点又违背了自动化的初衷。最终通过引入第三方代理 API 服务,利用住宅 IP 模拟正常用户访问,成功解决了网络异常和拦截问题。
二、技术选型思路
选择代理方案主要考虑以下三点:
- 地域覆盖:部分业务需要特定地区的数据,支持多国家/地区的代理资源能确保获取到本地化内容。
- 自动轮转:配置失效自动切换策略,避免频繁手动干预,保证长时间运行的稳定性。
- 场景适配:针对特定业务(如音乐平台)选择合适的代理池,能有效降低被识别为爬虫的概率。
三、完整实现流程
很多开发者担心代理配置复杂,其实只要掌握核心步骤,几分钟即可搞定。以下是从环境准备到代码落地的完整过程。
1. 获取代理凭证
在服务商后台完成注册后,进入用户中心获取 API 密钥或连接地址。建议先进行身份验证以解锁更高并发权限。根据需求选择动态或静态住宅 IP 套餐,按流量计费通常更灵活。
2. 配置白名单
生成代理链接前,需将运行设备的公网 IP 添加到白名单中。注意不要填写局域网 IP(如 192.168.x.x),否则会导致连接失败。可通过搜索引擎查询当前公网 IP 进行配置。
3. 代码实现
下面是一个完整的 Python 脚本示例,整合了请求发送、数据解析及文件存储功能。
依赖安装
# 需要安装 requests, openpyxl 等库
import requests
import json
from openpyxl import Workbook
from datetime import datetime
import time
import os
主逻辑函数
def get_music_recommendations_with_proxy():
# 替换为实际的代理 API 连接地址
proxy_api_url = "这里填写获取的 API 专属连接"
print("正在获取代理资源...")
try:
response = requests.get(proxy_api_url, timeout=10)
if response.status_code == 200:
ip_list = response.text.strip().split('\n')
if ip_list and ip_list[0].strip():
proxy_ip = ip_list[0].strip()
print(f"成功获取代理 IP: {proxy_ip}")
else:
print("返回的列表为空")
return None
else:
print(f"获取失败,状态码:{response.status_code}")
return None
except Exception as e:
print(f"连接代理 API 失败:{e}")
return None
# 设置代理参数
proxies = {
'http': f'http://{proxy_ip}',
'https': f'http://{proxy_ip}'
}
# 音乐 API 配置
netease_url = 'https://music.163.com/api/v3/discovery/recommend/songs'
# 请求头配置,模拟浏览器行为
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
'Referer': 'https://music.163.com/',
'Origin': 'https://music.163.com',
'Accept': 'application/json, text/plain, */*',
'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
'Content-Type': 'application/x-www-form-urlencoded',
'Cookie': '您的 Cookie 信息...'
}
# 初始化 Excel 工作簿
wb = Workbook()
ws = wb.active
ws.title = "每日推荐歌曲"
ws.append(['序号', '歌曲名称', '歌手', '专辑', '歌曲 ID', '时长', '播放链接'])
# 发送请求与处理数据
try:
response = requests.get(netease_url, headers=headers, proxies=proxies, timeout=15)
print(f"响应状态码:{response.status_code}")
if response.status_code == 200:
data = response.json()
code = data.get('code')
print(f"业务返回代码:{code}")
if code == 200:
songs = data['data']['dailySongs']
print(f"成功获取到 {len(songs)} 首每日推荐歌曲")
for index, song in enumerate(songs, 1):
song_name = song['name']
artists = "、".join([artist['name'] for artist in song['ar']])
album = song['al']['name']
song_id = song['id']
duration_ms = song['dt']
duration = f"{duration_ms // 60000}:{str(duration_ms % 60000 // 1000).zfill(2)}"
play_url = f"https://music.163.com/song?id={song_id}"
# 控制台输出
print(f"{index:2d}. {song_name} - {artists}")
# 写入 Excel
ws.append([index, song_name, artists, album, song_id, duration, play_url])
# 保存到桌面
desktop_path = os.path.join(os.path.expanduser("~"), "Desktop")
if not os.path.exists(desktop_path):
desktop_path = os.path.expanduser("~")
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
filename = f'每日推荐_{timestamp}.xlsx'
file_path = os.path.join(desktop_path, filename)
wb.save(file_path)
print(f"数据已保存到:{file_path}")
print("任务完成!")
return True
else:
print(f"业务接口返回错误:{code}")
return False
except requests.exceptions.ProxyError as e:
print(f"连接失败:{e}")
return False
except requests.exceptions.Timeout:
print("请求超时,响应过慢")
return False
except requests.exceptions.ConnectionError as e:
print(f"连接错误:{e}")
return False
except json.JSONDecodeError as e:
print(f"JSON 解析错误:{e}")
return False
except Exception as e:
print(f"未知错误:{e}")
return False
if __name__ == "__main__":
print("=" * 60)
print("音乐每日推荐歌曲提取程序")
print("=" * 60)
success = get_music_recommendations_with_proxy()
if not success:
print("\n任务失败,请检查网络或服务状态")
四、应用场景扩展
该技术方案不仅适用于音乐数据采集,还可拓展至其他领域:
- 市场研究:采集公开网页数据,辅助行业分析。
- 电商监控:监控商品价格与排名变化。
- 品牌保护:全天候监测侵权内容与舆情动态。
- 运维测试:测试网站在不同地域的性能稳定性。
五、注意事项
- 合规性:务必遵守目标平台的 robots 协议及服务条款,不可进行非法采集。
- 隐私保护:使用真实 IP 代理时,注意自身数据的保密性。
- 频率控制:合理设置请求间隔,避免对目标服务器造成压力。
通过合理的代理配置与规范的代码实现,可以有效解决大部分反爬限制问题,提升数据采集的稳定性和效率。


