前段时间分析了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,写入如下代码:
phantomjs.exe test.js
会在本地开启web服务,端口为8080。
Python Client
新建http_request.py,写入如下代码:
作用:异步并发下发任务。
运行截图
运行python以后,异步下发10个任务,Phantomjs服务器端接收到url并开始处理,并发处理10个任务并输入结果。
原文发布时间为:2017-08-27
本文作者:nmask
本文来自云栖社区合作伙伴“Python中文社区”,了解相关信息可以关注“Python中文社区”微信公众号