QueryList 簡(jiǎn)介
QueryList是一套簡(jiǎn)潔、優(yōu)雅、可擴(kuò)展的PHP采集工具(爬蟲),基于phpQuery。
特性擁有與jQuery完全相同的CSS3 DOM選擇器
擁有與jQuery完全相同的DOM操作API
擁有通用的列表采集方案
擁有強(qiáng)大的HTTP請(qǐng)求套件,輕松實(shí)現(xiàn)如:模擬登陸、偽造瀏覽器、HTTP代理等意復(fù)雜的網(wǎng)絡(luò)請(qǐng)求
擁有亂碼解決方案
擁有強(qiáng)大的內(nèi)容過濾功能,可使用jQuey選擇器來過濾內(nèi)容
擁有高度的模塊化設(shè)計(jì),擴(kuò)展性強(qiáng)
擁有富有表現(xiàn)力的API
擁有高質(zhì)量文檔
擁有豐富的插件
擁有專業(yè)的問答社區(qū)和交流群
通過插件可以輕松實(shí)現(xiàn)諸如:
多線程采集
圖片本地化
模擬瀏覽器行為,如:提交Form表單
網(wǎng)絡(luò)爬蟲
.....
環(huán)境要求PHP >= 7.0
安裝如果你的PHP版本還停留在PHP5,或者不會(huì)使用Composer,你可以選擇使用QueryList3,QueryList3支持php5.3以及手動(dòng)安裝。 QueryList3 文檔:http://v3.querylist.cc
通過Composer安裝:
composer require jaeger/querylist使用 元素操作
采集「昵圖網(wǎng)」所有圖片地址
QueryList::get("http://www.nipic.com")->find("img")->attrs("src");
采集百度搜索結(jié)果
$ql = QueryList::get("http://www.baidu.com/s?wd=QueryList"); $ql->find("title")->text(); // 獲取網(wǎng)站標(biāo)題 $ql->find("meta[name=keywords]")->content; // 獲取網(wǎng)站頭部關(guān)鍵詞 $ql->find("h3>a")->texts(); //獲取搜索結(jié)果標(biāo)題列表 $ql->find("h3>a")->attrs("href"); //獲取搜索結(jié)果鏈接列表 $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("列表采集追加內(nèi)容")->find("div")->htmls(); $ql->find(".two")->children("img")->attrs("alt"); //獲取class為two元素下的所有img孩子節(jié)點(diǎn) //遍歷class為two元素下的所有孩子節(jié)點(diǎn) $data = $ql->find(".two")->children()->map(function ($item){ //用is判斷節(jié)點(diǎn)類型 if($item->is("a")){ return $item->text(); }elseif($item->is("img")) { return $item->alt; } }); $ql->find("a")->attr("href", "newVal")->removeClass("className")->html("newHtml")->... $ql->find("div > p")->add("div > ul")->filter(":has(a)")->find("p:first")->nextAll()->andSelf()->... $ql->find("div.old")->replaceWith( $ql->find("div.new")->clone())->appendTo(".trash")->prepend("Deleted")->...
采集百度搜索結(jié)果列表的標(biāo)題和鏈接:
$data = QueryList::get("http://www.baidu.com/s?wd=QueryList") // 設(shè)置采集規(guī)則 ->rules([ "title"=>array("h3","text"), "link"=>array("h3>a","href") ]) ->query()->getData(); print_r($data->all());
采集結(jié)果:
Array ( [0] => Array ( [title] => QueryList|基于phpQuery的無比強(qiáng)大的PHP采集工具 [link] => http://www.baidu.com/link?url=GU_YbDT2IHk4ns1tjG2I8_vjmH0SCJEAPuuZN ) [1] => Array ( [title] => PHP 用QueryList抓取網(wǎng)頁內(nèi)容 - wb145230 - 博客園 [link] => http://www.baidu.com/link?url=zn0DXBnrvIF2ibRVW34KcRVFG1_bCdZvqvwIhUqiXaS ) [2] => Array ( [title] => 介紹- QueryList指導(dǎo)文檔 [link] => http://www.baidu.com/link?url=pSypvMovqS4v2sWeQo5fDBJ4EoYhXYi0Lxx ) //... )編碼轉(zhuǎn)換
// 輸出編碼:UTF-8,輸入編碼:GB2312 QueryList::get("https://top.etao.com")->encoding("UTF-8","GB2312")->find("a")->texts(); // 輸出編碼:UTF-8,輸入編碼:自動(dòng)識(shí)別 QueryList::get("https://top.etao.com")->encoding("UTF-8")->find("a")->texts();HTTP網(wǎng)絡(luò)操作
攜帶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(); //輸出: 我的首頁 微博-隨時(shí)隨地發(fā)現(xiàn)新鮮事
使用Http代理
$urlParams = ["param1" => "testvalue","params2" => "somevalue"]; $opts = [ // 設(shè)置http代理 "proxy" => "http://222.141.11.17:8118", //設(shè)置超時(shí)時(shí)間,單位:秒 "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實(shí)例 $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"); //序列化表單數(shù)據(jù) $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功能擴(kuò)展
自定義擴(kuò)展一個(gè)myHttp方法:
$ql = QueryList::getInstance(); //綁定一個(gè)myHttp方法到QueryList對(duì)象 $ql->bind("myHttp",function ($url){ $html = file_get_contents($url); $this->setHtml($html); return $this; }); //然后就可以通過注冊(cè)的名字來調(diào)用 $data = $ql->myHttp("https://toutiao.io")->find("h3 a")->texts(); print_r($data->all());
或者把實(shí)現(xiàn)體封裝到class,然后這樣綁定:
$ql->bind("myHttp",function ($url){ return new MyHttp($this,$url); });插件使用
使用CURL多線程插件,多線程采集GitHub排行榜:
$ql = QueryList::use(CurlMulti::class); $ql->curlMulti([ "https://github.com/trending/php", "https://github.com/trending/go", //.....more urls ]) // 每個(gè)任務(wù)成功完成調(diào)用此回調(diào) ->success(function (QueryList $ql,CurlMulti $curl,$r){ echo "Current url:{$r["info"]["url"]} "; $data = $ql->find("h3 a")->texts(); print_r($data->all()); }) // 每個(gè)任務(wù)失敗回調(diào) ->error(function ($errorInfo,CurlMulti $curl){ echo "Current url:{$errorInfo["info"]["url"]} "; print_r($errorInfo["error"]); }) ->start([ // 最大并發(fā)數(shù) "maxThread" => 10, // 錯(cuò)誤重試次數(shù) "maxTry" => 3, ]);
GitHub:https://github.com/jae-jae/QueryList 歡迎Star!
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/25950.html
摘要:更多參考自動(dòng)加載機(jī)制命名空間命名沖突在團(tuán)隊(duì)協(xié)作引入第三方依賴代碼時(shí),往往可能會(huì)出現(xiàn)類函數(shù)和接口重名的情況。多個(gè)有同名函數(shù)時(shí),引入將發(fā)生命名沖突,使用來指明使用哪個(gè)的函數(shù)。 原文:wuYin/blog,轉(zhuǎn)載注明來源即可。 前言 Laravel 框架因?yàn)槠浣M件化的設(shè)計(jì)并恰當(dāng)使用設(shè)計(jì)模式,使得框架本身簡(jiǎn)潔易擴(kuò)展。區(qū)別于 ThinkPHP 那種整合式功能的框架(功能要么全用要么全不用),Lar...
PHP 函數(shù)的 JavaScript 實(shí)現(xiàn) module.exports = function array_sum (array) { // eslint-disable-line camelcase // discuss at: http://locutus.io/php/array_sum/ // original by: Kevin van Zonneveld (http://kv...
摘要:采集目標(biāo)微信文章頁標(biāo)題內(nèi)容發(fā)布時(shí)間作者等信息。安裝微信采集代碼采集規(guī)則可以很輕松的就寫出采集代碼出來,來看看運(yùn)行結(jié)果和預(yù)期一樣正確采集到了內(nèi)容,但是內(nèi)容亂碼了。 采集目標(biāo) 微信文章頁標(biāo)題、內(nèi)容、發(fā)布時(shí)間、作者等信息。 采集示例URL https://mp.weixin.qq.com/s?src=11×tamp=1523173327&ver=803&signature=6PCx...
摘要:查找保存下載用搭建自己的緩存?zhèn)}庫權(quán)限管理的好選擇基于封裝的后臺(tái)管理系統(tǒng),支持手機(jī)和端訪問支付寶風(fēng)格的驗(yàn)證器后臺(tái)系統(tǒng)微信接口的部署腳本開發(fā)的博客系統(tǒng)百度推送自動(dòng)記錄用戶行為擴(kuò)展一個(gè)項(xiàng)目管理系統(tǒng)根據(jù)生成對(duì)應(yīng)導(dǎo)航的狀態(tài) 1.debug https://github.com/barryvdh/l... showImg(https://segmentfault.com/img/bVmhWL); ...
摘要:使用的方式來做采集,擁有豐富的插件。下面來演示使用插件抓取動(dòng)態(tài)創(chuàng)建的頁面內(nèi)容。插件使用瀏覽器打開連接使用以采集今日頭條手機(jī)版為例,今日頭條手機(jī)版基于框架,內(nèi)容是純動(dòng)態(tài)渲染出來的。 QueryList使用jQuery的方式來做采集,擁有豐富的插件。 下面來演示QueryList使用PhantomJS插件抓取JS動(dòng)態(tài)創(chuàng)建的頁面內(nèi)容。 安裝 使用Composer安裝: 安裝QueryList...
閱讀 1967·2021-11-23 09:51
閱讀 879·2021-11-19 09:40
閱讀 832·2021-10-27 14:20
閱讀 5018·2021-10-09 09:52
閱讀 3302·2021-10-09 09:44
閱讀 1732·2021-10-08 10:05
閱讀 5084·2021-09-09 11:47
閱讀 3483·2019-08-30 12:47