Laravel 配合 puppeteer 抓取 SPA 頁面

家豬配種專家發表於2020-02-17

由於 Vue,React等 js 框架的廣泛使用,傳統的 php 爬蟲對於 SPA 的頁面,只能爬到這樣一個 html 檔案,沒有任何用,因為頁面完全是靠 js 在前端渲染出來的
vue spa 頁面的 dom


但是現在我們可以用 php 配合 puppeteer 抓取 js 渲染之後的頁面
  1. 先建立一個 Laravel 專案 composer create-project laravel/laravel crawler
  2. 安裝依賴 composer require nesk/puphpeteernpm install @nesk/puphpeteer(可以把 Laravel 預設的 npm 依賴全部刪了)
  3. 新建命令 php artisan make:command ShallowScrapingData --command=crawler:shallow-scraping 再在 app\Console\Commands下新建 ScrapingHelper.php
  4. 編輯 ShallowScrapingData.php
         ...
         use ScrapingHelper;
         ...
         public function handle(){
             $this->info($this->scrape('https://www.iviewui.com'));
         }
         ...
    編輯 ScrapingHelper.php
     <?php
     namespace App\Console\Commands;
     use Nesk\Puphpeteer\Puppeteer;
     trait ScrapingHelper{
         public function scrape(String $url){
             $puppeteer = new Puppeteer; // 新建 Puppeteer 例項
             $browser = $puppeteer->launch(); // 啟動無頭瀏覽器
             $page = $browser->newPage(); // 開啟新的標籤頁
             try{
                 $page->tryCatch->goto($url,[
                     'timeout' => 0,
                     'read_timeout' => 0
                 ]); // 訪問頁面
                 $html = $page->content();
                 $browser->close();
                 return $html; // 返回 js 渲染後的頁面
             }catch(Exception $error){
                 ...
             }
         }
         ...
     }
  5. 執行 php artisan crawler:shallow-scraping,效果如下
    爬蟲效果
    可以看到紅框處即是 Vue 的渲染標誌

可能遇到的問題
  1. libX11-xcb.so.1: cannot open shared object file: No such file or directory
    可能遇到的問題
    解決辦法:
     apt-get install gconf-service libxext6 libxfixes3 libxi6 libxrandr2 libxrender1 libcairo2 libcups2 libdbus-1-3 libexpat1 libfontconfig1 libgcc1 libgconf-2-4 libgdk-pixbuf2.0-0 libglib2.0-0 libgtk-3-0 libnspr4 libpango-1.0-0 libpangocairo-1.0-0 libstdc++6 libx11-6 libx11-xcb1 libxcb1 libxcomposite1 libxcursor1 libxdamage1 libxss1 libxtst6 libappindicator1 libnss3 libasound2 libatk1.0-0 libc6 ca-certificates fonts-liberation lsb-release xdg-utils wget
  2. --no-sandbox is not supported
    可能遇到的問題
    解決辦法:不要用 root 使用者執行 php artisan crawler:shallow-scraping
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章