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


可以看到点击后才出现src属性
一开始使用selenium自动点击后获取src,后来随着IP被封锁,使用代理要加载全部页面的话非常慢,所以需要手动调试看看点击之后到底发生了啥。
一、找到是哪个元素响应了点击事件
利用Chrome的开发者工具可以看到与点击事件有关的dom有这些:

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

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

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


三、调试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了。。。