一、技术选型与工具准备

  • 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")

五、关键技术点解析

  1. 反爬对策

    • 使用真实浏览器UA头(可通过fake_useragent库动态生成)

    • 添加Referer字段模拟页面跳转

  2. 动态签名处理
    若接口更新需要动态sign参数,可通过以下方式解决:

    • 使用Selenium自动抓取最新签名

    • 逆向JS加密算法生成签名

  3. 数据扩展

    • 歌词抓取:通过songmid调用歌词接口

    • 评论爬取:解析hot_comment字段

    • 音源下载:需破解vkey加密逻辑

六、注意事项

  1. 遵守robots.txt协议,控制请求频率

  2. 商业用途需获得腾讯官方授权

  3. 动态接口可能随版本更新失效,需定期维护

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