QueryList是一個基於phpQuery的簡潔、優雅的PHP採集工具,具有高擴展性。
1、擁有與jQuery完全相同的CSS3 DOM選擇器
2、擁有與jQuery完全相同的DOM操作API
3.擁有通用的清單擷取方案
4.擁有強大的HTTP請求套件,輕鬆實現如:模擬登陸、偽造瀏覽器、HTTP代理等意複雜的網路請求
5.擁有亂碼解決方案
6.擁有強大的內容過濾功能,可使用jQuey選擇器來過濾內容
7.擁有高度的模組化設計,擴充性強
8.擁有富有表現力的API
9、擁有高品質文檔
10.擁有豐富的插件
11、擁有專業的問答社群和交流群
透過插件可以輕鬆實現諸如
1、多執行緒採集
2.採集JavaScript動態渲染的頁面(PhantomJS/headless WebKit)
3.圖片本地化
4.模擬瀏覽器行為,如:提交Form表單
5.網路爬蟲
6、.....
PHP >= 7.0
如果你的PHP還停留在PHP5,或是不會使用Composer,你可以選擇使用QueryList3,QueryList3支援php5.3以及手動安裝。
透過Composer安裝:
composer require jaeger/querylist
元素操作
採集「暱稱網」所有圖片地址
QueryList::get('http://www.nipic.com')->find('img')->attrs('src');
採集百度搜尋結果
$ql = QueryList::get('http://www.baidu.com/s?wd=QueryList');$ql->find('title')->text(); // 取得網站標題$ql ->find('meta[name=keywords]')->content; // 取得網站頭關鍵字$ql->find('h3>a')->texts(); //取得搜尋結果標題清單$ql->find('h3>a')->attrs('href'); //取得搜尋結果連結清單$ql->find('img')->src; / /取得第一張圖片的連結位址$ql->find('img:eq(1)')->src; //取得第二張圖片的連結位址$ql->find('img')->eq(2)->src; //取得第三張圖片的連結位址// 遍歷所有圖片$ql->find ('img')->map(function($img){echo $img->alt; //印出圖片的alt屬性});
更多用法
$ql->find('#head')->append('
清單採集
收集百度搜尋結果清單的標題和連結:
$data = QueryList::get('http://www.baidu.com/s?wd=QueryList')// 設定採集規則->rules([ 'title'=>array('h3','text' ), 'link'=>array('h3>a','href')])->query()->getData();print_r($data->all());
採集結果:
Array( [0] => Array ( [title] => QueryList|基於phpQuery的無比強大的PHP採集工具[link] => http://www.baidu.com/link?url=GU_YbDT2IHk4ns1tjG2I8_vjmH0SCJEAPuuZN ) [1] = > Array ( [title] => PHP 用QueryList抓取網頁內容- wb145230 - 部落格花園[link] => http://www.baidu.com/link?url=zn0DXBnrvIF2ibRVW34KcRVFG1_bCdZvqvwIhUqiXaS ) [2] => Array ( [title] =>vwIhUqiXaS ) [2] => Array ( [title] => 介紹- QueryList] => http://www.baidu.com/link?url=pSypvMovqS4v2sWeQo5fDBJ4EoYhXYi0Lxx ) //...)
編碼轉換
// 輸出編碼:UTF-8,輸入編碼:GB2312QueryList::get('https://top.etao.com')->encoding('UTF-8','GB2312')->find('a' )->texts();//輸出編碼:UTF-8,輸入編碼:自動辨識QueryList::get('https://top.etao.com')->encoding('UTF-8')->find('a')->texts ();
HTTP網路操作(GuzzleHttp)
攜帶cookie登入新浪微博
//採集新浪微博需要登入才能存取的頁面$ql = QueryList::get('http://weibo.com','param1=testvalue & params2=somevalue',[ 'headers' => [ //填寫從瀏覽器取得到的cookie 'Cookie' => 'SINAGLOBAL=546064; wb_cmtLike_2112031=1; wvr=6;....' ]]);//echo $ql->getHtml();echo $ql->find('title')->text();//輸出: 我的首頁微博-隨時隨地發現新鮮事
使用Http代理
$urlParams = ['param1' => 'testvalue','params2' => 'somevalue'];$opts = [// 設定http代理'proxy' => 'http://222.141.11.17:8118', / /設定超時時間,單位:秒'timeout' => 30, // 偽造http頭'headers' => [ 'Referer' => 'https://querylist.cc/', 'User-Agent' => 'testing/1.0', 'Accept' => 'application/json', 'X-Foo' => ['Bar', 'Baz' ], 'Cookie' => 'abc=111;xxx=222' ]];$ql->get('http://httpbin.org/get',$urlParams,$opts);// echo $ql->getHtml();
模擬登入
// 用post登入$ql = QueryList::post('http://xxxx.com/login',[ 'username' => 'admin', 'password' => '123456'])->get(' http://xxx.com/admin');//採集需要登入才能存取的頁面$ql->get('http://xxx.com/admin/page');//echo $ql->getHtml ();
Form表單操作
模擬登陸GitHub
// 取得QueryList實例$ql = QueryList::getInstance();//取得到登入表單$form = $ql->get('https://github.com/login')->find('form') ;//填入GitHub使用者名稱與密碼$form->find('input[name=login]')->val('your github username or email');$form->find('input[name=password]')->val('your github password');//序列化表單資料$fromData = $form->serializeArray();$postData = [];foreach ($fromData as $item) { $postData[$item['name']] = $item['value'];}//提交登入表單$actionUrl = 'https://github.com'.$form->attr('action');$ql->post($actionUrl,$postData) ;//判斷登入是否成功// echo $ql->getHtml();$userName = $ql->find('.header-nav-current-user>.css-truncate-target')->text();if($userName){ echo '登入成功!歡迎你:'.$userName;} else{ echo '登入失敗!';}
Bind功能擴充
自訂擴充一個myHttp方法:
$ql = QueryList::getInstance();//綁定一個myHttp方法到QueryList物件$ql->bind('myHttp',function ($url){ // $this 為目前的QueryList物件$html = file_get_contents( $url); $this->setHtml($html); return $this;});//然後就可以透過註冊的名字來呼叫$data = $ql->myHttp('https://toutiao.io')->find('h3 a')->texts();print_r($data->all());
或把實作體封裝到class,然後這樣綁定:
$ql->bind('myHttp',function ($url){ return new MyHttp($this,$url);});
插件使用
使用PhantomJS插件來擷取JavaScript動態渲染的頁面:
// 安裝時設定PhantomJS二進位檔案路徑$ql = QueryList::use(PhantomJs::class,'/usr/local/bin/phantomjs');// 擷取今日頭條手遊$data = $ql->browser( 'https://m.toutiao.com')->find('p')->texts();print_r($data->all());//使用HTTP代理程式$ql->browser('https://m.toutiao.com',false,['--proxy' => '192.168.1.42:8080', '--proxy-type' => 'http '])
使用CURL多執行緒外掛,多執行緒採集GitHub排行榜:
$ql = QueryList::use(CurlMulti::class);$ql->curlMulti([ 'https://github.com/trending/php', 'https://github.com/trending/go', / /.....more urls]) // 每個任務成功完成呼叫此回呼->success(function (QueryList $ql,CurlMulti $curl,$r){ echo "Current url:{$r['info']['url']} rn"; $data = $ql->find('h3 a')->texts(); print_r($data->all( ));}) // 每個任務失敗回呼->error(function ($errorInfo,CurlMulti $curl){ echo "Current url:{$errorInfo['info']['url']} rn"; print_r($errorInfo['error']);})->start([// 最大同時數'maxThread' => 10, // 錯誤重試次數'maxTry' => 3,] );
jae-jae/QueryList-PhantomJS: 使用PhantomJS擷取JavaScript動態渲染的頁面
jae-jae/QueryList-CurlMulti : Curl多執行緒採集
jae-jae/QueryList-AbsoluteUrl : 轉換URL相對路徑到絕對路徑
jae-jae/QueryList-Rule-Google : 谷歌搜尋引擎
jae-jae/QueryList-Rule-Baidu : 百度搜尋引擎