爬蟲利器Pyppeteer的介紹和使用 爬取京東商城書籍資訊
提起 selenium 想必大家都不陌生,作為一款知名的 Web 自動化測試框架,selenium 支援多款主流瀏覽器,提供了功能豐富的API 介面,經常被我們用作爬蟲工具來使用。但是 selenium 的缺點也很明顯,比如速度太慢、對版本配置要求嚴苛,最麻煩是經常要更新對應的驅動。還有些網頁是可以檢測到是否是使用了selenium 。並且selenium 所謂的保護機制不允許跨域 cookies 儲存以及登入的時候必須先開啟網頁然後後載入 cookies 再重新整理的方式很不友好。
今天給大家介紹另一款 web 自動化測試工具 Pyppeteer,雖然支援的瀏覽器比較單一,但在安裝配置的便利性和執行效率上相比selenium要好。介紹 Pyppeteer 之前先說一下 Puppeteer,Puppeteer 是 Google 基於 Node.js 開發的一個工具,主要是用來操縱 Chrome 瀏覽器的 API,透過 Javascript 程式碼來操縱 Chrome 瀏覽器的一些操作,用作網路爬蟲進行資料爬取、Web 程式自動測試等任務。其 API 極其完善,功能非常強大。 而 Pyppeteer 實際上是 Puppeteer 的 Python 版本的實現,但他不是 Google 開發的,是一位來自於日本的工程師依據 Puppeteer 的一些功能開發出來的非官方版本。
1. Pyppeteer介紹
Puppeteer 是 Google 基於 Node.js 開發的一個工具,有了它我們可以透過 JavaScript 來控制 Chrome 瀏覽器的一些操作,當然也可以用作網路爬蟲上,其 API 極其完善,功能非常強大,Selenium 當然同樣可以做到。而 Pyppeteer 又是什麼呢?它實際上是 Puppeteer 的 Python 版本的實現,但它不是 Google 開發的,是一位來自於日本的工程師依據 Puppeteer 的一些功能開發出來的非官方版本。在 Pyppetter 中,實際上它背後也是有一個類似 Chrome 瀏覽器的 Chromium 瀏覽器在執行一些動作進行網頁渲染,首先說下 Chrome 瀏覽器和 Chromium 瀏覽器的淵源。Chromium 是谷歌為了研發 Chrome 而啟動的專案,是完全開源的。二者基於相同的原始碼構建,Chrome 所有的新功能都會先在 Chromium 上實現,待驗證穩定後才會移植,因此 Chromium 的版本更新頻率更高,也會包含很多新的功能,但作為一款獨立的瀏覽器,Chromium 的使用者群體要小眾得多。兩款瀏覽器“同根同源”,它們有著同樣的 Logo,但配色不同,Chrome 由藍紅綠黃四種顏色組成,而 Chromium 由不同深度的藍色構成。
總而言之,兩款瀏覽器的核心是一樣的,實現方式也是一樣的,可以認為是開發版和正式版的區別,功能上基本是沒有太大區別的。
Pyppeteer 就是依賴於 Chromium 這個瀏覽器來執行的。在有了 Pyppeteer 之後,就可以免去那些煩瑣的環境配置等問題。第一次執行的時候,如果Chromium 瀏覽器沒有安裝,那麼程式會幫我們自動安裝和配置,就免去了煩瑣的環境配置等工作。另外 Pyppeteer 是基於Python 的新特性 async 實現的,所以它的一些執行也支援非同步操作,效率相對於 Selenium 來說也提高了。
2. Pyppeteer的安裝與使用
安裝:
由於 Pyppeteer 採用了 Python 的 async 機制,所以其執行要求的 Python 版本為 3.5 及以上。安裝方式很簡單,命令列pip安裝即可。
安裝完成之後在命令列測試:
如果沒有報錯,那就證明安裝成功了。
使用:
Pyppeteer 是一款非常高效的 web 自動化測試工具,由於 Pyppeteer 是基於 asyncio 構建的,它的所有屬性和方法幾乎都是coroutine (協程) 物件,因此在構建非同步程式的時候非常方便,天生就支援非同步執行。
測試程式碼如下:
第一次使用 pyppeteer 的時候會自動下載並安裝 chromium 瀏覽器
執行效果如下:
頁面截圖:
程式成功執行,在main函式中進行的操作有,初始化一個瀏覽器物件,然後開啟新的標籤頁,設定頁面檢視大小,訪問百度主頁,對當前頁面截圖並儲存為example1.png,然後模擬在搜尋框中輸入’python Pyppeteer爬蟲’,模擬點選百度一下,跳轉到搜尋結果網頁,再對當前頁面截圖並儲存為example2.png,最後關閉瀏覽器。pyppeteer是基於asyncio 構建的,所以在使用的時候要用到 async/await 結構。
用Pyppeteer啟動瀏覽器,呼叫 launch 方法即可實現。
可以看到它處於 launcher 模組中,引數沒有在宣告中特別指定,返回型別是 browser 模組中的 Browser 物件,另外檢視其原始碼發現這是一個 async 修飾的方法,所以呼叫它的時候需要使用 await。
常用引數: jiaozuo/
- headless (bool):是否啟用 Headless 模式,即無介面模式,如果 devtools 這個引數是 True 的話,那麼該引數就會被設定為 False,否則為 True, 即預設是開啟無介面模式的。
- devtools (bool):**是否為每一個頁面自動開啟除錯工具,**預設是 False。如果這個引數設定為 True,那麼 headless 引數就會無效,會被強制設定為 False。
- args (List[str]):在執行過程中可以傳入的額外引數。
- userDataDir (str):即使用者資料資料夾,即可以保留一些個性化配置和操作記錄。
- loop (asyncio.AbstractEventLoop):事件迴圈物件。
- executablePath (str):可執行檔案的路徑,如果指定之後就不需要使用預設的 Chromium 了,可以指定為已有的 Chrome 或 Chromium。
- env (dict):環境變數,可以透過字典形式傳入。
禁用提示條
在之前執行效果圖中,我們可以看到上面的一條提示:“Chrome 正受到自動測試軟體的控制”,不喜歡這個提示出現的話,我們可以利用 args 引數將其禁用,禁用操作如下:
修改網站檢測瀏覽器特徵值
只是把提示關閉了,有些網站還是會檢測到是 WebDriver,測試如下:
執行效果如下:
這說明 Pyppeteer 開啟 Chromium 照樣還是能被檢測到 WebDriver 的存在。
無論是selenium的execute_script()方法,還是pyppeteer的evaluate()方法執行下面程式碼都能臨時修改瀏覽器屬性中的webdriver屬性,當頁面重新整理或者跳轉之後該值就原形畢露。
但是pyppeteer的最底層是封裝的puppeteer,是js庫,是和網站原始碼互動最深的方式。
在pyppeteer中提供了一個方法:evaluateOnNewDocument(),該方法是將一段js程式碼載入到頁面文件中,當發生頁面導航、頁面內嵌框架導航的時候載入的js程式碼會自動執行,那麼當頁面重新整理的時候該js也會執行,這樣就保證了修改網站的屬性持久化的目的。
程式碼改寫如下:
執行效果如下:
可以看到,繞過了 WebDriver 的檢測。
開啟無痕模式
Chrome 瀏覽器是可以開無痕模式的,它的好處就是環境比較乾淨,不與其他的瀏覽器示例共享 Cache、Cookies 等內容,其開啟方式可以透過 createIncognitoBrowserContext 方法,程式碼如下:
更多詳細使用可以參考如下文件
- pyppeteer github 地址:
- pyppeteer 常用方法手冊: https://blog.zhangkunzhi.com/2019/05/13/pyppeteer%E5%B8%B8%E7%94%A8%E6%96%B9%E6%B3%95%E6%89%8B%E5%86%8C/index.html
3. Pyppeteer爬蟲實戰 非同步爬取京東商城書籍資訊
有些網站的頁面是 JavaScript 渲染而成的,我們所看到的內容都是網頁載入後又執行了JavaScript程式碼之後才呈現出來的,因此這些資料並不存在於原始 HTML 程式碼中,而 requests 僅僅抓取的是原始 HTML 程式碼。
抓取這種型別網站的頁面資料,解決方案如下:
- 分析網頁原始碼資料,如果資料是隱藏在 HTML 中的其他地方,以 JavaScript 變數的形式存在,直接提取就好了。
- 分析 Ajax,很多資料可能是經過 Ajax 請求時候獲取的,所以可以分析其介面。
- 模擬JavaScript渲染過程,直接抓取渲染後的結果。
Pyppeteer爬蟲就是用的第三種方法
執行效果如下:
成功實現利用Pyppeteer爬蟲非同步爬取100頁的書籍資訊儲存到Excel,用時249.160s。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30239065/viewspace-2723031/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- java爬取豆瓣書籍資訊Java
- Python爬蟲爬取淘寶,京東商品資訊Python爬蟲
- python爬蟲練習之爬取豆瓣讀書所有標籤下的書籍資訊Python爬蟲
- 網路爬蟲:使用Scrapy框架編寫一個抓取書籍資訊的爬蟲服務爬蟲框架
- 京東商品資訊爬蟲爬蟲
- 爬蟲介紹爬蟲
- Java爬蟲-爬取疫苗批次資訊Java爬蟲
- 【0基礎學爬蟲】爬蟲基礎之自動化工具 Pyppeteer 的使用爬蟲
- Python爬蟲教程+書籍分享Python爬蟲
- Python爬蟲教程-01-爬蟲介紹Python爬蟲
- 分散式爬蟲之知乎使用者資訊爬取分散式爬蟲
- 爬蟲實戰(一):爬取微博使用者資訊爬蟲
- python爬蟲——爬取大學排名資訊Python爬蟲
- python爬蟲:爬蟲的簡單介紹及requests模組的簡單使用Python爬蟲
- python爬蟲--爬取鏈家租房資訊Python爬蟲
- Python一鍵爬取你所關心的書籍資訊Python
- Python爬蟲教程-34-分散式爬蟲介紹Python爬蟲分散式
- Python爬蟲教程-30-Scrapy 爬蟲框架介紹Python爬蟲框架
- Python爬蟲實戰:爬取淘寶的商品資訊Python爬蟲
- 小白學 Python 爬蟲(25):爬取股票資訊Python爬蟲
- 爬蟲01:爬取豆瓣電影TOP 250基本資訊爬蟲
- puppeteer介紹(一)爬蟲,效能,注入爬蟲
- VSCrawler爬蟲專案介紹爬蟲
- Python第一個爬蟲,爬取噹噹網 Top 500 本五星好評書籍Python爬蟲
- 爬蟲利器 Puppeteer 實戰爬蟲
- 在Pyppeteer中實現反爬蟲策略和資料保護爬蟲
- [python爬蟲] BeautifulSoup和Selenium簡單爬取知網資訊測試Python爬蟲
- Python爬蟲學習筆記(1)爬取知乎使用者資訊Python爬蟲筆記
- python爬蟲學習01--電子書爬取Python爬蟲
- 爬蟲爬取微信小程式爬蟲微信小程式
- 爬蟲之股票定向爬取爬蟲
- 使用 nodejs 寫爬蟲(-): 常用模組介紹和前置JS語法NodeJS爬蟲
- python 爬蟲實戰專案--爬取京東商品資訊(價格、優惠、排名、好評率等)Python爬蟲
- [python爬蟲] Selenium爬取新浪微博內容及使用者資訊Python爬蟲
- python爬蟲---網頁爬蟲,圖片爬蟲,文章爬蟲,Python爬蟲爬取新聞網站新聞Python爬蟲網頁網站
- 第一章 爬蟲介紹爬蟲
- 提高爬蟲爬取效率的辦法爬蟲
- 使用Python自動填寫問卷星(pyppeteer反爬蟲版)Python爬蟲