调试JS获得动态视频地址

2,698 阅读3分钟

需求

爬取一个H5视频的url,但是这个url只在点击播放时动态创建。

可以看到点击后才出现src属性

一开始使用selenium自动点击后获取src,后来随着IP被封锁,使用代理要加载全部页面的话非常慢,所以需要手动调试看看点击之后到底发生了啥。

一、找到是哪个元素响应了点击事件

利用Chrome的开发者工具可以看到与点击事件有关的dom有这些:

可以用Chrome浏览器提供的功能,在元素上 右键 --> DeleteElement 将这个dom删除,再次点击原来的位置看是否还有对应的响应事件。最后定位到响应事件的是 id="html5Player" 这个div。

二、查看这个元素绑定的点击事件

元素绑定事件常用的有jQuery的绑定和js原生的dom操作,可以通过搜索一些特征代码来定位。在console的工具栏左侧点击添加Search面板。首先搜索$('#html5Player')$("#html5Player")看看是不是使用了jQuery。

结果没有,只有一些css操作。看来是原生js操作了,接着搜索getElementById("html5Player")

看到第211行有一个赋值语句,点过去看一下。

继续往下翻可以看到添加click事件的代码:

三、调试js代码

点进这个语句,在控制台查看语句所在的js文件并在该js文件中搜索removeStartPlayBtn 方法。

这里有一个设置播放器src的代码,现在只需要chapterVos 变量的内容就知道src了,继续在js文件中搜索chapterVos 寻找蛛丝马迹。

果然,找到了chapterVos的赋值语句,现在的问题是obj的值是什么。沿着这个函数向上寻找,找到obj的赋值语句。

可以看到obj是js内置函数eval的运行结果。

eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码。

其中data就是外层函数getHtml5VideoData参数,现在只需要查看这个函数在哪里被调用就可以知道参数是什么。

全局搜索getHtml5VideoData字符串,发现只有两处使用了这个函数:

第一个是刚才看到的函数定义,第二个是一个请求getIpadVideoInfo.do的返回数据。(后来经过分析这个是js动态创建<script>标签时,将标签的src属性设置为这个url,相当于返回一段js代码并执行)Chrome全局搜索是真厉害。在Network面板中找到这个url,可以看到返回值大概是这样:

var html5VideoData = '{}';
getHtml5VideoData(html5VideoData);

问题到这里就差不多解决了,通过分析函数对这个json对象的处理,就可以知道视频src是什么了。

四、结语

通过调试分析js代码使得原来要加载整个页面包括图片等待变成只需要请求一个url,大部分的免费代理都可以做到了。但是这么容易调试出来主要是js代码没有做混淆处理,不然到第三步就GG了。。。