一日一技:效率提高十倍,Puppeteer 如何啟動(dòng)交互模式?
當(dāng)我們使用 Selenium 開發(fā)爬蟲的時(shí)候,使用 Jupyter 寫代碼會(huì)比用 PyCharm 寫代碼更方便。如果使用 PyCharm 寫代碼并直接運(yùn)行,當(dāng)某一行報(bào)錯(cuò)的時(shí)候,整個(gè)程序就掛了,改了代碼以后必須完全從頭開始,這樣會(huì)非常浪費(fèi)時(shí)間。但如果使用 Jupyter 寫代碼,那么我們只需要重試出問(wèn)題的這一行代碼就可以了,不需要把整個(gè)程序再重啟一次。
但如果我們使用 JavaScript 操作 Puppeteer,應(yīng)該怎么實(shí)現(xiàn)寫一行代碼,運(yùn)行一行代碼呢?
我們知道,Node.js 的命令行本身確實(shí)是可以實(shí)現(xiàn)寫一行代碼運(yùn)行一行的,如下圖所示:
但 Puppeteer 的代碼 跟上面的這段代碼有點(diǎn)不一樣,我們先來(lái)看看 Puppeteer 官方文檔里面,是怎么寫的代碼:
注意,其中有很長(zhǎng)一段函數(shù)是使用async聲明的,它是異步函數(shù)。在 Node.js 的交互環(huán)境里面,必須把整段函數(shù)全部寫進(jìn)去,一次性運(yùn)行,不能一段一段運(yùn)行。如果嘗試一段一段運(yùn)行的話,代碼就會(huì)報(bào)錯(cuò),我們來(lái)看看:
這是因?yàn)?,await關(guān)鍵詞必須在一個(gè)異步函數(shù)里面使用。它不能單獨(dú)出現(xiàn)在最外層。這就要求我們把所有的代碼都寫到一個(gè)異步函數(shù)里面,然后運(yùn)行這個(gè)異步函數(shù)。
但這樣做,跟直接寫一個(gè).js 文件來(lái)運(yùn)行有什么區(qū)別?我每次想測(cè)試一個(gè) XPath 語(yǔ)句能否正常運(yùn)行,都要把整個(gè)代碼重新跑一邊。這不是白白浪費(fèi)了交互環(huán)境的優(yōu)勢(shì)嗎?
但實(shí)際上,Node.js 與 Chrome 本身就有一個(gè)很好用的交互環(huán)境,但很多人可能并不知道。
要啟動(dòng)這個(gè)交互模式,實(shí)際上非常簡(jiǎn)單。我們從0開始來(lái)創(chuàng)建這個(gè)環(huán)境。
首先,我們創(chuàng)建一個(gè)文件夾test_puppeteer,然后使用 npm 或者yarn安裝puppeteer-core。使用puppeteer-core而不是puppeteer,是因?yàn)榍罢呖梢灾苯邮褂孟到y(tǒng)的 Chrome,而后者需要下載一個(gè)幾百 MB 的 Chromium,非常浪費(fèi)時(shí)間。
- mkdir test_puppeteer
- cd test_puppeteer
- yarn add puppeteer-core
上面的命令執(zhí)行完成以后,我們就可以啟動(dòng)這個(gè)交互環(huán)境了。
執(zhí)行命令:
- node --inspect
運(yùn)行效果如下圖所示:
現(xiàn)在,隨便開一個(gè) Chrome 的窗口,打開開發(fā)者工具,如下圖所示:
大家注意,在開發(fā)者工具菜單欄的左上角,圖中箭頭所指向的位置,出現(xiàn)了 Node.js 的綠色 Logo。我們點(diǎn)擊一下它。
此時(shí),會(huì)彈出一個(gè)單獨(dú)的開發(fā)者工具窗口,如下圖所示:
這個(gè)窗口會(huì)自動(dòng)關(guān)聯(lián)上我們剛才啟動(dòng)的 Node.js。
現(xiàn)在,我們?cè)囈辉囍苯釉谶@個(gè)開發(fā)者工具的 Console標(biāo)簽頁(yè)上面寫一些代碼:
可以看到,在Console標(biāo)簽頁(yè)打印出來(lái)的內(nèi)容,也會(huì)在終端窗口出現(xiàn)。看起來(lái),不過(guò)是從黑色窗口寫代碼變成了在白色窗口寫代碼,這有什么好炫耀的?
現(xiàn)在,我們先來(lái)看看你電腦上的 Node.js 的版本是多少,如果小于14,那么就趕緊升級(jí),讓他大于等于14。然后再次執(zhí)行剛剛我們的命令,如下圖所示。
接下來(lái),跟剛才一樣的步驟,我們啟動(dòng)開發(fā)者工具,然后嘗試直接調(diào)用Puppeteer,不可思議的一幕出現(xiàn)了:
現(xiàn)在我們已經(jīng)可以直接使用await了!現(xiàn)在,在這個(gè) Console選項(xiàng)卡上面,我們就可以像在 Jupyter 里面寫 JavaScript 代碼了,寫一行,運(yùn)行一行,看看效果,再寫一行,再運(yùn)行一行。
我們嘗試在這里打開我的博客:
可以看到,我在代碼里面故意寫錯(cuò)了一部分,應(yīng)該用await browser.NewPage()但是我寫的是await browser.page,導(dǎo)致程序報(bào)錯(cuò)。但是沒關(guān)系。我下面重新改成正確的就可以了。整個(gè)過(guò)程不需要重啟瀏覽器。你運(yùn)行一行代碼,它執(zhí)行一行代碼,代碼錯(cuò)了,只需要改這一行重新執(zhí)行就可以了。這才叫做交互環(huán)境。
本文轉(zhuǎn)載自微信公眾號(hào)「未聞Code」,可以通過(guò)以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系未聞Code公眾號(hào)。