python網絡爬蟲——Pyppeteer

Pyppeteer

pyppeteer模塊的基本使用

引言

Selenium 在被使用的時候有個麻煩事,就是環境的相關配置,得安裝好相關瀏覽器,好比 Chrome、Firefox 等等,而後還要到官方網站去下載對應的驅動,最重要的還須要安裝對應的 Python Selenium 庫,確實是否是很方便,另外若是要作大規模部署的話,環境配置的一些問題也是個頭疼的事情。那麼本節就介紹另外一個相似的替代品,叫作 Pyppeteer。html

Pyppeteer簡介

注意,本節講解的模塊叫作 Pyppeteer,不是 Puppeteer。Puppeteer 是 Google 基於 Node.js 開發的一個工具,有了它咱們能夠經過 JavaScript 來控制 Chrome 瀏覽器的一些操做,固然也能夠用做網絡爬蟲上,其 API 極其完善,功能很是強大。 而 Pyppeteer 又是什麼呢?它其實是 Puppeteer 的 Python 版本的實現,但他不是 Google 開發的,是一位來自於日本的工程師依據 Puppeteer 的一些功能開發出來的非官方版本。瀏覽器

在 Pyppetter 中,實際上它背後也是有一個相似 Chrome 瀏覽器的 Chromium 瀏覽器在執行一些動做進行網頁渲染,首先說下 Chrome 瀏覽器和 Chromium 瀏覽器的淵源。網絡

  Chromium 是谷歌爲了研發 Chrome 而啓動的項目,是徹底開源的。兩者基於相同的源代碼構建,Chrome 全部的新功能都會先在 Chromium 上實現,待驗證穩定後纔會移植,所以 Chromium 的版本更新頻率更高,也會包含不少新的功能,但做爲一款獨立的瀏覽器,Chromium 的用戶羣體要小衆得多。兩款瀏覽器「同根同源」,它們有着一樣的 Logo,但配色不一樣,Chrome 由藍紅綠黃四種顏色組成,而 Chromium 由不一樣深度的藍色構成。less

Pyppeteer 就是依賴於 Chromium 這個瀏覽器來運行的。那麼有了 Pyppeteer 以後,咱們就能夠免去那些繁瑣的環境配置等問題。若是第一次運行的時候,Chromium 瀏覽器沒有安裝,那麼程序會幫咱們自動安裝和配置,就免去了繁瑣的環境配置等工做。另外 Pyppeteer 是基於 Python 的新特性 async 實現的,因此它的一些執行也支持異步操做,效率相對於 Selenium 來講也提升了。異步

環境安裝

  • 因爲 Pyppeteer 採用了 Python 的 async 機制,因此其運行要求的 Python 版本爲 3.5 及以上
  • pip install pyppeteer

快速上手

 

- 爬取http://quotes.toscrape.com/js/ 所有頁面數據async

import asyncio
from pyppeteer import launch
from lxml import etree
 
async def main():
browser = await launch()
page = await browser.newPage()
await page.goto('http://quotes.toscrape.com/js/')
page_text = await page.content()
tree = etree.HTML(page_text)
div_list = tree.xpath('//div[@class="quote"]')
print(len(div_list))
await browser.close()
 
asyncio.get_event_loop().run_until_complete(main())
from pyppeteer import launch
import asyncio
from lxml import etree

# 實例化瀏覽器對象(谷歌測試版)
async def main():
    bro = await launch()
    # 新建一個空白頁
    page = bro.newPage()
    page.goto('http://quotes.toscrape.com/js/')

    # 獲取page當前顯示頁面的源碼數據
    page_text = await page.content()

    return page_text

def parse(task):
    page_text = task.result()
    tree = etree.HTML(page_text)
    div_list = tree.xpath('//div[@class="quote"]')
    for div in div_list:
        content = div.xpath('./span[1]/text()')
        print(content)

c = main()
task = asyncio.ensure_future(c)
task.add_done_callback(parse)
loop = asyncio.get_event_loop()
loop.run_until_complete(c)
結合協程

 

 解釋:ide

  launch 方法會新建一個 Browser 對象,而後賦值給 browser,而後調用 newPage 方法至關於瀏覽器中新建了一個選項卡,同時新建了一個 Page 對象。而後 Page 對象調用了 goto 方法就至關於在瀏覽器中輸入了這個 URL,瀏覽器跳轉到了對應的頁面進行加載,加載完成以後再調用 content 方法,返回當前瀏覽器頁面的源代碼。而後進一步地,咱們用 pyquery 進行一樣地解析,就能夠獲得 JavaScript 渲染的結果了。在這個過程當中,咱們沒有配置 Chrome 瀏覽器,沒有配置瀏覽器驅動,免去了一些繁瑣的步驟,一樣達到了 Selenium 的效果,還實現了異步抓取。工具

 

詳細用法

  • 開啓瀏覽器
  • 調用 launch 方法便可,相關參數介紹:
    • ignoreHTTPSErrors (bool): 是否要忽略 HTTPS 的錯誤,默認是 False。
    • headless (bool): 是否啓用 Headless 模式,即無界面模式,若是 devtools 這個參數是 True 的話,那麼該參數就會被設置爲 False,不然爲 True,即默認是開啓無界面模式的。
    • executablePath (str): 可執行文件的路徑,若是指定以後就不須要使用默認的 Chromium 了,能夠指定爲已有的 Chrome 或 Chromium。
    • args (List[str]): 在執行過程當中能夠傳入的額外參數。
    • devtools (bool): 是否爲每個頁面自動開啓調試工具,默認是 False。若是這個參數設置爲 True,那麼 headless 參數就會無效,會被強制設置爲 False。
  • 關閉提示條:」Chrome 正受到自動測試軟件的控制」,這個提示條有點煩,那咋關閉呢?這時候就須要用到 args 參數了,禁用操做以下:
    • browser = await launch(headless=False, args=['--disable-infobars'])
相關文章
相關標籤/搜索