爬蟲界又出神器|一款比selenium更高效的利器

提起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個小時,優化效果可謂非常明顯了。


轉載于:https://juejin.im/post/5d0caff1f265da1b8d162576

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/247742.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/247742.shtml
英文地址,請注明出處:http://en.pswp.cn/news/247742.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java數組 —(7)

* 1.數組的理解:數組(Array),是多個相同類型數據一定順序排列的集合,并使用一個名字命名, 并通過編號的方式對這些數據進行統一管理。 * 2.數組相關的概念: 數組名 元素 角標、下標、索引 數組的長度:元素…

bootstrap按鈕的邊框問題 去除

問題: 用bootstrap做的按鈕,點擊后,都會出現邊框,請問如何去除? .btn:focus, .btn:active:focus, .btn.active:focus, .btn.focus, .btn:active.focus, .btn.active.focus {outline: none; }還要去除陰影添…

C#一些面試知識題

1.簡述 private、 protected、 public、internal 修飾符的訪問權限答:private:私有成員, 在類的內部才可以訪問(只能從其聲明上下文中進行訪問)。 protected:保護成員,該類內部和從該類派生的類中可以訪問。 Friend:友…

vue加載時閃現模板語法-處理方法

問題&#xff1a;使用VUE時&#xff0c;頁面加載瞬間&#xff0c;會閃現模板語法&#xff0c;例如{{ item.name }}等 解決辦法&#xff1a; 1、可以通過VUE內置的指令v-cloak解決這個問題&#xff08;推薦&#xff09; 具體實現&#xff1a; <ul v-cloak v-for"ite…

java數組 —(8)

1.數組的創建與元素賦值&#xff1a; 楊輝三角&#xff08;二維數組&#xff09;、回形數&#xff08;二維數組&#xff09;、6個數&#xff0c;1-30之間隨機生成且不重復。 2.針對于數值型的數組&#xff1a; 最大值、最小值、總和、平均數等 3.數組的賦值與復制 int[] a…

idea啟動tomcat時報錯:Error during artifact deployment. See server log for details.

Error during artifact deployment. See server log for details. 這個很多人都找不出來&#xff0c;原因無非2個&#xff1a; 一、jar 包有有些沒能識別&#xff0c;tomcat沒有配置好&#xff01; 二、這個一般代碼錯了&#xff1a; 除了看 server 的報錯&#xff0c;別忘了看…

java運算符 —(9)

1.理解&#xff1a; ① 定義在java.util包下。 ② Arrays:提供了很多操作數組的方法。 2.使用&#xff1a; //1.boolean equals(int[] a,int[] b):判斷兩個數組是否相等。int[] arr1 new int[]{1,2,3,4};int[] arr2 new int[]{1,3,2,4};boolean isEquals Arrays.equals(a…

css 三角角標樣式

.sanjiao {width: 0px;height: 0px;overflow: hidden;border-width: 100px;border-color: red transparent transparent transparent; border-style: solid dashed dashed dashed; }

leetcode 279 四平方定理

可以用四平方和定理&#xff1a;任意一個正整數都可以表示為4個以內整數的平方和。 如果一個數含有因子4&#xff0c;那么我們可以把4都去掉&#xff0c;并不影響結果。比如&#xff1a;8去掉4&#xff0c;12去掉3&#xff0c;返回的結果都相同。 如果一個數除以8余7&#xff0…

java類與對象 —(10)

1.面向對象學習的三條主線&#xff1a; 1.Java類及類的成員&#xff1a;屬性、方法、構造器&#xff1b;代碼塊、內部類2.面向對象的大特征&#xff1a;封裝性、繼承性、多態性、(抽象性)3.其它關鍵字&#xff1a;this、super、static、final、abstract、interface、package、…

RESTful API 編寫規范

基于一些不錯的RESTful開發組件&#xff0c;可以快速的開發出不錯的RESTful API&#xff0c;但如果不了解開發規范的、健壯的RESTful API的基本面&#xff0c;即便優秀的RESTful開發組件擺在面前&#xff0c;也無法很好的理解和使用。下文Gevin結合自己的實踐經驗&#xff0c;整…

Python2與Python3的區別

Python2與Python3的區別 1) 核心類差異 Python3 對 Unicode 字符的原生支持。 Python2 中使用 ASCII 碼作為默認編碼方式導致 string 有兩種類型 str 和 unicode&#xff0c;Python3 只 支持 unicode 的 string。Python2 和 Python3 字節和字符對應關系為&#xff1a; python2p…

JavaScript-內存空間

深入了解js這門語言后&#xff0c;才發現它有著諸多眾所周知的難點&#xff08;例如&#xff1a;閉包、原型鏈、內存空間等&#xff09;。有的是因為js的設計缺陷導致的&#xff0c;而有的則是js的優點。不管如何&#xff0c;總需要去學會它們&#xff0c;在學習過程中我覺得只…

java類的結構1: 屬性 —(11)

類的設計中&#xff0c;兩個重要結構之一&#xff1a;屬性 對比&#xff1a;屬性 vs 局部變量 1.相同點&#xff1a; 1.1 定義變量的格式&#xff1a;數據類型 變量名 變量值1.2 先聲明&#xff0c;后使用1.3 變量都其對應的作用域 2.不同點&#xff1a; 2.1 在類中聲明的…

GXU - 7D - 區間求和 - 前綴和

https://oj.gxu.edu.cn/contest/7/problem/D 描述 有一個所有元素皆為0的數組A&#xff0c;有兩種操作&#xff1a; 1 l r x表示將A區間[l,r]內所有數加上x&#xff1b; 2 l r表示將A區間[l,r]內從左往右數第i個數加上i&#xff1b; 給出m個操作&#xff0c;請輸出操作結束后A中…

javascript-排序算法

插入排序 算法描述&#xff1a; 1. 從第一個元素開始&#xff0c;該元素可以認為已經被排序 2. 取出下一個元素&#xff0c;在已經排序的元素序列中從后向前掃描 3. 如果該元素&#xff08;已排序&#xff09;大于新元素&#xff0c;將該元素移到下一位置 4. 重復步驟 3&am…

DPDK并行計算

參考文獻&#xff1a; 《深入淺出DPDK》 https://www.cnblogs.com/LubinLew/p/cpu_affinity.html ...................................................................... 前言&#xff1a; 處理器提高性能主要是通過兩個途徑&#xff0c;一個是提高IPC&#xff08;CPU每一時…

Highcharts圖表-ajax-獲取json數據生成圖表

重點說明此代碼是針對一個報表顯示多個項對比顯示。 直接貼代碼&#xff1a;web端 <script type"text/JavaScript" src"js/jQuery/jquery-1.7.2.js"></script> <script type"text/javascript" src"j…

關于RGBDSLAMV2學習、安裝、調試過程

Step&#xff11;&#xff1a;https://github.com/felixendres/rgbdslam_v2/wiki/Instructions-for-Compiling-Rgbdslam-(V2)-on-a-Fresh-Ubuntu-16.04-Install-(Ros-Kinetic)-in-Virtualbox 照著這個instructions安裝好 rgbdslamv2&#xff0c;并且在安裝的過程中&#xff0c;…

Java—List的用法與實例詳解

List特點和常用方法 List是有序、可重復的容器。 有序指的是&#xff1a;List中每個元素都有索引標記。可以根據元素的索引標記&#xff08;在List中的位置&#xff09;訪問元素&#xff0c;從而精確控制這些元素。 可重復指的是&#xff1a;List允許加入重復的元素。更確切地講…