QuXiao's Blog

Life && Tech && Thoughts

基于SlimerJS的Flash请求抓取方案

Written on

背景

团队有个看似比较简单的需求:抓取网页加载的各项资源。

这个需求其实之前已经有了基于PhantomJS的解决方案,也在内部的网络评测服务中用了挺长时间,一直挺好。不过,这个方案一直没有解决一个问题:加载Flash。因为从很早开始,PhantomJS就 宣称 不支持Flash,一方面是为了保证它是一个『纯』的headless browser,另一方面是因为很难debug。 之前也尝试过编译较低版本的PhantomJS、或者在其基础上升级的 PhantonJS分支项目 ,均告失败。看起来,只能寻找其它方案。

方案

在网上搜寻了一番,找到了一个叫SlimerJS的项目,看起来是符合需求的。SlimerJS大致有这么几个特点:

  • SlimerJS是基于浏览器引擎Gecko(Firefox使用的引擎)
  • SlimerJS可以加载Flash(需要安装Flash插件)
  • SlimerJS不是headless browser,需要图形环境

虽然可以满足需求,但安装过程就相对PhantomJS复杂一些了,需要比较多的准备工作。步骤整理如下:

安装FireFox

是的,直接在Server上面装一个浏览器……直接使用Yum进行安装,或者直接从 FireFox官网 下载对应的binary。需要注意的是,SlimerJS对于FireFox的版本是有要求的,需要在版本20 ~ 39之间。

安装Flash插件

#安装RPM包
yum -y install http://linuxdownload.adobe.com/linux/x86_64/adobe-release-x86_64-1.0-1.noarch.rpm

#确认
yum repolist | grep -i adobe
adobe-linux-x86_64      Adobe Systems Incorporated                            2

#最后进行安装
yum install flash-plugin

安装虚拟视频设备

这个时候,如果你试图运行FireFox的话,会报如下错误:

Error: no display specified

我们需要安装一个叫做『Xvfb』的服务,他的作用就是实现兼容X11显示协议的虚拟设备,而并不需要Server连接显示设备。

安装
yum install xorg-x11-server-Xvfb
启动
Xvfb :1 -screen 0 1024x768x24

这就表示了虚拟出了一个分辨率为1024*768,24色,设备编号为":1"的显示设备。

最后,我们需要设置环境变量来向系统指定我们这台设备:
export DISPLAY=:1

安装SlimerJS

这个就相对简单了,直接按照 SlimerJS下载页面 的提示进行安装就可以了。安装包分为轻量版和完整版,完整版本包含了其它依赖的程序,我之前是直接安装了完整版,不过按照前面几个步骤安装好依赖的服务之后,使用轻量版本安装就可以了。

运行

SlimerJS和PhantomJS的运行方式一致:

slimerjs <slimerjs_args> xxx.js <js_args>

并且,如果你直接使用过PhantomJS的话,那几乎不怎么需要改动代码就可以直接使用(至少对于目前只需要抓取资源URL来说),我就直接用了PhantomJS提供的 获取资源URL的脚本

对于同一个脚本,我们可以对比下PhantomJS和SlimerJS的返回。

PhantomJS

phantomjs --ssl-protocol=any --load-images=no ./netlog.js http://www.douyu.com/583073
http://www.douyu.com/583073
http://hm.baidu.com/hm.js?e99aee90ec1b2106afe7ec3b199020a7
http://shark.douyucdn.cn/shark/lib/css/base/1.0/base.css?160114
http://shark.douyucdn.cn/shark/lib/js/port/shark.js?160113
http://shark.douyucdn.cn/shark/lib/js/lib/jquery.js?160113
http://shark.douyucdn.cn/app/douyu/css/common.css?nv=6.96
http://shark.douyucdn.cn/app/douyu/css/com/app-all.css?nv=6.96
http://shark.douyucdn.cn/app/douyu/css/page/room-normal/app-all.css?nv=6.96
http://shark.douyucdn.cn/app/douyu/activity/css/aprilFoolsDay/aprilFoolsDay.css?nv=6.96
http://shark.douyucdn.cn/app/douyu/js/com/device.js?v=20160401
http://shark.douyucdn.cn/app/douyu/third/art-dialog-dy/jquery.artDialog.js?skin=blue
http://shark.douyucdn.cn/app/douyu/third/art-dialog-dy/plugins/iframeTools.js?nv=6.96
http://shark.douyucdn.cn/app/douyu/third/My97DatePicker/WdatePicker.js?nv=6.96
http://shark.douyucdn.cn/app/douyu/js/page/room/normal/app-all.js?nv=6.96
http://shark.douyucdn.cn/stream/dist/dys-douyutv.js?nv=6.96
http://shark.douyucdn.cn/app/douyu/activity/js/aprilFoolsDay/aprilFoolsDay.js?nv=6.96
http://shark.douyucdn.cn/app/douyu/third/art-dialog-dy/skins/blue.css?4.1.7
http://shark.douyucdn.cn/app/douyu/third/My97DatePicker/skin/WdatePicker.css
http://shark.douyucdn.cn/shark/lib/js/lang/class.js?1.5
http://shark.douyucdn.cn/shark/lib/js/util/lang/1.0/lang.js?1.5
http://shark.douyucdn.cn/shark/lib/js/lang/observer.js?1.5
http://shark.douyucdn.cn/shark/lib/js/util/template/2.0/template.js?1.5
http://shark.douyucdn.cn/shark/lib/js/util/cookie/1.0/cookie.js?1.5
http://shark.douyucdn.cn/shark/lib/js/util/flash/1.0/bridge.js?1.5
http://shark.douyucdn.cn/shark/lib/js/ext/swfobject.js?1.5
http://shark.douyucdn.cn/shark/lib/js/util/template/1.0/template.js?1.5
http://shark.douyucdn.cn/shark/lib/js/ui/dragdrop/1.0/dragdrop.js?1.5
http://shark.douyucdn.cn/shark/lib/js/util/ready/1.0/ready.js?1.5
http://shark.douyucdn.cn/shark/lib/js/util/flash/1.0/data.js?1.5
http://shark.douyucdn.cn/app/douyu/js/com/left-dp.js?1.5
http://dotcounter.douyutv.com/deliver/fish
http://shark.douyucdn.cn/shark/lib/js/lang/log.js?1.5
http://www.douyu.com/swf_api/getAnchorLike?room_id=583073
http://www.douyu.com/lapi/sign/signapi/setinfo

