久久久久久久视色,久久电影免费精品,中文亚洲欧美乱码在线观看,在线免费播放AV片

<center id="vfaef"><input id="vfaef"><table id="vfaef"></table></input></center>

    <p id="vfaef"><kbd id="vfaef"></kbd></p>

    
    
    <pre id="vfaef"><u id="vfaef"></u></pre>

      <thead id="vfaef"><input id="vfaef"></input></thead>

    1. 站長資訊網(wǎng)
      最全最豐富的資訊網(wǎng)站

      Laravel 中使用 puppeteer 采集異步加載的網(wǎng)頁內(nèi)容

      Laravel 中使用 puppeteer 采集異步加載的網(wǎng)頁內(nèi)容

      采集網(wǎng)頁內(nèi)容是一項(xiàng)很常見的需求,比較傳統(tǒng)的靜態(tài)頁面,curl 就能搞定。但如果頁面中有動態(tài)加載的內(nèi)容,比如有些頁面里通過 ajax 加載的文章正文內(nèi)容,又如果有些頁面加載完成后進(jìn)行了一些額外處理(圖片地址替換等等……)而你想采集這些處理過后的內(nèi)容。那么牛逼閃閃的 curl 也束手無策了。

      做過類似需求的人可能會說,老鐵,上 PhantomJS ??!

      沒錯(cuò),這是一個(gè)辦法,而且在相當(dāng)長的時(shí)間里 PhantomJS 是為數(shù)不多的能解決這類需求的工具里的佼佼者。

      但今天這里要介紹的是一個(gè)后來居上的工具 — puppeteer,它是隨著 Chrome Headless 技術(shù)興起而快速發(fā)展起來的。而且非常關(guān)鍵的是,puppeteer 由 Chrome 的官方團(tuán)隊(duì)開發(fā)和維護(hù),可以說相當(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)目不會同時(shí)受全局安裝的 puppeteer 影響,此外項(xiàng)目中安裝也方便使用 phpdeployer 進(jìn)行升級(phpdeploy 升級時(shí)不會影響線上項(xiàng)目運(yùn)行,要知道升級/安裝 puppeteer 可是很費(fèi)時(shí)的,有時(shí)候還不能保證一次成功)。

      安裝 puppeteer 時(shí)會下載 Chromium-Browser,鑒于咱特殊國情,很有可能出現(xiàn)無法下載的情況,對此,就請大家各顯神通吧……

      使用

      以采集今日頭條手機(jī)版頁面文章內(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)容(截圖中只是其中部分)

      Laravel 中使用 puppeteer 采集異步加載的網(wǎng)頁內(nèi)容

      此外,也可以將頁面保存為圖片或 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')); }

      Laravel 中使用 puppeteer 采集異步加載的網(wǎng)頁內(nèi)容

      圖片里那些框與系統(tǒng)字體有關(guān)。代碼中使用了一個(gè) setDelay() 方法,是為了讓內(nèi)容加載完成后再進(jìn)行截圖,簡單粗暴,可能不是最好的解決辦法。

      可能出現(xiàn)的問題

      系統(tǒng)得支持 Chromium 瀏覽器,當(dāng)然現(xiàn)在絕大部分瀏覽器是支持的,要不然也沒法,還是用 PhantomJS 吧。

      項(xiàng)目中安裝了 puppeteer 后調(diào)用時(shí)有可能出現(xiàn)權(quán)限問題,這就需要對項(xiàng)目下 /node_modules/puppeteer 目錄賦予適當(dāng)?shù)臋?quán)限。

      總結(jié)

      puppeteer 被應(yīng)用于測試、采集等場景,是一個(gè)非常有力的工具。對于輕度的采集任務(wù),是夠用的,比如本文這類在 Laravel (php) 里來用采集一些小頁面,但如果需要快速采集大量內(nèi)容,還是 Python 啥的吧

      贊(0)
      分享到: 更多 (0)
      網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號