使用PhantomJS抓取页面的ajax信息

要得到所有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。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值