SlimerJS

slimerjs --ssl-protocol=any --load-images=no ./netlog.js http://www.douyu.com/583073
http://www.douyu.com/583073
// 省略一些输出
http://shark.douyucdn.cn/app/douyu/js/com/left-dp.js?1.5
http://www.douyu.com/lapi/sign/signapi/setinfo
// 后续可以看到Flash被加载,并能抓取到视频资源URL
Vector smash protection is enabled.
http://staticlive.douyutv.com/common/simplayer/HTool.swf?6.96
http://staticlive.douyutv.com/upload/signs/201603311905194647.swf
http://staticlive.douyutv.com/upload/signs/201603311906178396.swf
http://staticlive.douyutv.com/upload/signs/201604011742047568.swf
http://staticlive.douyutv.com/common/simplayer/WebRoomNormal.swf?v31193.3
http://zt2.a.he2d.com/crossdomain.xml
http://pic.jntinchina.com/sdk/fl/jintuo/aswitcher.swf?v=2016,4,8,9,1&cid=1010605&adc=http%3A%2F%2Fwww.douyu.com%2Flapi%2Fsign%2Fsignapi%2Fclick%3Froomid%3D583073%26aid%3D604150%26posid%3D30009%26projid%3D1054%26callback%3D1
http://staticlive.douyutv.com/common/simplayer/corenormal.swf?v31193.3
http://zt2.a.he2d.com/3d1f26/88/?v=1&size=3360250&t=0%2E565%2D1460079156053&r=
http://kwflvcdn.000dn.com/ab/c4/dy_xgdx/ggj9fid.swf
http://g.jntinchina.com/crossdomain.xml
http://staticlive.douyutv.com/upload/dygift/47b363581abe6fcc887266afa613a873.swf?v31193.3
http://staticlive.douyutv.com/common/simplayer/assets/broadcast.swf?v31193.3
http://www.douyu.com/crossdomain.xml
http://www.douyu.com/swf_api/room/583073?cdn=&nofan=yes&_t=24334652&sign=13f01e630c6fba073e73b10e9af255a6
http://www.douyu.com/live_specific/get_room_show_info?device=FF6317124C4F9DD2D402CE30184FB6C9&time=1460079157659&adv=e0208b6e78ec3a41d8c0d7b2fc4e5ab4&roomid=583073
http://www.douyu.com/lapi/live/getPlay/583073
http://hdl3.douyutv.com/live/583073ry6pXqAwY6.flv?wsSecret=b79af72800c1cdfce8c77eb89d3306ed&wsTime=1460079157
http://g.jntinchina.com/ga?slotid=1010605&url=null&hasJSCode=false&pt=PlugIn&r=0%2E02289230702444911
http://pic.jntinchina.com/upload/2016/04/86e57bb5e395a24cce788555e65cf29e.swf
http://s.jntinchina.com/l?slotid=1010605&adid=296023&action=play&url=null&pvid=1010605%2E144%2E60083%2E766028%2E1%2E1460079158%2Ecd3e&r=0%2E8289
http://61.136.211.42/hdl3.douyutv.com/live/583073ry6pXqAwY6.flv?wsSecret=b79af72800c1cdfce8c77eb89d3306ed&wsTime=1460079157&wshc_tag=0&wsts_tag=57070a36&wsid_tag=7b3b6147&wsiphost=ipdbm
http://kwflvcdn.000dn.com/swfs/06/3065530650xgd/ggj8fid.flv
http://log.he2d.com/crossdomain.xml

这样,我们就成功抓取到了Flash的请求。 :)

comments powered by Disqus