python爬蟲神器Pyppeteer入門及使用

這篇文章主要介紹了python爬蟲神器Pyppeteer入門及使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
前言

提起selenium想必大家都不陌生,作爲一款知名的Web自動化測試框架,selenium支持多款主流瀏覽器,提供了功能豐富的API接口,經常被我們用作爬蟲工具來使用。但是selenium的缺點也很明顯,比如速度太慢、對版本配置要求嚴苛,最麻煩是經常要更新對應的驅動。

今天就給大家介紹另一款web自動化測試工具Pyppeteer,雖然支持的瀏覽器比較單一,但在安裝配置的便利性和運行效率方面都要遠勝selenium。

01.Pyppeteer簡介

介紹Pyppeteer之前先說一下Puppeteer,Puppeteer是谷歌出品的一款基於Node.js開發的一款工具,主要是用來操縱Chrome瀏覽器的 API,通過Javascript代碼來操縱Chrome瀏覽器,完成數據爬取、Web程序自動測試等任務。

Pyppeteer其實是Puppeteer的Python版本,下面簡單介紹下Pyppeteer的兩大特點,chromium瀏覽器和asyncio框架:

1).chromium

Chromium是一款獨立的瀏覽器,是Google爲發展自家的瀏覽器Google Chrome而開啓的計劃,相當於Chrome的實驗版,Chromium的穩定性不如Chrome但是功能更加豐富,而且更新速度很快,通常每隔數小時就有新的開發版本發佈。

Pyppeteer的web自動化是基於chromium來實現的,由於chromium中某些特性的關係,Pyppeteer的安裝配置非常簡單,關於這一點稍後我們會詳細介紹。

2).asyncio

asyncio是Python的一個異步協程庫,自3.4版本引入的標準庫,直接內置了對異步IO的支持,號稱是Python最有野心的庫,官網上有非常詳細的介紹:在這裏插入圖片描述
02.安裝與使用

1).極簡安裝

使用pip install pyppeteer命令就能完成pyppeteer庫的安裝,至於chromium瀏覽器,只需要一條pyppeteer-install命令就會自動下載對應的最新版本chromium瀏覽器到pyppeteer的默認位置。

如果不運行pyppeteer-install命令,在第一次使用pyppeteer的時候也會自動下載並安裝chromium瀏覽器,效果是一樣的。總的來說,pyppeteer比起selenium省去了driver配置的環節。

當然,出於某種原因,也可能會出現chromium自動安裝無法順利完成的情況,這時可以考慮手動安裝:首先,從下列網址中找到自己系統的對應版本,下載chromium壓縮包;

‘linux’: ‘https://storage.googleapis.com/chromium-browser-snapshots/Linux_x64/575458/chrome-linux.zip’
‘mac’: ‘https://storage.googleapis.com/chromium-browser-snapshots/Mac/575458/chrome-mac.zip’
‘win32’: ‘https://storage.googleapis.com/chromium-browser-snapshots/Win/575458/chrome-win32.zip’
‘win64’: ‘https://storage.googleapis.com/chromium-browser-snapshots/Win_x64/575458/chrome-win32.zip’
然後,將壓縮包放到pyppeteer的指定目錄下解壓縮,windows系統的默認目錄。其他系統下的默認目錄可以參照下面這幅圖:在這裏插入圖片描述
2).使用

安裝完後就來試試效果。一起來看下面這段代碼,在main函數中,先是建立一個瀏覽器對象,然後打開新的標籤頁,訪問百度主頁,對當前頁面截圖並保存爲“example.png”,最後關閉瀏覽器。前文也提到過,pyppeteer是基於asyncio構建的,所以在使用的時候需要用到async/await結構。在這裏插入圖片描述
運行上面這段代碼會發現並沒有瀏覽器彈出運行,這是因爲Pyppeteer默認使用的是無頭瀏覽器,如果想要瀏覽器顯示,需要在launch函數中設置參數“headless =False”,程序運行結束後在同一目錄下會出現截取到的網頁圖片:在這裏插入圖片描述
03.實戰異步基金爬取

我們前面一直在說Pyppeteer是一款非常高效的web自動化測試工具,其本質原因是由於Pyppeteer是基於asyncio構建的,它的所有屬性和方法幾乎都是coroutine對象,因此在構建異步程序的時候非常方便,天生就支持異步運行。

下面就來對比順序執行和異步運行的效率究竟如何:

1).基金爬取

我們把天天基金網中的開放式基金淨值數據爬取作爲本次的實驗任務,下面這張圖是一支基金的歷史淨值數據,這個頁面是js加載的,沒辦法通過requests直接獲取內容信息,因此可以考慮使用模擬瀏覽器操作的方式進行數據抓取。(事實上基金淨值數據的獲取是有API接口的,本次任務只是爲了演示,不具備實用價值)在這裏插入圖片描述
爲了使效果更加明顯,我們此次爬取基金列表頁(下圖)前50支基金的近20個交易日的淨值數據。在這裏插入圖片描述
2).順序執行

程序構建的基本思路是新建一個browser瀏覽器和一個頁面page,依次訪問每個基金的淨值數據頁面並爬取數據。核心代碼如下:在這裏插入圖片描述
代碼中的get_data()函數用於淨值數據頁面解析和數據的轉化,get_all_codes()函數用於獲取全部開放式基金的基金代碼(共6000餘個)。雖然程序也使用了async/await的結構,但是對多個基金的淨值數據獲取都是在callurl_and_getdata()函數中順序執行的,之所以這樣寫是因爲pyppeteer中的方法都是coroutine對象,必須以這種形式構建程序。

爲了排除打開瀏覽器的耗時干擾,我們僅統計訪問頁面和數據抓取的用時,其結果爲:12.08秒。

3).異步執行

下面我們把程序改造一下,功能函數都不變,主要是把對fundlist的循環運行改裝成async的task對象。核心代碼如下:在這裏插入圖片描述
耗時的統計區間仍然從瀏覽器打開後開始計算,其運行用時爲:2.18秒,相比順序執行要快了6倍。可以想象,如果需要爬取的工作量比較大,順序執行需要10個小時的話,異步執行可能只需要不到2個小時,優化效果可謂非常明顯了。

推薦我們的python學習基地,看前輩們是如何學習的!從基礎的python腳本、爬蟲、django、數據挖掘

等編程技術,還有整理零基礎到項目實戰的資料,送給每一位愛學習python的小夥伴!每天都有老前輩

定時講解Python技術,分享一些學習的方法和需要留意的小細節,點擊加入我們的 python學習者聚集地

發佈了33 篇原創文章 · 獲贊 35 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章