基于PhantomJS的动态爬虫引擎

之前学习爬虫的时候一直了解、学习的是基于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 自动交互

爬虫的自动交互能力就是需要获取页面所有事件,并想办法触发事件,最后获取事件触发的结果。

页面中的事件一般分两种:

  1. 内联事件:比如,on开头的事件onxxx、javascript:xxx
  2. 绑定事件:比如,document.addEventListenerjQuery中的$('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节点监听,并且触发所有的事件。

1
2
3
4
5
6
7
8
获取form表单属性和值
获取a标签的href值
获取link标签的href值
获取area标签的href值
获取img标签的src值
获取embed标签的src值
获取video标签的src值
获取audio标签的src值

2. 代码实现

具体代码如下:

注意项:

  • 所有必要的header头
  • 根据表单属性类型,自动填写对应类型的表单数值
  • 根据后缀禁止静态资源的加载,因为如果根据Content-Type判断将导致结果目录树不全
  • 尽量获取所有标签中的链接,比如图片,视频等,因为可能存在SSRF、XSS、文件包含等漏洞
  • 不触发注销、删除等敏感接口
  • hook会导致页面阻塞的函数,比如alert、prompt等
  • 有待完善。。。

3. 实例测试

这里以demo.aisec.cn为测试站点。

看下效果:

从图中看出获取的的链接有:

1
2
3
4
5
静态标签: http://demo.aisec.cn/demo/aisec/html_link.php?id=2
JS解析 http://demo.aisec.cn/demo/aisec/js_link.php?id=2&msg=abc
Form表单: http://demo.aisec.cn/demo/aisec/post_link.php
Ajax请求: http://demo.aisec.cn/demo/aisec/ajax_link.php?id=1&t=010451811132952571
自动交互: http://demo.aisec.cn/demo/aisec/click_link.php?id=2

后面还要做的太多了。。。慢慢来吧。 🙄️

参考链接

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 启发式爬虫实战|阿里云猪猪侠

大爷,赏个铜板呗!