Selenium 這個庫,這其實是一個自動化測試工具,如今已經被普遍用於網絡爬蟲中來應對 JavaScript 渲染的頁面的抓取。html
但 Selenium 用的時候有個麻煩事,就是環境的相關配置,得安裝好相關瀏覽器,好比 Chrome、Firefox 等等,而後還要到官方網站去下載對應的驅動,最重要的還須要安裝對應的 Python Selenium 庫,確實是否是很方便,另外若是要作大規模部署的話,環境配置的一些問題也是個頭疼的事情。git
那麼本節就介紹另外一個相似的替代品,叫作 Pyppeteer。注意,是叫作 Pyppeteer,不是 Puppeteer。Puppeteer 是 Google 基於 Node.js 開發的一個工具,有了它咱們能夠經過 JavaScript 來控制 Chrome 瀏覽器的一些操做,固然也能夠用做網絡爬蟲上,其 API 極其完善,功能很是強大。 而 Pyppeteer 又是什麼呢?它其實是 Puppeteer 的 Python 版本的實現,但他不是 Google 開發的,是一位來自於日本的工程師依據 Puppeteer 的一些功能開發出來的非官方版本。github
在 Pyppetter 中,實際上它背後也是有一個相似 Chrome 瀏覽器的 Chromium 瀏覽器在執行一些動做進行網頁渲染,首先說下 Chrome 瀏覽器和 Chromium 瀏覽器的淵源。瀏覽器
Chromium 是谷歌爲了研發 Chrome 而啓動的項目,是徹底開源的。兩者基於相同的源代碼構建,Chrome 全部的新功能都會先在 Chromium 上實現,待驗證穩定後纔會移植,所以 Chromium 的版本更新頻率更高,也會包含不少新的功能,但做爲一款獨立的瀏覽器,Chromium 的用戶羣體要小衆得多。兩款瀏覽器「同根同源」,它們有着一樣的 Logo,但配色不一樣,Chrome 由藍紅綠黃四種顏色組成,而 Chromium 由不一樣深度的藍色構成。安全
總的來講,兩款瀏覽器的內核是同樣的,實現方式也是同樣的,能夠認爲是開發版和正式版的區別,功能上基本是沒有太大區別的。網絡
Pyppeteer 就是依賴於 Chromium 這個瀏覽器來運行的。那麼有了 Pyppeteer 以後,咱們就能夠免去那些繁瑣的環境配置等問題。若是第一次運行的時候,Chromium 瀏覽器沒有安全,那麼程序會幫咱們自動安裝和配置,就免去了繁瑣的環境配置等工做。另外 Pyppeteer 是基於 Python 的新特性 async 實現的,因此它的一些執行也支持異步操做,效率相對於 Selenium 來講也提升了。less
Pyppeteer 採用了 Python 的 async 機制,因此其運行要求的 Python 版本爲 3.5 及以上。異步
安裝方式:async
pip3 install pyppeteer
import asyncio from lxml import etree from pyppeteer import launch#發射 #必須在協程中聲明瀏覽器 不然會出錯 async def main(): #由於這是函數 因此須要掛起 #實例化瀏覽器對象 參數headless=False是有瀏覽器 True是沒有瀏覽器 browser =await launch(headless=False) #建立一個新的頁面(由於函數仍是須要掛載) new_page = await browser.newPage() #在新建的網頁發送url 請求網頁須要掛起 await new_page.goto("http://quotes.toscrape.com/js/") #獲取新頁面的源碼數據 #解析的頁面數據能夠給循環事件對象添加回調函數,即先綁定task.add_done_callback(parser)參數爲函數名 page_text =await new_page.content() tree = etree.HTML(page_text) div_list = tree.xpath('//div[@class="quote"]') print(div_list) await browser.close() loop = asyncio.get_event_loop() loop.run_until_complete(main())
總之利用 Pyppeteer 咱們能夠控制瀏覽器執行幾乎全部動做,想要的操做和功能基本均可以實現,用它來自由地控制爬蟲固然就不在話下了。函數
解釋:launch 方法會新建一個 Browser 對象,而後賦值給 browser,而後調用 newPage 方法至關於瀏覽器中新建了一個選項卡,同時新建了一個 Page 對象。而後 Page 對象調用了 goto 方法就至關於在瀏覽器中輸入了這個 URL,瀏覽器跳轉到了對應的頁面進行加載,加載完成以後再調用 content 方法,返回當前瀏覽器頁面的源代碼。而後進一步地,咱們用 lxml進行一樣地解析,就能夠獲得 JavaScript 渲染的結果了。在這個過程當中,咱們沒有配置 Chrome 瀏覽器,沒有配置瀏覽器驅動,免去了一些繁瑣的步驟,一樣達到了 Selenium 的效果,還實現了異步抓取.
瞭解了基本的實例以後,咱們再來梳理一下 Pyppeteer 的一些基本和經常使用操做。Pyppeteer 的幾乎全部功能都能在其官方文檔的 API Reference 裏面找到,官方文檔連接爲:
https://miyakogi.github.io/pyppeteer/reference.html
若是須要其餘瀏覽器想要實現的功能,官方文檔中去找。