作者:nmask
博客地址:
https://thief.one/
前段時間分析了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,進行截圖或者獲取源碼操作。
使用:
phantomjs.exe test.js
會在本地開啟web服務,埠為8080。
Python Client
新建http_request.py,寫入如下代碼:
作用:異步並發下發任務。
運行截圖
運行python以後,異步下發10個任務,Phantomjs伺服器端接收到url並開始處理,並發處理10個任務並輸入結果。
長按掃描關注Python中文社區,
獲取更多技術乾貨!
Python 中 文 社 區
Python中文開發者的精神家園
合作、投稿請聯繫微信:
pythonpost
本文為作者原創作品,未經作者授權同意禁止轉載
本社區計劃在北京、上海、深圳、廣州、香港、杭州、成都、南京、武漢、西安十座城市設立城市俱樂部,以方便同城的Python開發者進行更加深入的交流,同時也為方便以後舉辦線上線下的活動,歡迎大家加入!請直接添加工作人員微信:pythonpost並註明所在城市申請即可。