日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

简单记录thinkphp5使用Querylist插件做采集

發布時間:2023/12/29 php 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 简单记录thinkphp5使用Querylist插件做采集 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

源碼地址:https://github.com/LeeToug/NewsGather

最近公司需要做一個信息發布網站,任務分配下來之后確定我來主導這個項目。由于之前做小說采集網站的時候多用的是CMS自帶的采集系統,但是本人實在不怎么感冒cms,所以在網上查看了一些資料,很神奇的找到了Querylist這個東西,今天就將我昨晚這次項目的里程分享一下。

首先,querylist官網(http://www.querylist.cc),直接點擊文檔走起。

大概看了一下,可以滿足我的需求。okay,thinkphp5框架搭起來,使用composer安裝querylist,安裝之后本地出現gaegar文件夾,進去之后就會看到querylist了。至此,完成了安裝的步驟啦,就是這么簡單!!!

接下來就是使用Querylist類啦,一步一步來走:

首先引入類

use QL\QueryList;

然后重點

$html = "http://www.***.com";//選擇大的區域$selector = "body";//獲取當前所選區域html$content=QueryList::get($html)->find($selector)->html();//最外層規則篩選$rules = array('plist' => ['dt','html']);//獲取分類數據、處理/采集數據$data = $this->dealData($content,$rules);

$html是你要采集的目標站點,$content是獲取到的html頁面源碼,$rules是即將要用的篩選規則。主要看一下處理數據的方法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;}

該方法中由于我要采集的目標站需要兩層進去,所以又寫了一次內部回調。將之前獲取到的頁面源碼$content放入html()方法中去,使用rules()方法匹配dt標簽中的html源碼,range()方法是分片的,我這里沒有用到,就留空,但是這個方法一定要寫在這兒。在回調中,將之前獲取到的html源碼定在在$item中,然后進行二次rule規則篩選,將原站中的標題與鏈接采集到,此時的$item中就已經保存了我們想要的數據了,然后我們就可以將數據存庫或是做其他處理了。

至此,一次簡單的采集就完成了。

后附多線程采集的源碼,原理與上面一樣,需要注意的是,多線程采集時,需要引入對應的類,看下,如果大家有需要的話,我會再寫一篇關于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){//處理數據信息$data = $this->dealData($content2,$rules,$ql,$cityId,$r['info']['url']);//數據入庫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([// 最大并發數,這個值可以運行中動態改變。'maxThread' => 10,// 觸發curl錯誤或用戶錯誤之前最大重試次數,超過次數$error指定的回調會被調用。'maxTry' => 3,// 全局CURLOPT_*'opt' => [CURLOPT_TIMEOUT => 10,CURLOPT_CONNECTTIMEOUT => 1,CURLOPT_RETURNTRANSFER => true]]);}

源碼地址:git:https://github.com/LeeToug/NewsGather

第一次在這邊發博客,大家有什么不滿意的地方,可以隨時指正,也希望大家多多包涵。有問題隨時可以私我,看到的話一定會回復噠

總結

以上是生活随笔為你收集整理的简单记录thinkphp5使用Querylist插件做采集的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。