Python3解决新版喜马拉雅音频JS反爬

本文详细介绍了如何使用Python3应对新版喜马拉雅音频的JS反爬策略。通过分析网页源码、XHR请求及JS文件,找出音频源播放地址,并揭示了sign参数的生成逻辑,包括服务器时间戳、MD5编码和随机数的组合。最后提供了爬虫代码示例和后续可能遇到的问题。
摘要由CSDN通过智能技术生成

前言

应该也有一年了吧,之前也在简书CSDN上写过爬取喜马拉雅音频的文章,经历了一次喜马拉雅的改版,同时也更新了一波代码

最近为了喜欢的雪中,回去重新打算跑一下代码下载音频,这一跑不要紧,结果就发现喜马拉雅又改版了

得,又得重新写代码,且这次还加了JS反扒的手段,让我也好好学习了一把,嗯,下面进入正题

分析

初步分析

老样子,首先来看看我们要爬取的目标https://www.ximalaya.com/youshengshu/2684034/


像这样的882个音频,共计30页,每页一般标准的有30个,最后要将这882个音频保存到本地,那么我们最需要的是找到音频的源播放地址,我们不妨打开一个音频来看看,同时按F12打开开发者工具

首先我看了看https://www.ximalaya.com/youshengshu/2684034/2725352的网页源代码中,并没有相关的播放地址,所以我开始在开发者工具中找

页面刷新完之后的XHR中我没有找到明显的播放地址,然后我点了一下页面的播放按钮,之后XHR又跳出来好几条信息,随后我找到了

可以看到,src对应的m4a链接就是音频的源播放地址,我们只要拿到这个链接就行了

那么我们接下来就应该要访问上面这个链接,从而拿到音频的播放地址,但是当我们复制链接后去打开时会发现

[SIGN] no sign or wrong sign,是的,你很大几率会看到这个,没有sign或错误的sign,那么也就是说这个链接是打不开的?那么带上请求头试试?后来我用postman访问这个链接,带上请求头后还是没有得到结果,然后想了想,返回给我们的提示是sign

正好请求头中就有这个xm-sign,于是我重新试了一下,只带上这个xm-sign去访问,发现在一次尝试中拿到了之前看到的带有播放链接的response

xm-sign: dcf3736db17584cb0b7260c1fcb1f05f(45)1569231095030(64)1569231094006

那么下一步要解决的就是如何获得这个xm-sign

进阶分析

xm-sign并不在XHR中能够找到,所以我下一步的目标是在JS文件中找

找啊找,终于在上面的js文件中,找到了点头绪,出现了同样的xm-sign,这个过程对我来说是比较漫长的,因为需要在js文件中一个个的浏览过去,当然你通过fiddler抓包去找也是差不多的

然后为了明确知道xm-sign是怎么来的,我们就需要对这个js文件进行打断点调试,在控制台的Source中打开该Js文件

右键该JS文件,点击Open in Sources panel,或者鼠标轻放在该文件上,会出现该文件的路径,到控制台Source中找到它

找到该文件后点击打开,然后点击下方的花括号按钮,美化代码,再按ctrl + f搜索xm-sign,就可以定位到xm-sign

我们需要知道对应xm-sign的值t到底是怎么样的,接着在return e上打上断点,这样一来,当页面刷新运行到这里的时候会自动停止之后的JS代码,可以让我们来进行调试,如何通过Chrome调试可以参考这篇文章

打好断点后,刷新页面,等待一会,不用动别的,然后就可以看到下图

图中所示的xm-sign的值就是t的值,再往上一点,t的值就是由o.default产生的

n.interceptors.request.use(function(e) {
   
        if (e.url.indexOf("/revision") > -1) {
   
            var t = (0,
            o.default)();  //  然后点击 o.default 进入该方法中 
            e.headers = function(e) {
   
                for (var t = 1; t < arguments.length; t++) {
   
                    var r = null != arguments[t] ? arguments[t] : {
   };
                    t % 2 ? i(r, !0).forEach(function(</
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值