您好,登錄后才能下訂單哦!
小編給大家分享一下Laravel中如何使用puppeteer采集異步加載的網(wǎng)頁內(nèi)容,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
采集網(wǎng)頁內(nèi)容是一項很常見的需求,比較傳統(tǒng)的靜態(tài)頁面,curl 就能搞定。但如果頁面中有動態(tài)加載的內(nèi)容,比如有些頁面里通過 ajax 加載的文章正文內(nèi)容,又如果有些頁面加載完成后進行了一些額外處理(圖片地址替換等等……)而你想采集這些處理過后的內(nèi)容。那么牛逼閃閃的 curl 也束手無策了。
做過類似需求的人可能會說,老鐵,上 PhantomJS ??!
沒錯,這是一個辦法,而且在相當長的時間里 PhantomJS 是為數(shù)不多的能解決這類需求的工具里的佼佼者。
但今天這里要介紹的是一個后來居上的工具 -- puppeteer,它是隨著 Chrome Headless 技術(shù)興起而快速發(fā)展起來的。而且非常關(guān)鍵的是,puppeteer 由 Chrome 的官方團隊開發(fā)和維護,可以說相當靠譜了!
puppeteer 是一個 js 包,要想在 Laravel 中使用,得借助于另一神器spatie/browsershot。
安裝
安裝 spatie/browsershot
browsershot 是一個 composer 包,出自于大神團隊 spatie
$ composer require spatie/browsershot
安裝 puppeteer
$ npm i puppeteer --save
也可以全局安全 puppeteer 但就個人經(jīng)驗而言,在項目中安裝是比較推薦的做法,因為這樣不同項目不會同時受全局安裝的 puppeteer 影響,此外項目中安裝也方便使用 phpdeployer 進行升級(phpdeploy 升級時不會影響線上項目運行,要知道升級/安裝 puppeteer 可是很費時的,有時候還不能保證一次成功)。
安裝 puppeteer 時會下載 Chromium-Browser,鑒于咱特殊國情,很有可能出現(xiàn)無法下載的情況,對此,就請大家各顯神通吧……
使用
以采集今日頭條手機版頁面文章內(nèi)容為例。
use Spatie\Browsershot\Browsershot; public function getBodyHtml() { $newsUrl = 'https://m.toutiao.com/i6546884151050502660/'; $html = Browsershot::url($newsUrl) ->windowSize(480, 800) ->userAgent('Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Mobile Safari/537.36') ->mobile() ->touch() ->bodyHtml(); \Log::info($html); }
運行后可以在日志中看到如下內(nèi)容(截圖中只是其中部分)
此外,也可以將頁面保存為圖片或 PDF 文件。
use Spatie\Browsershot\Browsershot; public function getBodyHtml() { $newsUrl = 'https://m.toutiao.com/i6546884151050502660/'; Browsershot::url($newsUrl) ->windowSize(480, 800) ->userAgent('Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Mobile Safari/537.36') ->mobile() ->touch() ->setDelay(1000) ->save(public_path('images/toutiao.jpg')); }
圖片里那些框與系統(tǒng)字體有關(guān)。代碼中使用了一個 setDelay() 方法,是為了讓內(nèi)容加載完成后再進行截圖,簡單粗暴,可能不是最好的解決辦法。
可能出現(xiàn)的問題
系統(tǒng)得支持 Chromium 瀏覽器,當然現(xiàn)在絕大部分瀏覽器是支持的,要不然也沒法,還是用 PhantomJS 吧。
項目中安裝了 puppeteer 后調(diào)用時有可能出現(xiàn)權(quán)限問題,這就需要對項目下 /node_modules/puppeteer 目錄賦予適當?shù)臋?quán)限。
以上是“Laravel中如何使用puppeteer采集異步加載的網(wǎng)頁內(nèi)容”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學習更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。