使用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是
2. 最麻烦的
直接改掉PhantomJS的源码,让他在N秒内没有新的request发出后,再触发open(url, callback)里面的callback。
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。
相关文章推荐
- 利用NodeJS和PhantomJS抓取网站页面信息以及网站截图
- 使用AJAX方法可以不刷新页面就从服务器上获得信息(文件信息,方法,数据库中的数据)
- NodeJS + PhantomJS 抓取页面信息以及截图
- Python爬虫使用Selenium+PhantomJS抓取Ajax和动态HTML内容
- java使用phantomJs抓取动态页面
- java使用phantomJs抓取动态页面
- php使用file_get_contents函数抓取页面信息
- 使用ajax获取远程页面信息
- 使用phantomjs抓取JS动态生成的页面
- NodeJS + PhantomJS 抓取页面信息以及截图
- Python爬虫使用Selenium+PhantomJS抓取Ajax和动态HTML内容
- 使用selenium自动化测试工具进行页面信息的抓取遇到的坑
- 使用selenium+PhantomJS 解决Ajax登录页面重定向问题
- NodeJS + PhantomJS 抓取页面信息以及截图
- 利用NodeJS和PhantomJS抓取网站页面信息以及网站截图
- NodeJS + PhantomJS 抓取页面信息以及截图
- Python爬虫使用Selenium+PhantomJS抓取Ajax和动态HTML内容
- Python爬虫使用Selenium+PhantomJS抓取Ajax和动态HTML内容
- 使用PhantomJS+Selenium抓取经过JS渲染的页面
- 如何使用Selenium+PhantomJS抓取动态页面以及常见指令和问题