Python 自动化采集音乐数据实战:解决反爬与代理配置
一、前言
最近想做一个网易云音乐每日推荐歌单存档小工具,每天自动获取推荐歌曲并保存为 Excel 方便回顾。但在初期测试中发现,刚运行几天代码就报网络异常,手动访问发现被平台限制:刷新 10 次有 8 次触发验证,根本拿不到数据。
一开始尝试了两种办法:先用免费代理池,结果要么失效快,要么访问速度极慢,同步成功率不到 30%;后来手动切换手机热点,每天要操作多次,还得盯着程序有没有断线,完全背离了自动化的初衷。
后来了解到,很多爬虫场景下,IP 的真实性和稳定性是关键。通过引入第三方代理服务,模拟正常用户访问,可以有效降低被识别为爬虫的风险。抱着试试看的心态调整方案后,问题得到了解决。
二、技术选型分析
为什么选择代理服务?主要基于以下三点考量:
- 地域覆盖:之前获取某些地区榜单时,资源往往集中在中美欧,小语种地区支持不足。好的代理服务通常覆盖全球 220+ 国家/地区,能快速获取当地资源,响应速度也有明显提升。
- 自动轮转:手动切换 IP 效率太低。成熟的代理服务支持失效自动切换,例如设置响应延迟超过阈值即自动更换节点,大幅减少了人工干预成本。
- 场景适配:针对特定业务场景(如音乐流媒体),选择合适的代理池能有效降低反爬拦截率。
三、从 0 到 1 的完整流程
对于新手来说,代理配置其实并不复杂,关键在于细节处理。以下是经过验证的实施步骤:
第一步:注册与认证
在服务商后台完成注册,建议使用手机号快速登录。登录后建议完成身份验证,这有助于解锁更高的并发请求权限。认证流程通常较为简单,按提示提交资料即可。
第二步:选择套餐
根据实际需求选择服务类型,常见的有动态住宅和静态住宅等。如果不确定用量,可以先充值按需消费。如有特殊需求,也可联系技术支持咨询定制方案。
第三步:获取并配置代理
认证通过后,在后台选择 API 获取模式。可以根据需求设置 IP 数量、国家、城市等参数,生成专属链接。
注意:务必将使用设备的公网 IP 添加到白名单才能正常使用。局域网 IP(如 192.168.x.x)无法生效,请提前查询好设备公网地址。
复制生成的链接后,在浏览器中测试请求,确认能获取到可用资源和端口后再进行应用集成。
四、实战代码实现
为了验证效果,我们使用 Python 配合代理服务进行数据采集,目标是提取网易云音乐的每日推荐歌曲信息,并保存到 Excel 中。
1. 导入必要的库
import requests
import json
from openpyxl import Workbook
from datetime import datetime
import time
import os
2. 通过 API 获取代理资源
定义一个主函数来获取代理资源,这里使用了 try-except 结构来处理可能的网络异常,确保返回结果的可靠性。
def get_proxy_resource(proxy_api_url):
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"成功获取:{proxy_ip}")
return proxy_ip
else:
print("返回的列表为空")
return None
else:
print(f"获取失败,状态码:{response.status_code}")
return None
except Exception as e:
print(f"连接代理 API 失败:{e}")
return None
3. 配置代理参数和请求头
设置代理字典和请求头,模仿真实浏览器的行为是绕过反爬的关键。
# 设置代理
proxies = {
'http': f'http://{proxy_ip}',
'https': f'http://{proxy_ip}'
}
# 目标 API 配置
netease_url = 'https://music.163.com/api/v3/discovery/recommend/songs'
# Cookie 配置
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 信息...'
}
4. Excel 文件初始化
在发送请求前,先创建 Excel 工作簿结构。
wb = Workbook()
ws = wb.active
ws.title = "每日推荐歌曲"
ws.append(['序号', '歌曲名称', '歌手', '专辑', '歌曲 ID', '时长', '播放链接'])
5. 发送请求与处理数据
发送请求并解析 JSON 数据,将获取到的歌曲信息写入表格。
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()
print(f"返回代码:{data.get('code')}")
if data.get('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}")
ws.append([index, song_name, artists, album, song_id, duration, play_url])
except Exception as e:
print(f"发生错误:{e}")
6. 文件保存与异常处理
最后将数据保存到桌面,并完善错误处理逻辑。
if os.name == 'nt':
desktop_path = os.path.join(os.path.expanduser("~"), "Desktop")
else:
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("完成数据获取!")
7. 程序主入口
完整的程序需要一个主入口来协调执行流程。
if __name__ == "__main__":
print("=" * 60)
print("网易云音乐每日推荐歌曲提取")
print("=" * 60)
# 假设 proxy_api_url 已在外部配置
proxy_api_url = "填写你的代理 API 链接"
proxy_ip = get_proxy_resource(proxy_api_url)
if proxy_ip:
# 此处应调用上述数据处理函数
print("\n任务完成!请查看桌面上的 Excel 文件")
else:
print("\n任务失败,请检查网络或服务状态")
五、应用场景拓展
除了音乐数据采集,这类技术方案还可以应用于多个领域:
- 数据驱动决策与市场研究:高效采集公开数据,包括网页数据采集、市场调查、行业信息跟进等,为企业战略决策提供精准的数据支撑。
- 电子商务竞争与数字化营销:监控平台价格、排名变化;通过本地化广告验证和 SEO 优化,助力企业提升营销效果与市场竞争力。
- 品牌保护与舆情风险管理:全天候监控,有效发现侵权内容、监测舆情动态,帮助企业及时维护品牌形象与价值。
- 技术运维与安全验证:协助测试网站在不同地域的性能稳定性,排查网络连通性问题。
六、总结与建议
在实际使用中,总结了以下几点经验供参考:
- 适用人群:有合法数据采集需求(如个人项目、企业调研)、需要稳定 IP、不想花时间折腾底层原理的人。
- 合规提醒:一定要遵守目标平台的规则,不可做非法采集或滥用接口。
- 成本控制:代理服务通常按流量计费,合理规划用量可有效控制成本。
如果遇到 IP 被限制、采集不稳定等问题,引入专业的代理服务通常是有效的解决方案。但请记住,工具只是辅助,建立合法合规的采集习惯才是最重要的。


