摘要:采集網(wǎng)頁(yè)內(nèi)容是一項(xiàng)很常見(jiàn)的需求,比較傳統(tǒng)的靜態(tài)頁(yè)面,就能搞定。代碼中使用了一個(gè)方法,是為了讓內(nèi)容加載完成后再進(jìn)行截圖,簡(jiǎn)單粗暴,可能不是最好的解決辦法??偨Y(jié)被應(yīng)用于測(cè)試采集等場(chǎng)景,是一個(gè)非常有力的工具。
采集網(wǎng)頁(yè)內(nèi)容是一項(xiàng)很常見(jiàn)的需求,比較傳統(tǒng)的靜態(tài)頁(yè)面,curl 就能搞定。但如果頁(yè)面中有動(dòng)態(tài)加載的內(nèi)容,比如有些頁(yè)面里通過(guò) ajax 加載的文章正文內(nèi)容,又如果有些頁(yè)面加載完成后進(jìn)行了一些額外處理(圖片地址替換等等……)而你想采集這些處理過(guò)后的內(nèi)容。那么牛逼閃閃的 curl 也束手無(wú)策了。
做過(guò)類似需求的人可能會(huì)說(shuō),老鐵,上 PhantomJS ?。?/p>
沒(méi)錯(cuò),這是一個(gè)辦法,而且在相當(dāng)長(zhǎng)的時(shí)間里 PhantomJS 是為數(shù)不多的能解決這類需求的工具里的佼佼者。
但今天這里要介紹的是一個(gè)后來(lái)居上的工具 -- puppeteer,它是隨著 Chrome Headless 技術(shù)興起而快速發(fā)展起來(lái)的。而且非常關(guān)鍵的是,puppeteer 由 Chrome 的官方團(tuán)隊(duì)開(kāi)發(fā)和維護(hù),可以說(shuō)相當(dāng)靠譜了!
puppeteer 是一個(gè) js 包,要想在 Laravel 中使用,得借助于另一神器spatie/browsershot。
安裝
安裝 spatie/browsershot
browsershot 是一個(gè) composer 包,出自于大神團(tuán)隊(duì) spatie
$ composer require spatie/browsershot
安裝 puppeteer
$ npm i puppeteer --save
也可以全局安全 puppeteer 但就個(gè)人經(jīng)驗(yàn)而言,在項(xiàng)目中安裝是比較推薦的做法,因?yàn)檫@樣不同項(xiàng)目不會(huì)同時(shí)受全局安裝的 puppeteer 影響,此外項(xiàng)目中安裝也方便使用 phpdeployer 進(jìn)行升級(jí)(phpdeploy 升級(jí)時(shí)不會(huì)影響線上項(xiàng)目運(yùn)行,要知道升級(jí)/安裝 puppeteer 可是很費(fèi)時(shí)的,有時(shí)候還不能保證一次成功)。使用安裝 puppeteer 時(shí)會(huì)下載 Chromium-Browser,鑒于咱特殊國(guó)情,很有可能出現(xiàn)無(wú)法下載的情況,對(duì)此,就請(qǐng)大家各顯神通吧……
以采集今日頭條手機(jī)版頁(yè)面文章內(nèi)容為例。
use SpatieBrowsershotBrowsershot; 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); }
運(yùn)行后可以在日志中看到如下內(nèi)容(截圖中只是其中部分)
此外,也可以將頁(yè)面保存為圖片或 PDF 文件。
use SpatieBrowsershotBrowsershot; 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)。代碼中使用了一個(gè) setDelay() 方法,是為了讓內(nèi)容加載完成后再進(jìn)行截圖,簡(jiǎn)單粗暴,可能不是最好的解決辦法。
可能出現(xiàn)的問(wèn)題系統(tǒng)得支持 Chromium 瀏覽器,當(dāng)然現(xiàn)在絕大部分瀏覽器是支持的,要不然也沒(méi)法,還是用 PhantomJS 吧。
項(xiàng)目中安裝了 puppeteer 后調(diào)用時(shí)有可能出現(xiàn)權(quán)限問(wèn)題,這就需要對(duì)項(xiàng)目下 /node_modules/puppeteer 目錄賦予適當(dāng)?shù)臋?quán)限。
總結(jié)puppeteer 被應(yīng)用于測(cè)試、采集等場(chǎng)景,是一個(gè)非常有力的工具。對(duì)于輕度的采集任務(wù),是夠用的,比如本文這類在 Laravel (php) 里來(lái)用采集一些小頁(yè)面,但如果需要快速采集大量?jī)?nèi)容,還是 Python 啥的吧。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/28641.html
摘要:發(fā)布是由團(tuán)隊(duì)開(kāi)源的,操作接口庫(kù),已成為事實(shí)上的瀏覽器操作標(biāo)準(zhǔn)。本周正式發(fā)布,為我們帶來(lái)了,,支持自定義頭部與腳部,支持增強(qiáng),兼容原生協(xié)議等特性變化。新特性介紹日前發(fā)布了大版本更新,引入了一系列的新特性與提升,本文即是對(duì)這些變化進(jìn)行深入解讀。 showImg(https://segmentfault.com/img/remote/1460000012940044); 前端每周清單專注前端...
摘要:上面只爬取了京東首頁(yè)的圖片內(nèi)容,假設(shè)我的需求進(jìn)一步擴(kuò)大,需要爬取京東首頁(yè)中的所有標(biāo)簽對(duì)應(yīng)的跳轉(zhuǎn)網(wǎng)頁(yè)中的所有的文字內(nèi)容,最后放到一個(gè)數(shù)組中。 showImg(https://segmentfault.com/img/bVbtVeV?w=3840&h=2160); 本文適合無(wú)論是否有爬蟲(chóng)以及Node.js基礎(chǔ)的朋友觀看~ 需求: 使用Node.js爬取網(wǎng)頁(yè)資源,開(kāi)箱即用的配置 將爬取到的...
摘要:上面只爬取了京東首頁(yè)的圖片內(nèi)容,假設(shè)我的需求進(jìn)一步擴(kuò)大,需要爬取京東首頁(yè)中的所有標(biāo)簽對(duì)應(yīng)的跳轉(zhuǎn)網(wǎng)頁(yè)中的所有的文字內(nèi)容,最后放到一個(gè)數(shù)組中。 showImg(https://segmentfault.com/img/bVbtVeV?w=3840&h=2160); 本文適合無(wú)論是否有爬蟲(chóng)以及Node.js基礎(chǔ)的朋友觀看~ 需求: 使用Node.js爬取網(wǎng)頁(yè)資源,開(kāi)箱即用的配置 將爬取到的...
摘要:上面只爬取了京東首頁(yè)的圖片內(nèi)容,假設(shè)我的需求進(jìn)一步擴(kuò)大,需要爬取京東首頁(yè)中的所有標(biāo)簽對(duì)應(yīng)的跳轉(zhuǎn)網(wǎng)頁(yè)中的所有的文字內(nèi)容,最后放到一個(gè)數(shù)組中。 showImg(https://segmentfault.com/img/bVbtVeV?w=3840&h=2160); 本文適合無(wú)論是否有爬蟲(chóng)以及Node.js基礎(chǔ)的朋友觀看~ 需求: 使用Node.js爬取網(wǎng)頁(yè)資源,開(kāi)箱即用的配置 將爬取到的...
閱讀 2667·2021-11-23 09:51
閱讀 3254·2021-11-22 14:44
閱讀 4586·2021-11-22 09:34
閱讀 5131·2021-10-08 10:14
閱讀 2453·2021-09-22 15:47
閱讀 3518·2021-09-22 15:40
閱讀 1520·2019-08-30 15:44
閱讀 1630·2019-08-28 18:23