前言
在做数据归档类工具时,经常会遇到目标平台的风控限制。比如尝试抓取某云音乐的每日推荐歌单,运行几天后代码频繁报网络异常,手动访问也常触发验证机制。单纯依赖免费代理池往往失效快、速度慢,同步成功率低;手动切换热点则违背了自动化的初衷。
解决这类问题的关键在于使用高质量的住宅 IP 代理服务。通过模拟真实用户访问,可以有效绕过反爬策略。本文将分享如何利用 Python 配合代理 API,稳定完成数据采集并导出 Excel 的完整流程。
技术选型与优势
在选择代理方案时,主要关注以下三点:
- 地域覆盖:普通数据中心 IP 容易被识别,住宅 IP 能覆盖全球 200+ 国家和地区,获取当地榜单资源更精准,响应速度通常更快。
- 自动轮转:支持根据延迟或错误率自动切换 IP,减少人工干预。设置合理的超时阈值(如 1 秒)即可触发切换,稳定性远高于静态 IP。
- 场景适配:针对特定业务(如音乐流媒体)选择专用池,可显著降低拦截率。
实际使用中,住宅级真实 IP 在请求头表现上与正常浏览器无异,且服务方通常提供 7x24 小时技术支持,便于排查认证问题。
从 0 到 1 实现流程
很多开发者担心代理配置复杂,其实核心逻辑并不繁琐。以下是经过实战验证的步骤:
第一步:注册与认证
在代理服务商后台完成账号注册与身份认证。认证通过后,通常可以解锁更高的并发请求权限,这对批量采集至关重要。
第二步:选择套餐与获取凭证
根据预估流量选择动态或静态住宅 IP 套餐。若需求不明确,可按需充值。获取 API 链接时,注意设置好 IP 数量、国家及城市参数。
注意:务必将执行脚本的设备公网 IP 加入白名单。局域网 IP(如 192.168.x.x)无法生效,请先查询本机公网地址。
第三步:编写采集脚本
下面是一个完整的 Python 示例,整合了代理获取、请求发送及数据保存逻辑。
import requests
import json
from openpyxl import Workbook
from datetime import datetime
import time
import os
def get_proxy_ip(api_url):
"""
通过代理 API 获取可用 IP
:param api_url: 代理服务商提供的 API 链接
:return: 代理 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}")
return f"http://{proxy_ip}"
print("返回列表为空或状态码异常")
return None
except Exception as e:
print(f"连接代理 API 失败:{e}")
return None
def save_to_excel(data, filename):
"""
将数据写入 Excel 文件
"""
wb = Workbook()
ws = wb.active
ws.title = "每日推荐歌曲"
# 表头
headers = ['序号', '歌曲名称', '歌手', '专辑', '歌曲 ID', '时长', '播放链接']
ws.append(headers)
for index, song in enumerate(data, 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}"
ws.append([index, song_name, artists, album, song_id, duration, play_url])
print(f"{index:2d}. {song_name} - {artists}")
# 保存到桌面
desktop_path = os.path.join(os.path.expanduser("~"), "Desktop")
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
file_path = os.path.join(desktop_path, f"{filename}_{timestamp}.xlsx")
if not os.path.exists(desktop_path):
desktop_path = os.path.expanduser("~")
file_path = os.path.join(desktop_path, f"{filename}_{timestamp}.xlsx")
wb.save(file_path)
print(f"数据已保存至:{file_path}")
def main():
# 替换为实际的代理 API 地址
proxy_api_url = "YOUR_PROXY_API_URL_HERE"
netease_url = 'https://music.163.com/api/v3/discovery/recommend/songs'
# 获取代理
proxy_addr = get_proxy_ip(proxy_api_url)
if not proxy_addr:
print("无法获取代理,程序终止")
return
proxies = {'http': proxy_addr, 'https': proxy_addr}
# 请求头配置,模拟浏览器行为
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': 'YOUR_COOKIE_HERE' # 请替换为有效的登录 Cookie
}
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')
if code == 200:
songs = data['data']['dailySongs']
print(f"成功获取到 {len(songs)} 首每日推荐歌曲")
save_to_excel(songs, "网易云每日推荐")
else:
print(f"API 返回错误码:{code}")
else:
print(f"HTTP 请求失败:{response.status_code}")
except requests.exceptions.ProxyError as e:
print(f"代理连接失败:{e}")
except requests.exceptions.Timeout:
print("请求超时")
except requests.exceptions.ConnectionError as e:
print(f"连接错误:{e}")
except json.JSONDecodeError as e:
print(f"JSON 解析错误:{e}")
except Exception as e:
print(f"未知错误:{e}")
if __name__ == "__main__":
print("=" * 60)
print("网易云音乐每日推荐歌曲提取")
print("=" * 60)
main()
常见应用场景
除了音乐数据归档,此类技术方案还适用于多种业务场景:
- 市场研究:采集公开网页数据,辅助行业分析与战略决策。
- 电商监控:监测竞品价格、排名变化,优化营销策略。
- 品牌保护:全天候监控侵权内容,维护品牌形象。
- 性能测试:利用不同地域 IP 测试网站在全球范围内的访问稳定性。
总结与建议
使用代理进行数据采集时,有几个关键点需要注意:
- 合规性:严格遵守目标网站的服务条款,仅采集公开数据,避免侵犯隐私或商业机密。
- 频率控制:不要高频请求,适当增加随机延时,模拟人类操作习惯。
- IP 质量:优先选择高匿名的住宅 IP,数据中心 IP 极易被封锁。
- 异常处理:代码中必须包含完善的 Try-Catch 结构,防止因网络波动导致程序崩溃。
工具只是辅助,建立合法合规的采集习惯才是长久之计。希望这篇教程能帮助你在遇到反爬限制时找到合适的解决方案。

