PhantomJS 插件



  • 使用PhantomJS采集JavaScript动态渲染的页面。这个包基于jonnyw/php-phantomjs包。
PhantomJS: http://phantomjs.orgjonnyw/php-phantomjs: https://github.com/jonnnnyw/php-phantomjsGitHub: https://github.com/jae-jae/QueryList-PhantomJS

安装

  1. composer require jaeger/querylist-phantomjs

然后还需要去PhantomJS官网下载对应你电脑系统的PhantomJS二进制文件,放到电脑任意路径,下面会用到这个路径,下载页面直达:http://phantomjs.org/download.html

BUG修复

如果运行报下面错:

  1. PHP Warning: Declaration of JonnyW\PhantomJs\DependencyInjection\ServiceContainer::load() should be compatible with Symfony\Component\DependencyInjection\Container::load($file) in /wwwroot/vendor/jonnyw/php-phantomjs/src/JonnyW/PhantomJs/DependencyInjection/ServiceContainer.php on line 20

这是jonnyw/php-phantomjs这个包的bug,已提交给作者等待被修复,在作者未修复前,我们可以通过以下2种方式解决:

方法一: 忽略这个警告,这个警告不影响程序的正确运行,可以屏蔽之。

方法二: 手动修改源码,修改文件vendor/jonnyw/php-phantomjs/src/JonnyW/PhantomJs/DependencyInjection/ServiceContainer.php中的load()函数加个参数并给个默认值:

  1. public function load($file = null)
  2. {
  3. //...
  4. }

API

  • browser($url,$debug = false,$commandOpt = []):使用浏览器打开连接 ,return QueryList
    • $url : 待采集的url或者返回\JonnyW\PhantomJs\Http\RequestInterface对象的匿名函数
    • $debug : 是否开启debug调试,打印更多信息
    • $commandOpt : 设置phantomjs命令行参数,详情:http://phantomjs.org/api/command-line.html

安装参数

QueryList::use(PhantomJs::class,$opt1,$opt2)

  • $opt1: PhantomJS二进制文件路径
  • $opt2: browser 函数别名

用法

  • Installation Plugin
  1. use QL\QueryList;
  2. use QL\Ext\PhantomJs;
  3. $ql = QueryList::getInstance();
  4. // 安装时需要设置PhantomJS二进制文件路径
  5. $ql->use(PhantomJs::class,'/usr/local/bin/phantomjs');
  6. //or Custom function name
  7. $ql->use(PhantomJs::class,'/usr/local/bin/phantomjs','browser');
  8. // Windows下示例
  9. // 注意:路径里面不能有空格中文之类的
  10. $ql->use(PhantomJs::class,'C:/phantomjs/bin/phantomjs.exe');
  • Example-1
  1. $html = $ql->browser('https://m.toutiao.com')->getHtml();
  2. print_r($html);
  3. $data = $ql->browser('https://m.toutiao.com')->find('p')->texts();
  4. print_r($data->all());
  5. // 更多选项可以查看文档: http://phantomjs.org/api/command-line.html
  6. $ql->browser('https://m.toutiao.com',true,[
  7. // 使用http代理
  8. '--proxy' => '192.168.1.42:8080',
  9. '--proxy-type' => 'http'
  10. ])
  • Example-2
  1. $data = $ql->browser(function (\JonnyW\PhantomJs\Http\RequestInterface $r){
  2. $r->setMethod('GET');
  3. $r->setUrl('https://m.toutiao.com');
  4. $r->setTimeout(10000); // 10 seconds
  5. $r->setDelay(3); // 3 seconds
  6. return $r;
  7. })->find('p')->texts();
  8. print_r($data->all());
  • Example-3
  1. $data = $ql->browser(function (\JonnyW\PhantomJs\Http\RequestInterface $r){
  2. $r->setMethod('GET');
  3. $r->setUrl('https://m.toutiao.com');
  4. $r->setTimeout(10000); // 10 seconds
  5. $r->setDelay(3); // 3 seconds
  6. return $r;
  7. },true,[
  8. '--cookies-file' => '/path/to/cookies.txt'
  9. ])->rules([
  10. 'title' => ['p','text'],
  11. 'link' => ['a','href']
  12. ])->query()->getData();
  13. print_r($data->all());