08-Pyppeteer

Pyppeteer的介紹

     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

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

若是須要其餘瀏覽器想要實現的功能,官方文檔中去找。