Python中如何抓取新版喜马拉雅网站的音频?
老版本的直接通过 get 方法获取 url 就可以拿到响应的 json 数据, 但现在同样的 url, 同样的请求方式, 也能够看到响应的数据, 但就是不能通过代码获取到 json 数据, 加了请求头, 加了 Cookie, 都没用, 有大佬吗?
Python中如何抓取新版喜马拉雅网站的音频?
买两台电脑,一台自动播放,一台自动录音。
新版喜马拉雅网站采用了反爬机制,直接抓取音频链接比较困难。通常需要分析其网络请求,找到真正的音频源地址。以下是一个基于requests和re的示例,它通过模拟网络请求来获取音频直链。
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("无法获取音频链接")
关键点说明:
- 获取track_id:需要从喜马拉雅网页源码或分享链接中提取音频的唯一ID
- API地址:示例中的API接口
/revision/play/v1/audio可能会更新,如果失效需要重新分析网络请求 - 反爬处理:代码设置了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 的,我调用了总是显示语法错误


