爬蟲:selenium、pyppeteer、playwright 瀏覽器驅(qū)動(dòng)對比及應(yīng)用實(shí)踐

1. Selenium

1.1. Selenium 簡介
  • Selenium是最廣泛使用的開源Web UI(用戶界面)自動(dòng)化測試套件之一。它最初由杰森·哈金斯(Jason Huggins)于2004年開發(fā),作為Thought Works的內(nèi)部工具。Selenium支持跨不同瀏覽器,平臺(tái)和編程語言的自動(dòng)化。

  • Selenium可以輕松部署在Windows,Linux,Solaris和Macintosh等平臺(tái)上。此外,它支持IOS(IOS,Windows Mobile和Android)等移動(dòng)應(yīng)用程序的OS(操作系統(tǒng))。

  • Selenium通過使用特定于每種語言的驅(qū)動(dòng)程序支持各種編程語言。Selenium支持的語言包括C#,Java,Perl,PHP,Python和Ruby。目前,Selenium Web驅(qū)動(dòng)程序最受Python和C#歡迎。

  • Selenium測試腳本可以使用任何支持的編程語言進(jìn)行編碼,并且可以直接在大多數(shù)現(xiàn)代Web瀏覽器中運(yùn)行。 Selenium支持的瀏覽器包括Internet Explorer,Mozilla Firefox,Google Chrome和Safari。

1.2. Selenium 優(yōu)缺點(diǎn):
  • selenium 支持多款主流瀏覽器,提供了功能豐富的API 接口,經(jīng)常被我們用作爬蟲工具來使用;
  • 但是 selenium 缺點(diǎn)也很明顯,比如速度太慢、對版本配置要求嚴(yán)苛,最麻煩是經(jīng)常要更新對應(yīng)的驅(qū)動(dòng)。
  • 還有些網(wǎng)頁是可以檢測到是否是使用了selenium ;
  • 并且selenium 所謂的保護(hù)機(jī)制不允許跨域 cookies 保存,登錄的時(shí)候必須先打開網(wǎng)頁然后后加載 cookies 再刷新的方式很不友好。
1.3. Selenium 使用實(shí)踐

2. Pyppeteer

2.1. Pyppeteer 簡介
  • Pyppeteer 是一款非常高效的 web 自動(dòng)化測試工具,是 Puppeteer 的 Python 版本,pyppeteer 只是在 puppeteer之上稍微包裝了下而已;
  • Puppeteer 是 Google 基于 Node.js 開發(fā)的一個(gè)工具,主要是用來操縱 Chrome 瀏覽器的 API,通過 Javascript 代碼來操縱 Chrome 瀏覽器的一些操作,用作網(wǎng)絡(luò)爬蟲完成數(shù)據(jù)爬取、Web 程序自動(dòng)測試等任務(wù),其 API 極其完善,功能非常強(qiáng)大。
  • Pyppeteer 可以實(shí)現(xiàn)的功能包括:
    -- 生成頁面截圖或 PDF;
    -- 抓取 SPA 并生成預(yù)渲染內(nèi)容(SSR);
    -- 自動(dòng)化表單提交、UI 測試,鍵盤輸入 等;
    -- 創(chuàng)建最新的自動(dòng)化測試環(huán)境,使用最新的 JavaScript 和瀏覽器功能直接在最新版本的 Chrome 中運(yùn)行測試;
    -- 捕獲站點(diǎn)的時(shí)間線跟蹤,以幫助診斷性能問題;
    -- 測試 Chrome 擴(kuò)展程序。
2.2. Pyppeteer 優(yōu)缺點(diǎn)
  • Pyppeteer 雖然支持的瀏覽器比較單一,但在安裝配置的便利性和運(yùn)行效率方面都要遠(yuǎn)勝 selenium;
  • Pyppeteer 的 web 自動(dòng)化是基于 chromium 來實(shí)現(xiàn)的,由于 chromium 中某些特性的關(guān)系,Pyppeteer 的安裝配置非常簡單;
  • Pyppeteer 支持 asyncio 異步協(xié)程,對于并發(fā)比較友好
  • 但是,Pyppeteer 是第三方的,好久沒有更新了,bug 也不少;
  • Pyppeteer 所依賴的 Puppeteer 的原生 JS 版本,本身就很不穩(wěn)定;
2.3. 使用實(shí)踐
# _*_coding:utf-8 _*_
# @Software: PyCharm
# @FileName: pyppteer.py
# @Time    : 2021/6/18 19:54
# @Desc    :

import os
import time
from urllib.parse import urlsplit
import asyncio
import pyppeteer

BASE_DIR = os.path.dirname(__file__)


"""
intercept_request和intercept_response相當(dāng)于是注冊的兩個(gè)回調(diào)函數(shù),
在瀏覽器發(fā)出請求和獲取到請求之前指向這兩個(gè)函數(shù)。
"""


async def intercept_request(req):
    """請求過濾"""
    if req.resourceType in ['image', 'media', 'eventsource', 'websocket']:
        await req.abort()
    else:
        await req.continue_()


