目錄 一、簡(jiǎn)介+使用場(chǎng)景 二、環(huán)境部署(準(zhǔn)備) 三、代碼生成器(優(yōu)勢(shì)) 四、元素定位器(核心) 五、追蹤查看器(輔助) 六、權(quán)限控制與認(rèn)證(高級(jí)) 七、其他重要功能(進(jìn)階) coding-real mind writing-genuine heart 作者:Maker陳 本文字?jǐn)?shù):4.5k 閱讀時(shí)長(zhǎng)≈1分鐘 簡(jiǎn)介+使用場(chǎng)景 Playwright是跨語言支持的,支持Python、Java、Node.js、.NET 使用場(chǎng)景:
環(huán)境部署(準(zhǔn)備) Playwright環(huán)境部署簡(jiǎn)單,不像Selenium那樣需要下載瀏覽器對(duì)應(yīng)版本的驅(qū)動(dòng)程序chromedriver,直接安裝即可:
安裝所需的瀏覽器:
這個(gè)命令會(huì)安裝所有playwright支持的瀏覽器,包括Chrome、Firefox、WebKit,如下圖: 如何只安裝特定的瀏覽器,比如Chrome:
Chrome和Chromium有什么關(guān)系? 可看做同一個(gè)項(xiàng)目下的兩個(gè)分支,chromium是測(cè)試開源版,所有的功能都會(huì)先在其身上測(cè)試,確定穩(wěn)定運(yùn)行后再移植到chrome上,而chrome是Google正式商業(yè)版瀏覽器,兩者由Google官方和chromium社區(qū)進(jìn)行維護(hù) 由于系統(tǒng)問題安裝失敗時(shí)怎么辦? 看一下各種瀏覽器在Windows、Linux、MacOS下的默認(rèn)安裝路徑: 以安裝Chrome瀏覽器來說,兩種解決途徑:
代碼生成器(優(yōu)勢(shì)) playwright能夠按順序自動(dòng)生成用戶與瀏覽器交互行為(包括鼠標(biāo)點(diǎn)擊、鍵盤輸入、元素拖動(dòng)、頁面跳轉(zhuǎn)、窗口切換等)的自動(dòng)化代碼,使用命令行輸入,其后跟要訪問的url:
你可以在瀏覽器頁面進(jìn)行各種交互行為,生成器會(huì)按順序自動(dòng)生成代碼: 代碼生成后可以直接復(fù)制在你的IDE中,節(jié)省了大量時(shí)間,提高爬蟲或自動(dòng)化效率 元素定位器(核心) playwright支持的網(wǎng)頁元素定位器有很多:
語法非常簡(jiǎn)潔,這種page.get_by_text("登錄").click()元素定位方式就是官方推薦的方式,這種定位方式是唯一的,不像CSS/XPath定位,一旦網(wǎng)頁DOM元素改變,定位也要跟著變,所以官方才推薦這種元素唯一的定位方式
CSS定位和XPath定位方法是一樣的,可以去掉前面的"css="或"xpath="前綴,playwright會(huì)自動(dòng)解析里面的定位器是那種方式:
獲取網(wǎng)頁源碼:
playwright雖然支持對(duì)Python的同步和異步操作,但底層是由異步實(shí)現(xiàn)的,有時(shí)候?yàn)榱吮苊獠僮魉俣冗^快可能會(huì)進(jìn)行一些延時(shí)操作,這里不使用下面這種延時(shí)操作:
而是使用playwright官方內(nèi)置的延時(shí)操作:
追蹤查看器(輔助) 創(chuàng)建追蹤器 追蹤的目的是為了看使用playwright與瀏覽器交互時(shí)發(fā)生了什么?方便我們更加深刻的理解內(nèi)部操作邏輯,示例代碼如下:
這個(gè)示例代碼是為了查看導(dǎo)航到playwright官網(wǎng)并進(jìn)行截圖操作時(shí)發(fā)生了什么? 注意,創(chuàng)建追蹤器是在context對(duì)象進(jìn)行操作,在context創(chuàng)建之后,關(guān)閉之前 其中的操作行為很簡(jiǎn)單,只是導(dǎo)航到了playwright官網(wǎng)進(jìn)行了一個(gè)截圖動(dòng)作,并設(shè)置保存的文件名及格式,結(jié)束后會(huì)在目錄生成jpg圖片和追蹤器的ZIP壓縮文件 查看追蹤器 -- 兩種方式
操作如下:
無論那種方式,你將看到如下圖的追蹤器結(jié)構(gòu): 正如上圖所示,示例代碼只進(jìn)行了三個(gè)動(dòng)作,即打開一個(gè)空白頁面,然后導(dǎo)航到playwright官網(wǎng),最后進(jìn)行截圖,每個(gè)動(dòng)作都包含了執(zhí)行時(shí)間 在其下面有一些屬性,其中network功能類似于開發(fā)工具中的抓包請(qǐng)求,還有日志、定位器、源碼、控制臺(tái)等屬性功能 權(quán)限控制與認(rèn)證(高級(jí)) 使用場(chǎng)景:當(dāng)爬蟲工程師抓取數(shù)據(jù)或自動(dòng)化工程師測(cè)試某些重要功能時(shí)需要注冊(cè)/登錄之后,才能看見我們想要抓取或測(cè)試的內(nèi)容 如果驗(yàn)證過程過于復(fù)雜或麻煩,比如滑動(dòng)驗(yàn)證碼如何識(shí)別缺口位置及拖動(dòng) 對(duì)于點(diǎn)觸驗(yàn)證碼來說,又有按順序點(diǎn)擊不同長(zhǎng)度的文字,比如bilibili,按文字說明點(diǎn)擊符合要求的圖片,比如請(qǐng)點(diǎn)擊下方含有小轎車的圖片,鏈接如下:
還有行為驗(yàn)證碼,比如給你一組圖片,讓你轉(zhuǎn)動(dòng)圖片直到與給定示例圖片相同的方向才行,Twitter其中一種驗(yàn)證方式就是這樣的 國外有些網(wǎng)站的注冊(cè)/登錄驗(yàn)證有可能還需進(jìn)行郵箱驗(yàn)證碼二次驗(yàn)證,國內(nèi)的驗(yàn)證碼大多二次驗(yàn)證以短信為主 當(dāng)然,其實(shí)我們也可以使用OpenCV、深度學(xué)習(xí)、第三方打碼服務(wù)平臺(tái)(付費(fèi))、手機(jī)短信驗(yàn)證碼的自動(dòng)化處理(監(jiān)聽手機(jī)短信內(nèi)容+將短信內(nèi)容轉(zhuǎn)發(fā)到指定的位置)來解決 但是如果你臨時(shí)接到一個(gè)需求并且時(shí)間比較急,破解驗(yàn)證過程又比較復(fù)雜麻煩的話可采用手動(dòng)驗(yàn)證獲取其中的登錄憑證以json文件保存到本地,這個(gè)文件里面保存的其實(shí)就是相關(guān)的cookie和賬戶的一些信息,有兩種方式可以獲取到:
后面的auth.json就是說我們要把相關(guān)權(quán)限保存到當(dāng)前目錄的auth.json文件里面 比如我們要獲取polygonscan的地址和標(biāo)簽數(shù)據(jù),網(wǎng)址如下:
在沒有登錄前數(shù)據(jù)是不會(huì)顯示全的,如下圖所示: 用playwright手動(dòng)獲取憑證保存到auth.json,看一看登錄過程 文件auth.json保存成功: 打開看看里面的內(nèi)容: 可以清晰的看到,auth.json里面的內(nèi)容其實(shí)就是cookies的相關(guān)信息,每個(gè)cookie字段都以字典的格式存儲(chǔ)起來 測(cè)試該auth.json里面的cookies是否有效:
再次打開不需要驗(yàn)證: 測(cè)試成功,該auth.json文件里面的cookies是有效的,賬戶早已存在并且數(shù)據(jù)顯示是全的,非常Nice!
操作方式和生成器命令行方式是一樣的,會(huì)自動(dòng)打開chrome瀏覽器,然后需要我們手動(dòng)進(jìn)行登錄驗(yàn)證 如何導(dǎo)入auth.json進(jìn)行自動(dòng)化數(shù)據(jù)抓取或測(cè)試:
我們也可以使用第三方解析庫BeautifulSoup、PyQuery、XPath等對(duì)網(wǎng)頁源碼中的數(shù)據(jù)進(jìn)行解析,有時(shí)候可能會(huì)更加方便,比如使用PyQuery
這一小節(jié)很重要,爬蟲工程師或自動(dòng)化測(cè)試工程師進(jìn)階必備,需重點(diǎn)掌握 其他重要功能(進(jìn)階) 模擬瀏覽器執(zhí)行JS 爬蟲逆向時(shí),我們一般需要模擬JS環(huán)境來執(zhí)行加密代碼,從而獲得最終的加密結(jié)果 但是如果我們能夠模擬瀏覽器環(huán)境,自動(dòng)執(zhí)行JS加密代碼,這樣是不是就能比較輕松的完成逆向過程呢? 而playwright能夠打開瀏覽器進(jìn)而模擬,JS加密代碼是從目標(biāo)遠(yuǎn)程服務(wù)器傳到本地客戶端執(zhí)行的 所以只要我們能夠找到執(zhí)行加密邏輯的JS文件,定位其中的加密函數(shù)或?qū)傩?,把它掛載到全局的window對(duì)象再獲取,不就很容易獲得加密結(jié)果了嗎? 我們先來看一個(gè)簡(jiǎn)單的playwright是如何執(zhí)行JS代碼的示例:
調(diào)用page對(duì)象的evaluate函數(shù)能夠執(zhí)行JS代碼,array指代的是后面的列表 當(dāng)然目前我們是不能修改遠(yuǎn)程的JS文件的,除非尋找漏洞,利用黑客手段 現(xiàn)在我們要做的是在遠(yuǎn)程服務(wù)器將JS代碼傳到本地瀏覽器客戶端時(shí),用已經(jīng)修改好的JS文件(增加了一些內(nèi)容,比如將加密函數(shù)掛載到window對(duì)象)替換瀏覽器對(duì)應(yīng)的JS文件,讓瀏覽器執(zhí)行這個(gè)替換好的JS文件,從而獲得加密結(jié)果: 來看看本地的JS文件是怎樣override瀏覽器JS文件的:
調(diào)用page對(duì)象的route函數(shù),傳入瀏覽器JS文件和本地JS文件的路徑,然后我們把本地JS文件中的加密函數(shù)掛載到全局window對(duì)象的encryParams屬性上 這時(shí)encryParams也就等同于這個(gè)加密函數(shù),然后在傳入?yún)?shù)讓它自動(dòng)進(jìn)行加密,最后調(diào)用evaluate函數(shù)執(zhí)行我們構(gòu)造的JS函數(shù)就能獲取加密結(jié)果 注意:本地JS文件內(nèi)容是我們從瀏覽器的JS加密文件全部復(fù)制下來的,只不過增加了一些東西 設(shè)備仿真 這個(gè)功能可能自動(dòng)化測(cè)試工程師會(huì)用到,比如要測(cè)試博客園網(wǎng)站在iPhone 13設(shè)備上是否兼容:
看一看仿真效果: 監(jiān)聽和修改網(wǎng)絡(luò) playwright能夠追蹤、修改某個(gè)頁面的所有請(qǐng)求,包括document、XHR和fetch請(qǐng)求等 比如我們要修改document請(qǐng)求源碼中的<title>標(biāo)簽內(nèi)容,可以這樣做:
Playwright官網(wǎng):
|
|