Python 结合住宅代理实现音乐数据自动化采集
前言
最近想做一个每日推荐歌单存档的小工具,每天自动获取推荐歌曲并保存为 Excel。但在初期测试中遇到了网络异常问题:手动访问发现被平台限制,刷新多次就会触发验证,导致无法获取数据。
起初尝试了免费代理池,但失效快且速度慢,同步成功率不足 30%;后来改用热点切换,每天需频繁操作,完全背离了自动化的初衷。最终通过引入住宅级代理 IP,模拟正常用户访问,才稳定解决了反爬拦截问题。
核心思路
选择代理方案时,主要关注以下三点:
- 地域覆盖:普通代理多集中在中美欧,小语种地区资源匮乏。住宅代理通常覆盖 220+ 国家/地区,能匹配本地化需求,响应速度显著提升。
- 自动轮转:支持失效自动切换,设置合理的延迟阈值即可减少人工干预,稳定性远高于静态 IP。
- 场景适配:针对特定业务(如音乐流媒体)选择专用池,能有效降低反爬拦截率。
实战流程
1. 环境准备与认证
在配置前,确保已完成服务商的身份认证以解锁高级功能。登录后台后,建议先查询并记录本机公网 IP,将其加入白名单,避免后续连接被拒。
2. 获取代理资源
在控制台选择 API 获取模式,根据需求设置 IP 数量、国家等参数。复制生成的专属链接,注意不要使用局域网 IP(如 192.168.x.x),否则会导致连接失败。
3. Python 代码实现
以下是完整的采集脚本,整合了请求发送、数据解析及 Excel 写入逻辑。代码中已处理常见的网络异常,新手可直接修改参数运行。
import requests
import json
from openpyxl import Workbook
from datetime import datetime
import time
import os
def get_proxy_resource(api_url):
"""获取代理 IP 资源"""
print("正在获取代理资源...")
try:
response = requests.get(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}")
proxy_ip
:
()
:
()
Exception e:
()
():
wb = Workbook()
ws = wb.active
ws.title =
ws.append([, , , , , , ])
index, song (songs, ):
song_name = song[]
artists = .join([artist[] artist song[]])
album = song[][]
song_id = song[]
duration_ms = song[]
duration =
play_url =
ws.append([index, song_name, artists, album, song_id, duration, play_url])
desktop_path = os.path.join(os.path.expanduser(), )
os.path.exists(desktop_path):
desktop_path = os.path.expanduser()
timestamp = datetime.now().strftime()
file_path = os.path.join(desktop_path, )
wb.save(file_path)
()
():
api_url =
netease_url =
proxy_ip = get_proxy_resource(api_url)
proxy_ip:
()
proxies = {
: ,
:
}
headers = {
: ,
: ,
: ,
: ,
: ,
: ,
:
}
:
response = requests.get(netease_url, headers=headers, proxies=proxies, timeout=)
()
response.status_code == :
data = response.json()
data.get() == :
songs = data[][]
()
save_to_excel(songs, )
:
()
:
()
requests.exceptions.ProxyError e:
()
requests.exceptions.Timeout:
()
requests.exceptions.ConnectionError e:
()
json.JSONDecodeError e:
()
Exception e:
()
__name__ == :
( * )
()
( * )
main()


