您的位置:首页 > Web前端 > JavaScript

使用PhantomJS抓取页面的ajax信息

2016-02-26 15:48 363 查看
要得到所有Ajax完成后的页面,需要做一些特别的判定。


PhantomJS的渲染引擎就是QtWebkit,JS引擎是JavascriptCore(不是V8),所以大致上可以当作一个没有GUI的Safari。

所以PhantomJs载入一个网页,基本跟Safari一样了,自然所有Javascript都会被解析执行的(不管 这些代码是否会修改DOM)

要想测试的话,可以用PhantomJS截图的API,找一个Ajax请求很多的页面,每隔200毫秒截一张图,就能看到具体页面loading的过程了。

一般在无Ajax网页,可以直接调用PhantomJS载入页面的callback来获取结果。但是在有Ajax的情况下,这个Callback被调用的时候,后台Ajax命令可能还在执行中(或者还没发出去),所以需要手动添加一些代码(比如setTimeout(2000)一类的),来等待所有Ajax命令执行结束。

具体的做法是:

1. 最简单的

假设你使用open(url, callback)这个函数打开页面。这个函数callback的是在页面DOM Loaded后不久就触发了。但是这个时候Ajax的请求不一定执行完毕。所以要在open(url, callback)这里的callback里面再加上一个setTimeout来等待Ajax执行完毕。

但是这个做法缺陷是,我并不知道具体要setTimeout多久才能保证ajax执行完毕。

2. 稍微复杂点,解决方案。

PhantomJS有个两个callback API是
page.onResourceRequested  //在页面每个request发出的时候被触发
page.onResourceReceived   //在页面每个response收到的时候被触发
在这两个callback里面记录下每个request的id,和每个response的id,并在open(url, callback)的callback被调用的时候,检查是否每个request都有对应的response。如果不是的话,说明有ajax request被发了出去,但是并没有收到,因此继续调用setTimeout来等待。直到所有request都有对应的response。

2. 最麻烦的


直接改掉PhantomJS的源码,让他在N秒内没有新的request发出后,再触发open(url, callback)里面的callback。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: