Puppeteer 插件



  • 使用Puppeteer采集JavaScript动态渲染的页面。使用此插件需要有一定的Node.js基础知识,并且会配置Node运行环境。

此插件是基于PuPHPeteer包的简单封装,支持使用Puppeteer所有的API,非常强大!

环境要求

  • PHP >= 7.1
  • Node >= 8

安装

  • 安装插件
  1. composer require jaeger/querylist-puppeteer
  • 安装Node依赖(与composer一样在项目根目录下执行)
  1. npm install @nesk/puphpeteer

或者使用yarn安装Node依赖:

  1. yarn add @nesk/puphpeteer

如果npm安装速度太慢,可以尝试更换国内npm镜像源:

  1. npm config set registry https://registry.npm.taobao.org

插件注册选项

QueryList::use(Chrome::class,$opt1)

  • $opt1: 设置chrome函数别名

API

  • chrome($url, $options = []) 使用Chrome打开链接,返回值为设置好HTML的QueryList对象

用法

在QueryList中注册插件

  1. use QL\QueryList;
  2. use QL\Ext\Chrome;
  3. $ql = QueryList::getInstance();
  4. // 注册插件,默认注册的方法名为: chrome
  5. $ql->use(Chrome::class);
  6. // 或者自定义注册的方法名
  7. $ql->use(Chrome::class,'chrome');

基本用法

  1. // 抓取的目标页面是使用Vue.js动态渲染的页面
  2. $text = $ql->chrome('https://www.iviewui.com/components/button')->find('h1')->text();
  3. print_r($text);
  4. // 输出: Button 按钮
  1. $rules = [
  2. 'h1' => ['h1','text']
  3. ];
  4. $ql = $ql->chrome('https://www.iviewui.com/components/button');
  5. $data = $ql->rules($rules)->queryData();

设置Puppeteer launch选项,选项文档:https://github.com/GoogleChrome/puppeteer/blob/v1.11.0/docs/api.md#puppeteerlaunchoptions

  1. $text = $ql->chrome('https://www.iviewui.com/components/button',[
  2. 'timeout' => 6000,
  3. 'ignoreHTTPSErrors' => true,
  4. // ...
  5. ])->find('h1')->text();

更高级的用法,查看Puppeteer文档了解全部API: https://github.com/GoogleChrome/puppeteer

  1. $text = $ql->chrome(function ($page,$browser) {
  2. $page->setUserAgent('Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36');
  3. // 设置cookie
  4. $page->setCookie([
  5. 'name' => 'foo',
  6. 'value' => 'xxx',
  7. 'url' => 'https://www.iviewui.com'
  8. ],[
  9. 'name' => 'foo2',
  10. 'value' => 'yyy',
  11. 'url' => 'https://www.iviewui.com'
  12. ]);
  13. $page->goto('https://www.iviewui.com/components/button');
  14. // 等待h1元素出现
  15. $page->waitFor('h1');
  16. // 获取页面HTML内容
  17. $html = $page->content();
  18. // 关闭浏览器
  19. $browser->close();
  20. // 返回值一定要是页面的HTML内容
  21. return $html;
  22. })->find('h1')->text();

调试

调试有很多种方法,下面演示通过页面截图和启动可视化Chrome浏览器来了解页面加载情况

页面截图

运行下面代码后可以在项目根目录下看到page.png截图文件。

  1. $text = $ql->chrome(function ($page,$browser) {
  2. $page->goto('https://www.iviewui.com/components/button');
  3. // 页面截图
  4. $page->screenshot([
  5. 'path' => 'page.png',
  6. 'fullPage' => true
  7. ]);
  8. $html = $page->content();
  9. $browser->close();
  10. return $html;
  11. })->find('h1')->text();

启动可视化Chrome浏览器

运行下面代码后会启动一个Chrome浏览器。

  1. $text = $ql->chrome(function ($page,$browser) {
  2. $page->goto('https://www.iviewui.com/components/button');
  3. $html = $page->content();
  4. // 这里故意设置一个很长的延长时间,让你可以看到chrome浏览器的启动
  5. sleep(10000000);
  6. $browser->close();
  7. // 返回值一定要是页面的HTML内容
  8. return $html;
  9. },[
  10. 'headless' => false, // 启动可视化Chrome浏览器,方便调试
  11. 'devtools' => true, // 打开浏览器的开发者工具
  12. ])->find('h1')->text();