编 写:袁 亮 时 间:2015-07-21 说 明:PhantomJS第一篇:安装及抓取网页为图片 一、是什么,解决什么问题 1、是一个无界面的,webkit内核浏览器,能像一个真正的浏览器一样解析js,dom,css等 2、应用场景 抓取js后加载的内容 将完整页面转为图片 屏幕补抓 自动化测试 网络监控 二、下载安装:linux版 1、2.0.0版本之前的,直接网上下载编译后的二进制文件即可,直接解压就可以运行 如果找不到好的下载源,直接上249上,有1.4版本和1.9.8版本 /opt/software/下 2、源码安装 2.1 下载源码 a:直接下载某个版本 wget https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-2.0.0-source.zip unzip phantomjs-2.0.0-source.zip b:git下载全部 git clone git://github.com/ariya/phantomjs.git cd phantomjs git checkout 2.0 c:下载太慢,直接从249上拷贝 /opt/ci123/www/html/phantomjs 2.2 安装依赖的模块 yum -y install gcc gcc-c++ make flex bison gperf ruby \ openssl-devel freetype-devel fontconfig-devel libicu-devel sqlite-devel \ libpng-devel libjpeg-devel 2.3 执行安装脚本(以小时记,好久好久...) ./build.sh 3、参考文档 http://phantomjs.org/build.html 4、执行方法 ./bin/phantomjs examples/post.js 三、下载安装:windows版本 1、自行搜索下载 http://phantomjs.org/download.html 2、18上有2.0.0版本 \\192.168.0.18\运维网络硬盘\r软件\phantomjs-2.0.0-windows.zip 3、解压出来之后,可以直接运行 4、命令行下执行: cd 到相应目录 ./bin/phantomjs.exe examples/post.js 四、简单使用,抓取一个网页,并保存为图片 1、新建fetch.js文件 2、输入以下代码 var page = require('webpage').create(); page.open('http://www.ci123.com/', function() { page.render('/opt/ci123/www/html/geekman/ci123.png'); phantom.exit(); }); 3、执行,并查看图片是否生成 ./bin/phantomjs fetch.js 五、遇到的问题及解决办法 1、网页中的中文乱码,中文的地方,都是一堆方括号 yum install bitmap-fonts bitmap-fonts-cjk ps:这个解决了乱码问题,但是导致了下面另外一个问题,坑了我大半天 2、生成的png有一堆的透明效果 www.ci123.com加使用美图看看导致,其实是正常的 放在浏览器里看就正常了 3、生成jpg格式图片,背景黑色 执行之后,将body背景设置为白色即可 page.evaluate(function(){ document.body.bgColor = 'white'; }); 4、有些内容后加载,导致页面有空白 延时一定时间之后在渲染成图片 window.setTimeout(function (){ page.render("/opt/ci123/www/html/geekman/ci123.png"); phantom.exit(); }, 3000); 5、有些内容,需要触发效应效果才出现,可以在page.evaluate中模拟 page.evaluate(function(){ document.body.bgColor = 'white'; window.scrollTo(0,10000);//滚动到底部 window.document.body.scrollTop = document.body.scrollHeight; }); 6、flash播放显示的内容,截取不到 1.5版本之后就不再支持flash,如果要抓取flash的,需要安装1.4及之前的版本 7、生成的图片,宽度不够,比如www.ci123.com大概只有960的样子 设置webkit的宽高,让样式显示正常(可以调整这个的不同值,来抓取不同分辨率下的表现,特别是响应式布局的页面) page.viewportSize = {width: 1440,height: 800}; 8、在window下抓取,页面显示正常,但是在linux下抓取,页面排版跟浏览器上显示的有很大的区别 8.1 版本一致,怀疑是版本的问题,装过1.4,1.5,1.9.2,1.9.8,2.0.0版本,都没用... 8.2 百度、google了很久,发现别人都没这个问题 8.3 怀疑是不是webkit内核不一样,所以在我的浏览器里正常,在服务器上的那个不一样,看过使用的webkit内核,是比较旧 然后又是各种切换版本,测试,发现还是不行 8.4 后来仔细看截出来的图,发现汉字跟浏览器里不大一样,怀疑是这个的问题 8.5 将最开始安装的那两个中文字库删除,再截,发现,汉字乱码了,但是排版正常.... 所以问题就确定了,因为使用了不当的字体库,导致页面排版出错 8.6 重装centos的字体库,又踩了个坑,这个见额外的文档 六、完整代码范例 var page = require('webpage').create(); page.viewportSize = {width: 1440,height: 800}; var url = 'http://www.ci123.com/'; page.open(url, function (status){ if (status != "success") { console.log('FAIL to load the address'); phantom.exit(); } var bb = page.evaluate(function() { document.body.bgColor = 'white'; // //此函数在目标页面执行的,上下文环境非本phantomjs,所以不能用到这个js中其他变量 window.scrollTo(0,10000);//滚动到底部 window.document.body.scrollTop = document.body.scrollHeight; }); window.setTimeout(function (){ page.render("/opt/ci123/www/html/geekman/ci123.png"); phantom.exit(); }, 3000); }); 七、其他 1、1.5版本之后不支持flash,如果要支持flash的话,请下载1.4以前的版本 2、常用语法 http://www.tuicool.com/articles/nieEVv http://www.cnblogs.com/justany/p/3279717.html 3、官方文档 http://phantomjs.org/documentation/ 4、examples文件夹下,有很多范例,直接参考使用,很好用