天天看點

Phantomjs的正确打開方式

前段時間分析了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的正确打開方式

作用:處理http請求,擷取url,進行截圖或者擷取源碼操作。 

使用:

phantomjs.exe test.js

會在本地開啟web服務,端口為8080。

Python Client

建立http_request.py,寫入如下代碼:

Phantomjs的正确打開方式

作用:異步并發下發任務。

運作截圖

運作python以後,異步下發10個任務,Phantomjs伺服器端接收到url并開始處理,并發處理10個任務并輸入結果。

原文釋出時間為:2017-08-27

本文作者:nmask