Python爬虫实战:高效爬取QQ音乐榜单数据并存储到Excel
·
一、技术选型与工具准备
-
Python库:
-
requests:发送HTTP请求 -
json:解析API返回数据 -
openpyxl:存储数据到Excel -
pandas:数据清洗(可选)
-
-
开发环境:Python 3.8+、Chrome浏览器(用于抓包分析)
# 安装依赖
pip install requests openpyxl
二、榜单数据接口分析
通过浏览器开发者工具(F12)分析发现,QQ音乐榜单数据通过XHR动态加载,核心接口为:https://u.y.qq.com/cgi-bin/musics.fcg,其关键参数如下:
-
topId:榜单ID(如4代表热歌榜) -
period:榜单统计周期(格式:YYYY-MM-DD) -
sign:动态签名(需通过JS生成或抓包固定)
示例请求参数:
params = {
'ct': '24',
'cv': '0',
'format': 'json',
'data': '{"detail":{"module":"musicToplist.ToplistInfoServer","method":"GetDetail","param":{"topId":4,"offset":0,"num":20}}}'
}
三、核心代码实现
1. 发送请求获取原始数据
import requests
import json
def get_qqmusic_rank(top_id=4, page_size=20):
url = "https://u.y.qq.com/cgi-bin/musics.fcg"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36...",
"Referer": "https://y.qq.com/n/yqq/toplist/4.html"
}
payload = {
"data": json.dumps({
"detail": {
"module": "musicToplist.ToplistInfoServer",
"method": "GetDetail",
"param": {"topId": top_id, "offset": 0, "num": page_size}
}
})
}
response = requests.get(url, headers=headers, params=payload)
return response.json()
2. 解析JSON数据
def parse_rank_data(json_data):
song_list = json_data['detail']['data']['data']['songInfoList']
rank_data = []
for song in song_list:
item = {
"排名": song.get("rank", 0) + 1, # 从0开始需+1
"歌曲": song["title"],
"歌手": " / ".join([singer["name"] for singer in song["singer"]]),
"专辑": song["album"]["title"],
"时长": f"{int(song['interval']//60)}:{int(song['interval']%60):02d}"
}
rank_data.append(item)
return rank_data
3. 存储到Excel文件
from openpyxl import Workbook
def save_to_excel(data, filename="QQ音乐榜单.xlsx"):
wb = Workbook()
ws = wb.active
ws.title = "热歌榜"
ws.append(["排名", "歌曲名称", "歌手", "专辑", "时长"])
for item in data:
ws.append([item["排名"], item["歌曲"], item["歌手"], item["专辑"], item["时长"]])
wb.save(filename)
四、完整调用示例
if __name__ == "__main__":
# 获取热歌榜前100首
rank_json = get_qqmusic_rank(top_id=4, page_size=100)
songs = parse_rank_data(rank_json)
save_to_excel(songs)
print("数据已保存至QQ音乐榜单.xlsx")
五、关键技术点解析
-
反爬对策
-
使用真实浏览器UA头(可通过
fake_useragent库动态生成) -
添加Referer字段模拟页面跳转
-
-
动态签名处理
若接口更新需要动态sign参数,可通过以下方式解决:-
使用Selenium自动抓取最新签名
-
逆向JS加密算法生成签名
-
-
数据扩展
-
歌词抓取:通过
songmid调用歌词接口 -
评论爬取:解析
hot_comment字段 -
音源下载:需破解vkey加密逻辑
-
六、注意事项
-
遵守
robots.txt协议,控制请求频率 -
商业用途需获得腾讯官方授权
-
动态接口可能随版本更新失效,需定期维护
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐

所有评论(0)