对于更复杂的http网络操作


QueryList本身内置的网络操作非常简单,QueryList关注于DOM选择;对于更复杂的网络操作可以选择使用Request扩展,它可以简单的实现:携带cookie、伪造来路、伪造浏览器等功能,但如果觉的它依旧不能满足你的需求,下面有几个可以参考的方案:

1.自己用curl封装一个http请求

例:

  1. function getHtml($url)
  2. {
  3. $ch = curl_init();
  4. curl_setopt($ch, CURLOPT_URL, $url);
  5. curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
  6. curl_setopt($ch, CURLOPT_AUTOREFERER, true);
  7. curl_setopt($ch, CURLOPT_REFERER, $url);
  8. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  9. $result = curl_exec($ch);
  10. curl_close($ch);
  11. return $result;
  12. }
  13. $rules = array(
  14. //采集规则
  15. );
  16. //获取页面源码
  17. $html = getHtml('http://xxx.com');
  18. //采集
  19. $data = QueryList::Query($html,$rules)->data;

2.使用第三方http包

QueryList可以无缝与任意第三放http包配合使用,下面以guzzlehttp/guzzle包为例,Guzzle是一个PHP的HTTP客户端,用来轻而易举地发送请求,并集成到我们的WEB服务上。

Guzzle中文手册:http://guzzle-cn.readthedocs.io/zh_CN/latest/

安装

  1. //安装QueryList
  2. composer require jaeger/querylist
  3. //安装Guzzle
  4. composer require guzzlehttp/guzzle

使用

  1. <?php
  2. require 'vendor/autoload.php';
  3. //实例化一个Http客户端
  4. $client = new GuzzleHttp\Client(['base_uri' => 'https://phphub.org']);
  5. $jar = new \GuzzleHttp\Cookie\CookieJar();
  6. //发送一个Http请求
  7. $response = $client->request('GET', '/categories/6', [
  8. 'headers' => [
  9. 'User-Agent' => 'testing/1.0',
  10. 'Accept' => 'application/json',
  11. 'X-Foo' => ['Bar', 'Baz']
  12. ],
  13. 'form_params' => [
  14. 'foo' => 'bar',
  15. 'baz' => ['hi', 'there!']
  16. ],
  17. // 'cookies' => $jar,
  18. 'timeout' => 3.14,
  19. // 'proxy' => 'tcp://localhost:8125',
  20. // 'cert' => ['/path/server.pem', 'password'],
  21. ]);
  22. $body = $response->getBody();
  23. //获取到页面源码
  24. $html = (string)$body;
  25. //采集规则
  26. $rules = array(
  27. //文章标题
  28. 'title' => ['.media-heading a','text'],
  29. //文章链接
  30. 'link' => ['.media-heading a','href'],
  31. //文章作者名
  32. 'author' => ['.img-thumbnail','alt']
  33. );
  34. //列表选择器
  35. $rang = '.topic-list>li';
  36. //采集
  37. $data = \QL\QueryList::Query($html,$rules,$rang)->data;
  38. //查看采集结果
  39. print_r($data);

结果:

  1. Array
  2. (
  3. [0] => Array
  4. (
  5. [title] => 好友动态的实现原理
  6. [link] => https://phphub.org/topics/2750
  7. [author] => luo975974740
  8. )
  9. [1] => Array
  10. (
  11. [title] => 打造完美的 Ubuntu16.04 开发环境【持续更新】
  12. [link] => https://phphub.org/topics/2723
  13. [author] => liuwantao
  14. )
  15. //省略........
  16. [19] => Array
  17. (
  18. [title] => [Laravel 5.3 新功能] 10. 全文搜索方案 Laravel Scout 介绍
  19. [link] => https://phphub.org/topics/2673
  20. [author] => monkey
  21. )
  22. )