Python中如何抓取新版喜马拉雅网站的音频?

老版本的直接通过 get 方法获取 url 就可以拿到响应的 json 数据, 但现在同样的 url, 同样的请求方式, 也能够看到响应的数据, 但就是不能通过代码获取到 json 数据, 加了请求头, 加了 Cookie, 都没用, 有大佬吗?


Python中如何抓取新版喜马拉雅网站的音频?
23 回复

买两台电脑,一台自动播放,一台自动录音。


新版喜马拉雅网站采用了反爬机制,直接抓取音频链接比较困难。通常需要分析其网络请求,找到真正的音频源地址。以下是一个基于requestsre的示例,它通过模拟网络请求来获取音频直链。

import requests
import re
import json

def get_ximalaya_audio_url(track_id):
    """
    根据喜马拉雅音频的track_id获取音频直链
    track_id: 音频ID,通常在分享链接或页面源码中可以找到
    """
    # 1. 构造请求头,模拟浏览器
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
        'Referer': 'https://www.ximalaya.com/'
    }

    # 2. 请求音频播放信息API(这个API地址可能会变化,需要定期检查)
    api_url = f'https://www.ximalaya.com/revision/play/v1/audio?id={track_id}&ptype=1'
    try:
        response = requests.get(api_url, headers=headers, timeout=10)
        response.raise_for_status()
        data = response.json()
        
        # 3. 从返回的JSON中提取音频链接
        if data['ret'] == 200 and 'data' in data:
            audio_url = data['data']['src']
            return audio_url
        else:
            print("未能获取音频链接,API返回:", data.get('msg', '未知错误'))
            return None
    except requests.exceptions.RequestException as e:
        print(f"网络请求出错: {e}")
        return None
    except json.JSONDecodeError:
        print("API返回数据解析失败")
        return None

def download_audio(url, save_path):
    """下载音频文件到本地"""
    if not url:
        print("无效的音频URL")
        return False
    
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'}
    try:
        response = requests.get(url, headers=headers, stream=True, timeout=30)
        response.raise_for_status()
        
        with open(save_path, 'wb') as f:
            for chunk in response.iter_content(chunk_size=8192):
                f.write(chunk)
        print(f"音频已保存到: {save_path}")
        return True
    except Exception as e:
        print(f"下载失败: {e}")
        return False

# 使用示例
if __name__ == "__main__":
    # 示例track_id(需要替换为实际要下载的音频ID)
    track_id = "12345678"  # 这里只是个示例ID
    
    # 获取音频直链
    audio_url = get_ximalaya_audio_url(track_id)
    if audio_url:
        print(f"获取到音频链接: {audio_url}")
        # 下载音频
        download_audio(audio_url, f"audio_{track_id}.m4a")
    else:
        print("无法获取音频链接")

关键点说明:

  1. 获取track_id:需要从喜马拉雅网页源码或分享链接中提取音频的唯一ID
  2. API地址:示例中的API接口/revision/play/v1/audio可能会更新,如果失效需要重新分析网络请求
  3. 反爬处理:代码设置了User-Agent和Referer,但更严格的反爬可能需要处理cookies或加密参数

简单建议: 先分析目标音频页面的网络请求,找到真正的数据接口。

楼上可真是个小机灵鬼

用 wasapi 的 lookback 录制

一楼可真是个小机灵鬼

一楼可真是个小机灵鬼🤣🤣🤣

一台电脑不应该就够了吗。。。

一楼可真是个小机灵鬼🤣🤣🤣

一楼是神仙操作。😂🙃🤣

现在一台电脑就能播放➕录音了

用 iphone 自带录屏,没有杂音,后期处理导出音频

没一个解决问题的😂🙃🤣

自己搭一个 RSS hub

没玩过,要不你去看看抓视频的教程再去抓音频?

真巧,前几天才分析了😂,新版要添加 xm-sign 字段。

https://github.com/zenghongtu/ximalaya-audio

前两天 研究了一下,网上找了一个大神的源码 修改了一下。
https://gist.github.com/ruicky/c7957a5ffdfebb650261de30dbce07f8
PS:低调使用,省的接口被封!

都是大神

吓一跳,赶紧试试自己的下载工具,还行还没有失效,晚上赶紧再下点

小白一枚请教下你这个有什么功能?小白能用吗?

一个请求头上带的 sign,如果不用的话会 403 forbid (目前是并不是百分百访问不了,随机的,之后就不造了)。用的话就是直接调用我写的函数,把返回的 sign 加到爬虫的请求头里面,很简单的😄

还有的话,如果用 Python 写,调用 xmSign 函数的时候注意有个定时器,用来每 3s 请求一次服务器获取最新时间戳(可以用 requests 重写一个)。

虽然我看不懂你在说什么,但我感觉不像是我能做的😂还是感谢下回复😊

你好大佬,我想请教一下,python 是怎么调用你的那个 xmSign 的,我调用了总是显示语法错误

回到顶部