Thinkphp5與QueryList實(shí)現(xiàn)采集頁(yè)面功能(爬蟲(chóng))

Thinkphp5與QueryList實(shí)現(xiàn)采集頁(yè)面功能(爬蟲(chóng))

querylist 是什么?

QueryList是一套用于內(nèi)容采集的PHP工具,它使用更加現(xiàn)代化的開(kāi)發(fā)思想,語(yǔ)法簡(jiǎn)潔、優(yōu)雅,可擴(kuò)展性強(qiáng)。相比傳統(tǒng)的使用晦澀的正則表達(dá)式來(lái)做采集,QueryList使用了更加強(qiáng)大而優(yōu)雅的CSS選擇器來(lái)做采集,大大降低了PHP做采集的門(mén)檻,同時(shí)也讓采集代碼易讀易維護(hù),讓你從此告別晦澀難懂且不易維護(hù)的正則表達(dá)式。

?

QueryList 提供的一整套內(nèi)容采集解決方案

●?DOM內(nèi)容選擇:CSS選擇器

立即學(xué)習(xí)PHP免費(fèi)學(xué)習(xí)筆記(深入)”;

●?HTTP客戶端:GuzzleHTTP

●?內(nèi)容過(guò)濾:CSS選擇器

●?解決亂碼:內(nèi)置多套亂碼解決方案

●?額外功能:豐富的擴(kuò)展插件

?

前提

項(xiàng)目主要用thinkphp5框架,主要會(huì)用到`QueryList.php`和`phpQuery.php`這兩個(gè)文件。我們可以切換到項(xiàng)目目錄,extend里新建QL,然后在QL目錄執(zhí)行composer命令安裝QueryList:

composer?require?jaeger/querylist

然后在需要使用的控制器中加入 use QLQueryList; 接下來(lái)就在控制器里編寫(xiě)代碼了,以下是一個(gè)實(shí)例

//需要采集的目標(biāo)頁(yè)面 $page?=?'http://cms.querylist.cc/news/566.html'; //采集規(guī)則 $reg?=?array( ???//采集文章標(biāo)題 ???'title'?=>?array('h1','text'), ???//采集文章發(fā)布日期,這里用到了QueryList的過(guò)濾功能,過(guò)濾掉span標(biāo)簽和a標(biāo)簽 ???'date'?=>?array('.pt_info','text','-span?-a',function($content){ ???????//用回調(diào)函數(shù)進(jìn)一步過(guò)濾出日期 ???????$arr?=?explode('?',$content); ???????return?$arr[0]; ???}), ???//采集文章正文內(nèi)容,利用過(guò)濾功能去掉文章中的超鏈接,但保留超鏈接的文字,并去掉版權(quán)、JS代碼等無(wú)用信息 ???'content'?=>?array('.post_content','html','a?-.content_copyright?-script',function($content){ ???????//利用回調(diào)函數(shù)下載文章中的圖片并替換圖片路徑為本地路徑 ???????//使用本例請(qǐng)確保當(dāng)前目錄下有image文件夾,并有寫(xiě)入權(quán)限 ???????//由于QueryList是基于phpQuery的,所以可以隨時(shí)隨地使用phpQuery,當(dāng)然在這里也可以使用正則或者其它方式達(dá)到同樣的目的  ???????$doc=phpQuery::newDocumentHTML($content); ???????$imgs?=?pq($doc)->find('img'); ???????foreach?($imgs?as?$img)?{ ???????????$src?=?'http://cms.querylist.cc'.pq($img)->attr('src'); ???????????$localSrc?=?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($page,$reg,$rang); $data?=?$ql->getData(); //打印結(jié)果 print_r($data);

?

?

注意:

在使用phpQuery類時(shí)需要在前面加上,因?yàn)閜hpQuery.php中沒(méi)有使用命名空間,因?yàn)槭褂妹臻g后,QueryList.php無(wú)法使用phpQuery類。

更多相關(guān)ThinkPHP知識(shí),請(qǐng)?jiān)L問(wèn)ThinkPHP教程

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊7 分享