python爬蟲神器Pyppeteer入門及使用
前言
提起selenium想必大家都不陌生,作為一款知名的Web自動化測試框架,selenium支持多款主流瀏覽器,提供了功能豐富的API接口,經常被我們用作爬蟲工具來使用。但是selenium的缺點也很明顯,比如速度太慢、對版本配置要求嚴苛,最麻煩是經常要更新對應的驅動。
今天就給大家介紹另一款web自動化測試工具Pyppeteer,雖然支持的瀏覽器比較單一,但在安裝配置的便利性和運行效率方面都要遠勝selenium。
01.Pyppeteer簡介
介紹Pyppeteer之前先說一下Puppeteer,Puppeteer是谷歌出品的一款基于Node.js開發(fā)的一款工具,主要是用來操縱Chrome瀏覽器的 API,通過Javascript代碼來操縱Chrome瀏覽器,完成數(shù)據(jù)爬取、Web程序自動測試等任務。
Pyppeteer其實是Puppeteer的Python版本,下面簡單介紹下Pyppeteer的兩大特點,chromium瀏覽器和asyncio框架:
1).chromium
Chromium是一款獨立的瀏覽器,是Google為發(fā)展自家的瀏覽器Google Chrome而開啟的計劃,相當于Chrome的實驗版,Chromium的穩(wěn)定性不如Chrome但是功能更加豐富,而且更新速度很快,通常每隔數(shù)小時就有新的開發(fā)版本發(fā)布。
Pyppeteer的web自動化是基于chromium來實現(xiàn)的,由于chromium中某些特性的關系,Pyppeteer的安裝配置非常簡單,關于這一點稍后我們會詳細介紹。
2).asyncio
asyncio是Python的一個異步協(xié)程庫,自3.4版本引入的標準庫,直接內置了對異步IO的支持,號稱是Python最有野心的庫,官網上有非常詳細的介紹:
02.安裝與使用
1).極簡安裝
使用pip install pyppeteer命令就能完成pyppeteer庫的安裝,至于chromium瀏覽器,只需要一條pyppeteer-install命令就會自動下載對應的最新版本chromium瀏覽器到pyppeteer的默認位置。
如果不運行pyppeteer-install命令,在第一次使用pyppeteer的時候也會自動下載并安裝chromium瀏覽器,效果是一樣的??偟膩碚f,pyppeteer比起selenium省去了driver配置的環(huán)節(jié)。
當然,出于某種原因,也可能會出現(xiàn)chromium自動安裝無法順利完成的情況,這時可以考慮手動安裝:首先,從下列網址中找到自己系統(tǒng)的對應版本,下載chromium壓縮包;
- 'linux':
- 'mac':
- 'win32':
- 'win64':
然后,將壓縮包放到pyppeteer的指定目錄下解壓縮,windows系統(tǒng)的默認目錄。其他系統(tǒng)下的默認目錄可以參照下面這幅圖:
2).使用
安裝完后就來試試效果。一起來看下面這段代碼,在main函數(shù)中,先是建立一個瀏覽器對象,然后打開新的標簽頁,訪問百度主頁,對當前頁面截圖并保存為“example.png”,最后關閉瀏覽器。前文也提到過,pyppeteer是基于asyncio構建的,所以在使用的時候需要用到async/await結構。
運行上面這段代碼會發(fā)現(xiàn)并沒有瀏覽器彈出運行,這是因為Pyppeteer默認使用的是無頭瀏覽器,如果想要瀏覽器顯示,需要在launch函數(shù)中設置參數(shù)“headless =False”,程序運行結束后在同一目錄下會出現(xiàn)截取到的網頁圖片:
03.實戰(zhàn)異步基金爬取
我們前面一直在說Pyppeteer是一款非常高效的web自動化測試工具,其本質原因是由于Pyppeteer是基于asyncio構建的,它的所有屬性和方法幾乎都是coroutine對象,因此在構建異步程序的時候非常方便,天生就支持異步運行。
下面就來對比順序執(zhí)行和異步運行的效率究竟如何:
1).基金爬取
我們把天天基金網中的開放式基金凈值數(shù)據(jù)爬取作為本次的實驗任務,下面這張圖是一支基金的歷史凈值數(shù)據(jù),這個頁面是js加載的,沒辦法通過requests直接獲取內容信息,因此可以考慮使用模擬瀏覽器操作的方式進行數(shù)據(jù)抓取。(事實上基金凈值數(shù)據(jù)的獲取是有API接口的,本次任務只是為了演示,不具備實用價值)
為了使效果更加明顯,我們此次爬取基金列表頁(下圖)前50支基金的近20個交易日的凈值數(shù)據(jù)。
2).順序執(zhí)行
程序構建的基本思路是新建一個browser瀏覽器和一個頁面page,依次訪問每個基金的凈值數(shù)據(jù)頁面并爬取數(shù)據(jù)。核心代碼如下:
代碼中的get_data()函數(shù)用于凈值數(shù)據(jù)頁面解析和數(shù)據(jù)的轉化,get_all_codes()函數(shù)用于獲取全部開放式基金的基金代碼(共6000余個)。雖然程序也使用了async/await的結構,但是對多個基金的凈值數(shù)據(jù)獲取都是在callurl_and_getdata()函數(shù)中順序執(zhí)行的,之所以這樣寫是因為pyppeteer中的方法都是coroutine對象,必須以這種形式構建程序。
為了排除打開瀏覽器的耗時干擾,我們僅統(tǒng)計訪問頁面和數(shù)據(jù)抓取的用時,其結果為:12.08秒。
3).異步執(zhí)行
下面我們把程序改造一下,功能函數(shù)都不變,主要是把對fundlist的循環(huán)運行改裝成async的task對象。核心代碼如下:
耗時的統(tǒng)計區(qū)間仍然從瀏覽器打開后開始計算,其運行用時為:2.18秒,相比順序執(zhí)行要快了6倍??梢韵胂?,如果需要爬取的工作量比較大,順序執(zhí)行需要10個小時的話,異步執(zhí)行可能只需要不到2個小時,優(yōu)化效果可謂非常明顯了。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
python 中的collections.OrderedDict() 用法
這篇文章主要介紹了python 中的collections.OrderedDict() 用法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-05-05Python基于回溯法子集樹模板實現(xiàn)圖的遍歷功能示例
這篇文章主要介紹了Python基于回溯法子集樹模板實現(xiàn)圖的遍歷功能,結合實例形式分析了Python使用回溯法子集樹模板針對圖形遍歷問題的相關操作技巧與注意事項,需要的朋友可以參考下2017-09-09windows環(huán)境下tensorflow安裝過程詳解
這篇文章主要為大家詳細介紹了windows環(huán)境下tensorflow安裝過程,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-03-03基于Python的網頁自動化工具DrissionPage的使用詳解
DrissionPage 是一個基于 python 的網頁自動化工具,它既能控制瀏覽器,也能收發(fā)數(shù)據(jù)包,還能把兩者合而為一,下面就跟隨小編一起來學習一下它的具體使用吧2024-01-01