async def intercept_response(res):
    """返回過濾"""
    resource_type = res.request.resourceType
    if resource_type in ['xhr', 'fetch']:
        resp = await res.text()

        url = res.url
        tokens = urlsplit(url)

        folder = BASE_DIR + '/' + 'data/' + tokens.netloc + tokens.path + "/"
        if not os.path.exists(folder):
            os.makedirs(folder, exist_ok=True)
        filename = os.path.join(folder, str(int(time.time())) + '.json')
        with open(filename, 'w', encoding='utf-8') as f:
            f.write(resp)


async def main():
    browser = await pyppeteer.launch({
        # 'headless': False,
        # 'devtools': True
        'executablePath': '/Users/changjiang/apps/Chromium.app/Contents/MacOS/Chromium',
        'args': [
            '--disable-extensions',
            '--hide-scrollbars',
            '--disable-bundled-ppapi-flash',
            '--mute-audio',
            '--no-sandbox',
            '--disable-setuid-sandbox',
            '--disable-gpu',
        ],
        'dumpio': True,
    })
    page = await browser.newPage()

    await page.setRequestInterception(True)
    page.on('request', intercept_request)
    page.on('response', intercept_response)

    await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 '
                            '(KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299')
    await page.setViewport({'width': 1080, 'height': 960})
    await page.goto('http://yangkeduo.com')
    await page.evaluate("""
            () =>{
                   Object.defineProperties(navigator,{
                     webdriver:{
                       get: () => false
                     }
                   })
            }
        """)

    await page.addScriptTag(path="path_to_your_js_file")        # 加載一個(gè) js 文件

    await page.evaluate("你的那一段頁面自動(dòng)下拉 js 腳本")

    await browser.close()


if __name__ == '__main__':
    asyncio.run(main())

3. Playwright

3.1. Playwright 簡介
  • playwright-python,是一款基于python的自動(dòng)化測試工具,可以通過錄制功能自動(dòng)生成測試腳本;
  • Playwright是一個(gè)強(qiáng)大的Python庫,僅用一個(gè)API即可自動(dòng)執(zhí)行Chromium、Firefox、WebKit(Safari )等主流瀏覽器自動(dòng)化操作,并同時(shí)支持以無頭模式、有頭模式運(yùn)行;
3.2. Playwright 優(yōu)缺點(diǎn)
  • Playwright 具有以下優(yōu)點(diǎn):
  • 跨瀏覽器,支持Chrome、Firefox、WebKit;
  • 跨系統(tǒng),支持Windows、Mac、Linux;
  • 跨語言,支持Python、Java、JS;
  • 可用于移動(dòng)端。
3.3.
選項(xiàng):
  -V, --version                          輸出版本號(hào)
  -b, --browser <browserType>            瀏覽器類型
  --color-scheme <scheme>                更改主題 取值 "light" 或 "dark"
  --device <deviceName>                  模擬設(shè)備,例如  "iPhone 11"
  --geolocation <coordinates>            指定地理位置 例如 "37.819722,-122.478611"
  --lang <language>                      指定語言區(qū)域 "en-GB"
  --save-storage <filename>          保存瀏覽器狀態(tài)到指定文件
  --load-storage <filename>              載入指定文件瀏覽器狀態(tài)
  --proxy-server <proxy>                 指定代理服務(wù)器 例如 "http://myproxy:3128" 或 "socks5://myproxy:8080"
  --timezone <time zone>                 失去設(shè)置 例如 "Europe/Rome"
  --timeout <timeout>                    超時(shí)設(shè)置,單位毫秒 (default: "10000")
  --user-agent <ua string>               指定UA
  --viewport-size <size>                 指定瀏覽器像素 "1280, 720"
命令:
  open [url]                             打開URL或用-b, --browser指定瀏覽器
  cr [url]                               打開URL用Chromium
  ff [url]                               打開URL用Firefox
  wk [url]                               打開URL用WebKit
  codegen [options] [url]                打開頁面生成代碼
  screenshot [options] <url> <filename>  頁面截圖
  pdf [options] <url> <filename>         保存頁面為pdf
  install                                確保安裝必要的瀏覽器驅(qū)動(dòng)
  help [command]                         幫助
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 如果大家對 Python 爬蟲有所了解的話,想必你應(yīng)該聽說過 Selenium 這個(gè)庫,這實(shí)際上是一個(gè)自動(dòng)化測試工...
    HelloJames閱讀 1,236評論 0 13
  • Selenium是一款強(qiáng)大的基于瀏覽器的開源自動(dòng)化測試工具,最初由 Jason Huggins 于 2004 年在...
    FifiZhuang閱讀 7,676評論 5 71
  • 如果大家對 Python 爬蟲有所了解的話,想必你應(yīng)該聽說過 Selenium 這個(gè)庫,這實(shí)際上是一個(gè)自動(dòng)化測試工...
    g_ices閱讀 728評論 0 1
  • 我是黑夜里大雨紛飛的人啊 1 “又到一年六月,有人笑有人哭,有人歡樂有人憂愁,有人驚喜有人失落,有的覺得收獲滿滿有...
    陌忘宇閱讀 8,587評論 28 53
  • 信任包括信任自己和信任他人 很多時(shí)候,很多事情,失敗、遺憾、錯(cuò)過,源于不自信,不信任他人 覺得自己做不成,別人做不...
    吳氵晃閱讀 6,216評論 4 8