Python爬蟲學習(10):Selenium的好基友PhantomJS

  上一節中咱們學習了selenium,用python來操做瀏覽器,在作網頁自動化測試的時候最好不過了 。若是咱們來作爬蟲用一個帶界面的瀏覽器彷佛不太好吧,那可咋辦呢?彆着急,下來咱們要介紹的就是一款不帶界面的瀏覽器--PhantomJS。其是一個無界面的,可腳本編程的WebKit瀏覽器引擎,支持多種web 標準:DOM 操做,CSS選擇器,JSON,Canvas 以及SVG。html

  這裏可能會有人問:爲何要用瀏覽器來抓取頁面數據,不用以前咱們以前直接經過Urllib獲取網頁而後分析呢? 這是由於咱們經過urllib獲取到僅僅是單個的html頁面代碼,可是實際上每一個頁面中會使用js來對頁面進行渲染 ,簡單來講就有可能會經過ajax來獲取數據,而後在頁面中添加新的元素,若是咱們用urllib單單是獲取到了html代碼,卻不能執行頁面中js代碼。因此咱們須要這樣的功能獲得徹底渲染後的頁面,這樣纔不會丟掉數據。因此咱們須要用到這個PantomJS咯。
python

1. PhantomJS的安裝linux

  PhantomJS安裝方法有兩種,一種是下載源碼以後本身來編譯,另外一種是直接下載編譯好的二進制文件。然而本身編譯須要的時間太長,並且須要挺多的磁盤空間。官方推薦直接下載二進制文件而後安裝。點擊下邊,選擇平臺下載。web

          http://phantomjs.org/download.htmlajax

  個人環境是CentOS7--X64,因此下載了phantomjs-2.1.1-linux-x86_64.tar.bz2編程

  接下來我將其安裝在/usr/local中,首先 解壓到/usr/local/目錄中,而後重命名,接着將其中的bin目錄加入到環境變量中。
json

sudo tar -jxvf phantomjs-2.1.1-linux-x86_64.tar.bz2 -C /usr/local/
sudo mv /usr/local/phantomjs-2.1.1-linux-x86_64 /usr/local/phantomjs
sudo ln -s /usr/local/phantomjs/bin/phantomjs /usr/local/bin/phantomjs

 

  測試如下,在任意目錄中輸入: phantomjs -v,看看能不能調用瀏覽器

  

2. Hello World
網絡

  hello.js文件:函數

console.log('Hello, world!');
phantom.exit();

 

  經過 phantomjs hello.js 執行。

  程序輸出了 Hello,world!程序第二句話終止了 phantom 的執行。

  注意:phantom.exit();這句話很是重要,不然程序將永遠不會終止。 

3. 頁面加載

  能夠利用 phantom 來實現頁面的加載,下面的例子實現了頁面的加載並將頁面保存爲一張圖片。

  首先建立了一個webpage對象,而後加載本站點主頁,判斷響應狀態,若是成功,那麼保存截圖爲 example.png

  

  運行以後會直接生成一張example.png的網頁截圖

  

  這裏還能夠設置窗口的大小以及截圖時時的圖片大小。viewportSize設置瀏覽器的窗口大小。clipRect設置截圖的尺寸。

  

  執行完後的圖片爲:

  

3. 測試網頁加載速度

  計算了一個頁面的加載速度,同時還用到了命令行傳參的特性。程序判斷了參數的多少,若是參數不夠,那麼終止運行。而後記錄了打開頁面的時間,請求頁面以後,再紀錄當前時間,兩者之差就是頁面加載速度

  

  測試百度的加載速度,這個時間包括JS渲染的時間,固然和網速也有關。

  

4. 代碼評估

  利用 evaluate 方法咱們能夠獲取網頁的源代碼。這個執行是「沙盒式」的,它不會去執行網頁外的 JavaScript 代碼。evalute 方法能夠返回一個對象,然而返回值僅限於對象。

  下邊是一個顯示網頁的title的例子:

var page = require('webpage').create();
page.open("http://www.baidu.com", function(status) {
  var title = page.evaluate(function() {
    return document.title;
  });
  console.log('Page title is ' + title);
  phantom.exit();
});

  任何來自於網頁而且包括來自 evaluate() 內部代碼的控制檯信息,默認不會顯示。

  若是要顯示,則須要重寫這個行爲,使用 onConsoleMessage 回調函數,示例能夠改寫成

  

  其執行的結果爲:

  

5. 網絡監聽

  由於 PhantomJS 有網絡通訊的檢查功能,它也很適合用來作網絡行爲的分析。

  在請求的時候,能夠經過改寫onResourceRequested和onResourceReceived回調函數來實現接收到資源請求和資源接受完畢的監聽。以下是答應請求的信息和返回的信息,以json的方式呈現。

  

  執行後的效果圖:

  

6. 操做DOM

  腳本都是像在瀏覽器中運行的,因此標準的 JavaScript 的 DOM 操做和 CSS 選擇器也是生效的。

  例以下面的例子就修改了 User-Agent,而後去訪問httpuseragent.org,這個網頁就是分析顯示當前訪問用的useragent,而後咱們獲取這個頁面中來呈現useragent的元素,將其中的值打印出來。

  

  執行結果:

  

7. 使用附加庫

  在1.6版本以後容許添加外部的JS庫,好比下面的例子添加了jQuery,而後執行了jQuery代碼

  

相關文章
相關標籤/搜索