php使用QueryList轻松采集js动态渲染页面方法


Posted in PHP onSeptember 11, 2018

QueryList使用jQuery的方式来做采集,拥有丰富的插件。下面来演示QueryList使用PhantomJS插件抓取JS动态创建的页面内容。

一、安装

使用Composer安装:

1.安装QueryList

composer require jaeger/querylist

GitHub: https://github.com/jae-jae/QueryList

2.安装PhantomJS插件

composer require jaeger/querylist-phantomjs

GitHub: https://github.com/jae-jae/QueryList-PhantomJS

二、下载PhantomJS二进制文件

PhantomJS官网:http://phantomjs.org ,下载对应平台的PhantomJS二进制文件。

三、插件API

QueryList browser($url,$debug = false,$commandOpt = []):使用浏览器打开连接

四、使用

以采集「今日头条」手机版为例,「今日头条」手机版基于React框架,内容是纯动态渲染出来的。

下面演示QueryList的PhantomJs插件用法:

1.安装插件

use QL\QueryList;
use QL\Ext\PhantomJs;
 
$ql = QueryList::getInstance();
// 安装时需要设置PhantomJS二进制文件路径
$ql->use(PhantomJs::class,'/usr/local/bin/phantomjs');
//or Custom function name
$ql->use(PhantomJs::class,'/usr/local/bin/phantomjs','browser');

2.Example-1

获取动态渲染的HTML:

$html = $ql->browser('https://m.toutiao.com')->getHtml();
print_r($html);

获取所有p标签文本内容:

$data = $ql->browser('https://m.toutiao.com')->find('p')->texts();
print_r($data->all());

输出:

Array(
  [0] => 自拍模式开启!国庆假期我和国旗合个影
  [1] => 你旅途已开始 他们仍在自己的岗位上为你的假期保驾护航
  [2] => 喜极而泣,都教授终于回到地球了!  //....)

使用http代理:

// 更多选项可以查看文档: 
http://phantomjs.org/api/command-line.html
$ql->browser('https://m.toutiao.com',true,[  
// 使用http代理 
'--proxy' => '192.168.1.42:8080',  '--proxy-type' => 'http'
])

3.Example-2

自定义一个复杂的请求:

$data = $ql->browser(function (\JonnyW\PhantomJs\Http\RequestInterface $r){
  $r->setMethod('GET');
  $r->setUrl('https://m.toutiao.com');
  $r->setTimeout(10000); // 10 seconds
  $r->setDelay(3); // 3 seconds
  return $r;
})->find('p')->texts();
 
print_r($data->all());

开启debug模式,并从本地加载cookie文件:

$data = $ql->browser(function (\JonnyW\PhantomJs\Http\RequestInterface $r){
  $r->setMethod('GET');
  $r->setUrl('https://m.toutiao.com');
  $r->setTimeout(10000); // 10 seconds
  $r->setDelay(3); // 3 seconds
  return $r;
},true,[
  '--cookies-file' => '/path/to/cookies.txt'
])->rules([
  'title' => ['p','text'],
  'link' => ['a','href']
])->query()->getData();
 
print_r($data->all());
PHP 相关文章推荐
PHP 递归效率分析
Nov 24 PHP
PHP字符串的编码问题的详细介绍
Apr 27 PHP
深入Apache与Nginx的优缺点比较详解
Jun 17 PHP
Laravel框架学习笔记(一)环境搭建
Oct 15 PHP
ThinkPHP中RBAC类的四种用法分析
Nov 24 PHP
Yii框架登录流程分析
Dec 03 PHP
php计算title标题相似比的方法
Jul 29 PHP
php 三元运算符实例详细介绍
Dec 15 PHP
简单实现PHP留言板功能
Dec 21 PHP
PHP实现随机生成水印图片功能
Mar 22 PHP
php表单文件iframe异步上传实例讲解
Jul 26 PHP
php中文语义分析实现方法示例
Sep 28 PHP
Yii2结合Workerman的websocket示例详解
Sep 10 #PHP
PHP按符号截取字符串的指定部分的实现方法
Sep 10 #PHP
php 中htmlentities导致中文无法查询问题
Sep 10 #PHP
使用PHPExcel导出Excel表
Sep 08 #PHP
thinkPHP5.0框架事务处理操作简单示例
Sep 07 #PHP
thinkPHP5.0框架验证码调用及点击图片刷新简单实现方法
Sep 07 #PHP
php curl优化下载微信头像的方法总结
Sep 07 #PHP
You might like
WINXP下apache+php4+mysql
2006/11/25 PHP
php自动注册登录验证机制实现代码
2011/12/20 PHP
PHP反转字符串函数strrev()函数的用法
2012/02/04 PHP
thinkphp制作404跳转页的简单实现方法
2016/09/22 PHP
php微信公众平台交互与接口详解
2016/11/28 PHP
php使用GD2绘制几何图形示例
2017/02/15 PHP
PHP中创建和编辑Excel表格的方法
2018/09/13 PHP
PHP7.0连接DB操作实例分析【基于mysqli】
2019/09/26 PHP
jquery通过a标签删除table中的一行的代码
2013/12/02 Javascript
jquery使用slideDown实现模块缓慢拉出效果的方法
2015/03/27 Javascript
jQuery简单实现页面元素置顶时悬浮效果示例
2016/08/01 Javascript
H5实现中奖记录逐行滚动切换效果
2017/03/13 Javascript
vue使用stompjs实现mqtt消息推送通知
2017/06/22 Javascript
JavaScript高阶函数_动力节点Java学院整理
2017/06/28 Javascript
AngularJS实现select的ng-options功能示例
2017/07/12 Javascript
vue实现nav导航栏的方法
2017/12/13 Javascript
NodeJS实现不可逆加密与密码密文保存的方法
2018/03/16 NodeJs
vue-router history模式下的微信分享小结
2018/07/05 Javascript
基于JS开发微信网页录音功能的实例代码
2019/04/30 Javascript
小程序两种滚动公告栏的实现方法
2019/09/17 Javascript
JavaScript 面向对象程序设计详解【类的创建、实例对象、构造函数、原型等】
2020/05/12 Javascript
Python程序中用csv模块来操作csv文件的基本使用教程
2016/03/03 Python
Python爬虫抓取技术的一些经验
2019/07/12 Python
在django中图片上传的格式校验及大小方法
2019/07/28 Python
python 队列基本定义与使用方法【初始化、赋值、判断等】
2019/10/24 Python
python基于plotly实现画饼状图代码实例
2019/12/16 Python
Python中import导入不同目录的模块方法详解
2020/02/18 Python
Python实现中英文全文搜索的示例
2020/12/04 Python
Python实现PS滤镜中的USM锐化效果
2020/12/04 Python
《木笛》教学反思
2014/03/01 职场文书
客运企业隐患排查工作方案
2014/06/06 职场文书
学校食品安全责任书
2015/01/29 职场文书
未中标通知书
2015/04/17 职场文书
《月球之谜》教学反思
2016/02/20 职场文书
SSM项目使用拦截器实现登录验证功能
2022/01/22 Java/Android
MySQL如何使备份得数据保持一致
2022/05/02 MySQL