简单记录thinkphp5使用Querylist插件做采集
源碼地址:https://github.com/LeeToug/NewsGather
最近公司需要做一個(gè)信息發(fā)布網(wǎng)站,任務(wù)分配下來之后確定我來主導(dǎo)這個(gè)項(xiàng)目。由于之前做小說采集網(wǎng)站的時(shí)候多用的是CMS自帶的采集系統(tǒng),但是本人實(shí)在不怎么感冒cms,所以在網(wǎng)上查看了一些資料,很神奇的找到了Querylist這個(gè)東西,今天就將我昨晚這次項(xiàng)目的里程分享一下。
首先,querylist官網(wǎng)(http://www.querylist.cc),直接點(diǎn)擊文檔走起。
大概看了一下,可以滿足我的需求。okay,thinkphp5框架搭起來,使用composer安裝querylist,安裝之后本地出現(xiàn)gaegar文件夾,進(jìn)去之后就會(huì)看到querylist了。至此,完成了安裝的步驟啦,就是這么簡單!!!
接下來就是使用Querylist類啦,一步一步來走:
首先引入類
use QL\QueryList;然后重點(diǎn)
$html = "http://www.***.com";//選擇大的區(qū)域$selector = "body";//獲取當(dāng)前所選區(qū)域html$content=QueryList::get($html)->find($selector)->html();//最外層規(guī)則篩選$rules = array('plist' => ['dt','html']);//獲取分類數(shù)據(jù)、處理/采集數(shù)據(jù)$data = $this->dealData($content,$rules);$html是你要采集的目標(biāo)站點(diǎn),$content是獲取到的html頁面源碼,$rules是即將要用的篩選規(guī)則。主要看一下處理數(shù)據(jù)的方法dealData();
public function dealData($content,$rules){$data = QueryList::html($content)->rules($rules)->range('')->queryData(function ($item){$item = QueryList::html($item)->rules(array('title' => array('a','text'),'original_link' =>array('a','href')))->range('')->queryData();return $item;});return $data;}該方法中由于我要采集的目標(biāo)站需要兩層進(jìn)去,所以又寫了一次內(nèi)部回調(diào)。將之前獲取到的頁面源碼$content放入html()方法中去,使用rules()方法匹配dt標(biāo)簽中的html源碼,range()方法是分片的,我這里沒有用到,就留空,但是這個(gè)方法一定要寫在這兒。在回調(diào)中,將之前獲取到的html源碼定在在$item中,然后進(jìn)行二次rule規(guī)則篩選,將原站中的標(biāo)題與鏈接采集到,此時(shí)的$item中就已經(jīng)保存了我們想要的數(shù)據(jù)了,然后我們就可以將數(shù)據(jù)存庫或是做其他處理了。
至此,一次簡單的采集就完成了。
后附多線程采集的源碼,原理與上面一樣,需要注意的是,多線程采集時(shí),需要引入對應(yīng)的類,看下,如果大家有需要的話,我會(huì)再寫一篇關(guān)于querylist多線程采集的文章。
use QL\QueryList; use QL\Ext\CurlMulti; use think\Db;class Gather extends Admin {/*** @throws \think\db\exception\DataNotFoundException* @throws \think\db\exception\ModelNotFoundException* @throws \think\exception\DbException* 采集文章信息* @author lyf* @date 2019-5-10*/public function index(){$param=$this->request->get();$ql = QueryList::getInstance();$ql->use(CurlMulti::class);$htmls = array();$map['status'] = 0;$html = Db::name('city_cate_url')->where($map)->order("id","ASC")->limit("0","10")->select();foreach ($html as $item){$url = explode('/',$item['url']);$link = explode('.',$url[3]);$htmls[] = $url[0].'//'.$url[2].'/'.$link[0].'P'.$item['page'].'.'.$link[1];}$data = $this->gather($htmls,$ql);$ids=array_column($html,"id");$res_list=db("city_cate_url")->where("id","in",$ids)->where('status','-1')->select();$k=0;if($htmls){$k++;if($res_list){$this->success("正在采集第{$k}次","gather/index","",60);}else{$this->success("正在采集第{$k}次","gather/index","",30);}}else{$this->success("采集成功");}}/*** @param $html* @param $city_name* @param $cate_name* @param $num* @return string* 采集列表信息* @author lyf* @date 2019-5-8*/public function gather($html,$ql){$ql->curlMulti($html)->success(function (QueryList $ql,CurlMulti $curl,$r){ // echo $r['info']['url'];echo "<br>";//初始化$content1 = '';$content2 = '';//獲取城市ID$city = explode('/',$r['info']['url']);$cityId = $this->getCityId($city[0].'//'.$city[2].'/');$msg = '';$selector1 = "#main";$selector2 = "tbody";try{$content1=$ql->get($r['info']['url'])->find($selector1)->html();$content2=$ql->get($r['info']['url'])->find($selector2)->html();}catch(\Exception $e) {}$rules = ['title' => ['.t>div>a','title'],'original_link' => ['.t>div>a','href'],'img' => ['.i>a>img','src'],'brief' => ['.t>div','html','-#wrapv1'],'price' => ['.p','text'],'date' => ['.u','text']];if($content1&&$content2){//處理數(shù)據(jù)信息$data = $this->dealData($content2,$rules,$ql,$cityId,$r['info']['url']);//數(shù)據(jù)入庫if($data){$res = $this->saveData($data,$r['info']['url']);}}else if($content1&&!$content2){$this->endNow($r['info']['url'],$status='1');}else{$this->endNow($r['info']['url'],$staus='-1');}$ql->destruct();})->start([// 最大并發(fā)數(shù),這個(gè)值可以運(yùn)行中動(dòng)態(tài)改變。'maxThread' => 10,// 觸發(fā)curl錯(cuò)誤或用戶錯(cuò)誤之前最大重試次數(shù),超過次數(shù)$error指定的回調(diào)會(huì)被調(diào)用。'maxTry' => 3,// 全局CURLOPT_*'opt' => [CURLOPT_TIMEOUT => 10,CURLOPT_CONNECTTIMEOUT => 1,CURLOPT_RETURNTRANSFER => true]]);}源碼地址:git:https://github.com/LeeToug/NewsGather
第一次在這邊發(fā)博客,大家有什么不滿意的地方,可以隨時(shí)指正,也希望大家多多包涵。有問題隨時(shí)可以私我,看到的話一定會(huì)回復(fù)噠
總結(jié)
以上是生活随笔為你收集整理的简单记录thinkphp5使用Querylist插件做采集的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: matlab 连接数组,1、Matlab
- 下一篇: PMAC简介和预备知识