你是如何走出人生的阴霾的?
多走几步
前段时间分析了Selenium+Phantomjs的使用方法以及性能优化问题,期间也分析了利用Selenium+phantomjs爬虫爬过的一些坑问题。然而在使用phantomjs的过程中,并没有正真提升phantomjs的性能,爬虫性能也没有很好的提升。经过网友的提醒,发现其实是使用phantomjs的方法出了问题,因此无论怎么优化,都不能从根本上去提升性能。那么本篇就来好好说说,Phantomjs正确的打开方式。
抛弃selenium+phantomjs
之前我一直使用selenium去使用phantomjs,原因是因为selenium封装了phantomjs一部分功能,selenium又提供了python的接口模块,在python语言中可以很好地去使用selenium,间接地就可以使用phantomjs。然而,我现在要说的是,是时候抛弃selenium+phantomjs了,原因之一此封装的接口很久没有更新了(没人维护了),原因之二selenium只实现了一部分phantomjs功能,且很不完善。
phantomjs APi
通过查看phantomjs官方介绍,我们可以发现phantomjs的功能异常强大,绝不仅仅是selenium封装的功能那么简陋。phantomjs提供了很多种APi,具体可以查看:phantomjs api介绍,其中最常用的要属Phantomjs WebService与Phantomjs WebPage,前者用于开启http服务,后者用于发起http请求。
Phantomjs正确使用方式
正确打开方式应该使用phantomjs Webservice作为一种web服务的形式(api),将其与其他语言分离开来(比如python)。
设计流程:
Python通过http请求下发任务,Phantomjs Webservice获取任务后去处理,处理完以后再将结果返回给Python。任务调度、存储等复杂操作交给Python去做,Python可以写成异步并发去请求Phantomjs Webservice,需要注意的是目前一个Phantomjs Webservice只支持10个并发。但我们可以在一台服务器上多开几个phantomjs Webservice启用不同的端口即可,或者可以多台服务器做个集群,用nginx做反向代理。
Phantomjs Webservice
新建test.js,写入如下代码:
作用:处理http请求,获取url,进行截图或者获取源码操作。
使用:
会在本地开启web服务,端口为8080。
Python Client
新建http_request.py,写入如下代码:
作用:异步并发下发任务。
运行截图
运行python以后,异步下发10个任务,Phantomjs服务器端接收到url并开始处理,并发处理10个任务并输入结果。
异常处理
现象:截图为黑屏
原因:网页还没加载完,就开始截图了
解决:在代码中open以后判断status值,判断网页是否加载完毕。
现象:程序出错–windows报错
解决:更换最新版本的phantomjs
现象:内存占用过大,导致报错停止phantomjs进程
原因:phantomjs没有释放内容
解决:代码中open以后,要open.close();
现象:没有截图成功
原因:用了page.close,因为onloadfinished是非阻塞的,因此要将page.close放在open代码层内部。
转载请说明出处:Phantomjs正确打开方式 | nMask’Blog
本文地址:http://thief.one/2017/03/31/Phantomjs正确打开方式/
传送门
【phantomjs系列】phantomjs正确打开方式
【phantomjs系列】phantomjs api介绍
【phantomjs系列】selenium+phantomjs爬过的那些坑
【phantomjs系列】selenium+phantomjs性能优化