之前学习爬虫的时候一直了解、学习的是基于PhantomJS的,虽然Chrome的headless更加优秀、比PhantomJS更快、占用内存更少,而且还有个强大的爸爸。但是也不能把之前的学的给荒废了,先实践下再说,况且这种东西大部分应该是都是互通的。
PhantomJS 是无界面的 Webkit 解析器,提供了 JavaScript API 。由于去除了可视化界面,速度比一般 Webkit 浏览器要快很多。同时提供了很多监控和事件接口,可以方便的操作 DOM 节点,模拟用户操作等。
1. 爬虫功能
爬虫主要需要具备的基本功能:
- javascript动态解析能力
- hook所有的网络请求
- 静态页面链接、表单自动分析能力
- 自动交互能力
1.1 静态页面链接和表单自动分析
phantomjs提供page.evaluate
,这个方法会创建一个“沙盒”来解析javascript。所以,我们可以在沙盒中执行javascript代码,以此获得静态页面链接和表单
1.2 javascript动态解析
phantomjs在打开url的时候就会自动使用自己的webkit内核去执行对应的javascript代码,从而可以实现js动态解析
1.3 hook所有的网络请求
phantomjs使用page.onResourceRequested
方法来hook所有的网络请求,所以可以在这个函数里面截获ajax请求,获取url和对应的参数
1.4 自动交互
爬虫的自动交互能力就是需要获取页面所有事件,并想办法触发事件,最后获取事件触发的结果。
页面中的事件一般分两种:
- 内联事件:比如,on开头的事件onxxx、
javascript:xxx
- 绑定事件:比如,
document.addEventListener
、jQuery
中的$('dom').xxx
自动交互事件即用户交互事件,而用户操作的本质,实际上是触发了绑定在DOM节点的事件。所以自动触发问题,可以简化为触发节点事件。
分解下自动触发事件的三个步骤,逐步实现
1、获取事件
2、触发事件
3、获取事件触发结果
2.1 内敛事件
获取内敛事件:遍历节点,获取所有节点内的onxx
属性和javascript:
属性值
触发内敛事件:调用eval执行所有的onxxxx属性和javascript:
属性的值
2.2 绑定事件:
获取绑定事件:JavaScript中绑定事件,都会调用addEventListener
函数,所以我们可以用hook addEventListener
的办法来获取绑定事件:onInitialized
触发绑定事件:JavaScript中提供了dispatchEvent函数,可以触发指定DOM节点的指定事件
2.3 获取事件触发结果
等待页面加载完之后,需要获取所有的<a>
、<iframe>
、<form>
等标签,开启页面DOM节点监听,并且触发所有的事件。
|
|
2. 代码实现
具体代码如下:
注意项:
- 所有必要的header头
- 根据表单属性类型,自动填写对应类型的表单数值
- 根据后缀禁止静态资源的加载,因为如果根据
Content-Type
判断将导致结果目录树不全 - 尽量获取所有标签中的链接,比如图片,视频等,因为可能存在SSRF、XSS、文件包含等漏洞
- 不触发注销、删除等敏感接口
- hook会导致页面阻塞的函数,比如alert、prompt等
- 有待完善。。。
3. 实例测试
这里以demo.aisec.cn
为测试站点。
看下效果:
从图中看出获取的的链接有:
|
|
后面还要做的太多了。。。慢慢来吧。 🙄️
参考链接
http://blog.wils0n.cn/archives/18/
https://github.com/wilson9x1/crawler_phantomjs/blob/master/crawler.js
https://stackoverrun.com/cn/q/9189682
http://dogewatch.github.io/2017/01/15/webSiteSpider/
https://github.com/DogeWatch/webSiteSpider/blob/master/phantomjs.js
https://www.anquanke.com/post/id/85298
https://www.anquanke.com/post/id/95294
https://security.tencent.com/index.php/blog/msg/34
http://phantomjs.org/api/webpage/
WEB 2.0 启发式爬虫实战|阿里云猪猪侠