最近一直在留意這個Class...發覺他真的很強大也很人性化,單是看到這種擴展寫法,就已經覺得有點興奮了。

<?php
/**
 * 目前已經有:HTTP操作、多線程、模擬登陸等QueryList擴展
 * 下面來利用QueryList擴展來組合上面的例子,實現多線程採集文章並保存文章圖片到本地
 */
use QL\QueryList;

//HTTP操作擴展
$urls = QueryList::run('Request',[
        'target' => 'http://cms.querylist.cc/news/list_2.html',
        'referrer'=>'http://cms.querylist.cc',
        'method' => 'GET',
        'params' => ['var1' => 'testvalue', 'var2' => 'somevalue'],
        'user_agent'=>'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:21.0) Gecko/20100101 Firefox/21.0',
        'cookiePath' => './cookie.txt',
        'timeout' =>'30'
    ])->setQuery(['link' => ['h2>a','href','',function($content){
    //利用回調函數補全相對鏈接
    $baseUrl = 'http://cms.querylist.cc';
    return $baseUrl.$content;
}]],'.cate_list li')->getData(function($item){
    return $item['link'];
});

//多線程擴展
QueryList::run('Multi',[
    'list' => $urls,
    'curl' => [
        'opt' => array(
                    CURLOPT_SSL_VERIFYPEER => false,
                    CURLOPT_SSL_VERIFYHOST => false,
                    CURLOPT_FOLLOWLOCATION => true,
                    CURLOPT_AUTOREFERER => true,
                ),
        //設置線程數
        'maxThread' => 100,
        //設置最大嘗試數
        'maxTry' => 3 
    ],
    'success' => function($a){
        //採集規則
        $reg = array(
            //採集文章標題
            'title' => array('h1','text'),
            //採集文章發佈日期,這裡用到了QueryList的過濾功能,過濾掉span標籤和a標籤
            'date' => array('.pt_info','text','-span -a',function($content){
                //用回調函數進一步過濾出日期
                $arr = explode(' ',$content);
                return $arr[0];
            }),
            //採集文章正文內容,利用過濾功能去掉文章中的超鏈接,但保留超鏈接的文字,並去掉版權、JS代碼等無用信息
            'content' => array('.post_content','html','a -.content_copyright -script',function($content){
                    //利用回調函數下載文章中的圖片並替換圖片路徑為本地路徑
                    //使用本例請確保當前目錄下有image文件夾,並有寫入權限
                    //由於QueryList是基於phpQuery的,所以可以隨時隨地使用phpQuery,當然在這裡也可以使用正則或者其它方式達到同樣的目的
                    $doc = phpQuery::newDocumentHTML($content);
                    $imgs = pq($doc)->find('img');
                    foreach ($imgs as $img) {
                        $src = pq($img)->attr('src');
                        $localSrc = 'image/'.md5($src).'.jpg';
                        $stream = file_get_contents($src);
                        file_put_contents($localSrc,$stream);
                        pq($img)->attr('src',$localSrc);
                    }
                    return $doc->htmlOuter();
            })
            );
        $rang = '.content';
        $ql = QueryList::Query($a['content'],$reg,$rang);
        $data = $ql->getData();
        //打印結果,實際操作中這裡應該做入數據庫操作
        print_r($data);
    }
]);

下面是小簡介(轉載Github)

TOC:

[TOC]

#連結
QueryList交流社區: http://querylist.cc/
QueryList文檔: http://doc.querylist.cc/

#QueryList簡介
QueryList是一個基於phpQuery的通用列表採集類,是一個簡單、 靈活、強大的採集工具,採集任何複雜的頁面 基本上就一句話就能搞定了。

#QueryList 使用

//獲取採集對像
$hj = QueryList::Query('http://www.baidu.com/s?wd=QueryList',array('title'=>array('h3','text'),'link'=>array('h3>a','href')));
//輸出結果:二維關聯數組
print_r($hj->data);

上面的代碼實現的功能是採集百度搜索結果頁面的所有搜索結果的標題和鏈接,然後分別以二維關聯數組的格式輸出。

I. Query() 靜態方法

返回值:QueryList對像

Query方法為QueryList唯一的主方法,用靜態的方式調用。

原型:

QueryList::Query($page,array $rules, $range = '', $outputEncoding = null, $inputEncoding = null,$removeHead = false)

中文解釋:

QueryList::Query(採集的目標頁面,採集規則[,區域選擇器][,輸出編碼][,輸入編碼][,是否移除頭部])
//採集規則
$rules = array(
   '規則名' => array('jQuery選擇器','要採集的屬性'[,"標籤過濾列表"][,"回調函數"]),
   '規則名2' => array('jQuery選擇器','要採集的屬性'[,"標籤過濾列表"][,"回調函數"]),
    ..........
    [,"callback"=>"全局回調函數"]
);

//注:方括號括起來的參數可選

參數解釋:

查看文檔:http://doc.querylist.cc/site/index/doc/11

II. QueryList 擴展

Request擴展

可以實現如攜帶cookie、偽造來路等任意複雜的網絡請求,再也不用擔心QueryList內置的抓取功能太弱了。

Login擴展

可以實現模擬登陸然後採集。

Multi擴展

多線程(多進程)採集擴展。

擴展通過QueryList::run 方法運行。

##QueryList 安裝

composer require jaeger/querylist

包含QueyListy以及擴展的完整Composer配置如下:

{
    "require": {
        "jaeger/querylist": "^3.1",
        "jaeger/querylist-ext-request":"^1.0",
        "jaeger/querylist-ext-multi":"^1.0",
        "jaeger/querylist-ext-login":"^1.0"
    }
}

##QueryList 依賴庫

phpQuery

phpQuery項目主頁:https://code.google.com/p/phpquery/

##其它說明
QueryList 內置的只是簡單的源碼抓取方法,遇到更複雜的抓取情況,如:需要登陸
身份驗證 時,請配合其它的PHP的HTTP類來使用,通過將輔助的HTTP類抓取到的網頁源碼傳給QueryList即可。

##作者信息

Author : Jaeger
Email : hj.q@qq.com
交流QQ群:123266961