Laravel 配合 puppeteer 抓取 SPA 页面

由于 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 协议》,转载必须注明作者和本文链接
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 2

不错,个人也有在弄这个

4年前 评论

不用弄个Laravel框架进来吧 :smiley:

3年前 评论
家猪配种专家 (楼主) 3年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!