QueryList文档

HTTP客户端

HTTP客户端用于抓取网页HTML源码。


QueryList内置的HTTP客户端基于GuzzleHttp,并进行了简化,只保留了get()方法和post()方法,请求参数与GuzzleHttp一致,GuzzleHttp文档:http://guzzle-cn.readthedocs.io/zh_CN/latest/ ,在请求参数上有什么不明白的地方可以直接查看这个文档。


用法

get()方法和post()方法用法和参数完全一致,且共享cookie。

$ql = QueryList::get('http://httpbin.org/get?param1=testvalue&params2=somevalue');
// 等价于
$ql->get('http://httpbin.org/get',[
    'param1' => 'testvalue',
    'params2' => 'somevalue'
]);

// 发送post请求
$ql = QueryList::post('http://httpbin.org/post',[
    'param1' => 'testvalue',
    'params2' => 'somevalue'
]);

自定义HTTP Header

$ql = QueryList::get('http://httpbin.org/get',[
    'param1' => 'testvalue',
    'params2' => 'somevalue'
],[
    'headers' => [
        'Referer' => 'https://querylist.cc/',
        'User-Agent' => 'testing/1.0',
        'Accept'     => 'application/json',
        'X-Foo'      => ['Bar', 'Baz'],
        // 携带cookie
        'Cookie'    => 'abc=111;xxx=222'
    ]
]);

更多高级参数

还可以携带更多高级参数,如:设置超时时间、设置代理等。

$ql = QueryList::get('http://httpbin.org/get',[
    'param1' => 'testvalue',
    'params2' => 'somevalue'
],[
    // 设置代理
    'proxy' => 'http://222.141.11.17:8118',
    //设置超时时间,单位:秒
    'timeout' => 30,
    'headers' => [
        'Referer' => 'https://querylist.cc/',
        'User-Agent' => 'testing/1.0',
        'Accept'     => 'application/json',
        'X-Foo'      => ['Bar', 'Baz'],
        'Cookie'    => 'abc=111;xxx=222'
    ]
]);

$ql->post('http://httpbin.org/post',[
    'param1' => 'testvalue',
    'params2' => 'somevalue'
],[
    'proxy' => 'http://222.141.11.17:8118',
    'timeout' => 30,
    'headers' => [
        'Referer' => 'https://querylist.cc/',
        'User-Agent' => 'testing/1.0',
        'Accept'     => 'application/json',
        'X-Foo'      => ['Bar', 'Baz'],
        'Cookie'    => 'abc=111;xxx=222'
    ]
]);

连贯操作

post操作和get操作是cookie共享的,意味着你可以先调用post()方法登录,然后get()方法就可以采集所有登录后的页面。

$ql = QueryList::post('http://xxxx.com/login',[
    'username' => 'admin',
    'password' => '123456'
])->get('http://xxx.com/admin');

$ql->get('http://xxx.com/admin/page');

获取抓取到的HTML

使用getHtml()方法可以获取到get()post()方法返回的HTML内容,通常用于调试打印验证抓取结果等场景。

$ql = QueryList::get('http://httpbin.org/get?param1=testvalue');
echo $ql->getHtml();

捕获HTTP异常

如果遇到HTTP错误,如:404,500等,QueryList就会抛出HTTP异常,并终止程序。如果你不想出现HTTP异常时程序终止,可以自己捕获异常并处理,更多关于HTTP异常的细节:http://guzzle-cn.readthedocs.io/zh_CN/latest/quickstart.html#id13

use QL\QueryList;
use GuzzleHttp\Exception\RequestException;

try{
    $ql = QueryList::get('https://www.sfasd34234324.com');
}catch(RequestException $e){
    //print_r($e->getRequest());
    echo 'Http Error';
}

{primary} 相关专题:忽略HTTP异常

获取HTTP响应头等信息

如果你想获取HTTP响应头,如响应状态码,QueryList内置的HTTP客户端屏蔽了这部分功能,请直接使用GuzzleHttp来实现。

use GuzzleHttp\Client;

$client = new Client();
$response = $client->get('http://httpbin.org/get');
// 获取响应头部信息
$headers = $response->getHeaders();

print_r($headers);

自定义HTTP客户端

GuzzleHttp是一款功能非常强大的HTTP客户端,你想要的功能它几乎都有;但如果你还是想使用自己熟悉的HTTP客户端如:curl,那也是可以的:

function getHtml($url)
{
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_AUTOREFERER, true);
    curl_setopt($ch, CURLOPT_REFERER, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $result = curl_exec($ch);
    curl_close($ch);
    return $result;
}

$html = getHtml('http://httpbin.org/get?param1=testvalue');
// 这种情况下允许你对HTML做一些额外的处理后,然后再把HTML传给QueryList对象
$html = str_replace('xxx','yyy',$html);
$ql = QueryList::html($html);
echo $ql->getHtml();

通过其他HTTP客户端获取源码,然后使用html()方法来设置html,html()方法除了可以接收一个完整的HTML网页外,还支持接收HTML片段:

$html = <<<STR
<div id="one">
    <div class="two">
        <a href="http://querylist.cc">QueryList官网</a>
        <img src="http://querylist.com/1.jpg" alt="这是图片">
        <img src="http://querylist.com/2.jpg" alt="这是图片2">
    </div>
    <span>其它的<b>一些</b>文本</span>
</div>        
STR;

$ql = QueryList::html($html);

{warning} phpQuery有个bug,那就是当HTML中有它无法识别的特殊字符时,HTML就会被截断,导致最终的采集结果不正确,此时可以尝试使用正则或其它方式获取到要采集的内容的HTML片段,把这个HTML片段传给QueryList,从而可以解决这种场景下的问题。