querylist采集 爬虫
一、安装
通过Composer安装:
composer require jaeger/querylist
官方参考文档:https://querylist.cc/docs/guide/v3/installation
二、本次主要运用下载到本地的querylist包来进行诠释
1.将querylist包解压到本地,放在本地框架的pubilc文件夹下(phpQuery.php Querylist.php 两个主要文件)
2.创建控制器,并在控制器中引入querylist的命名空间
3.控制器代码
public function index()
{
//引入采集文件
require "QueryList/QueryList.php";
require "QueryList/phpQuery.php";
//设置采集的地址
$url="https://www.17k.com/";
//设置采集规则
$rules = array(
//采集id为one这个元素里面的纯文本内容
'title' => array('dd>h3>a','text'),
//采集class为two下面的超链接的链接
'content' => array('dd>.info>a','text'),
//采集class为two下面的第二张图片的链接
'img' => array('dd>a>img','src'),
//采集span标签中的HTML内容
'anthor' => array('dd>.author>a','text')
);
//采集数据
$data=@ QueryList::Query($url,$rules)->data;
//未采集到数据处理
foreach ($data as $k=>$v){
$data[$k]['title']=empty($v['title'])?'未采集到数据':$v['title'];
$data[$k]['content']=empty($v['content'])?'未采集到数据':$v['content'];
$data[$k]['img']=empty($v['img'])?'未采集到数据':$v['img'];
$data[$k]['anthor']=empty($v['anthor'])?'未采集到数据':$v['anthor'];
}
//将线上图片保存到本地文件夹中
foreach ($data as $k=>$v){
$img=file_get_contents($v['img']);
$fileimg='uploads/'.time().rand(1,999).substr($v['img'],strrpos($v['img'],"."));
file_put_contents($fileimg,$img);
$data[$k]['img']=$fileimg;
}
//添加入库
model('Book')->insertAll($data);
$data=Book::paginate(5);
if ($data){
return view('lists',['data'=>$data]);
}else{
return "<script>alert('添加失败')</script>";
}
或者 tp 中
1 <?php 2 3 namespace app\art\controller; 4 5 use app\art\model\User; 6 use think\Controller; 7 use think\Request; 8 use QL\QueryList; 9 class Article extends Controller 10 { 11 /** 12 * 显示资源列表 13 * 14 * @return \think\Response 15 */ 16 public function index() 17 { 18 // 19 require "QueryList/QueryList.php"; 20 require "QueryList/phpQuery.php"; 21 //设置采集地址 22 $url = 'https://www.cnbeta.com/'; 23 24 // 采集规则 25 $rules = [ 26 // 文章标题 27 'title' => ['.item>dl>dt>a','text'], 28 // 文章简介 29 'content' => ['.item>dl>dd>p','text'], 30 // 图片 31 'img' => ['.item>dl>a>img','src'], 32 // 浏览量 33 'browse' => ['.item>.meta-data>.status>li:nth-child(1)','text'] 34 ]; 35 $data = @QueryList::Query($url,$rules)->data; 36 //处理未采集到的数据 37 foreach ($data as $k=>$v){ 38 $data[$k]['title']=empty($v['title'])?"未采集到数据":$v['title']; 39 $data[$k]['content']=empty($v['content'])?"未采集到数据":$v['content']; 40 $data[$k]['img']=empty($v['img'])?"未采集到数据":$v['img']; 41 $data[$k]['browse']=empty($v['browse'])?"未采集到数据":$v['browse']; 42 } 43 //将图片保存到本地 44 foreach ($data as $k=>$v){ 45 $img=file_get_contents($v['img']); 46 $fileimg='upload/'.time().rand(1,999)."."."jpg"; 47 file_put_contents($fileimg,$img); 48 $data[$k]['img']=$fileimg; 49 } 50 //数据保存入库 51 // model('Article')->insertAll($data); 52 if (model('Article')->insertAll($data)){ 53 $data=\app\art\model\Article::select(); 54 return json(['code'=>200,'msg'=>'success','data'=>$data]); 55 }else{ 56 return json(['code'=>200,'msg'=>'success','data'=>""]); 57 } 58 59 }
4.剩下的就保存入库就可以了,tp框架中数组入库运用 insertAll laravel框架见上图
二:原生方法采集 多页采集
<?php
//引入 require_once "./phpQuery.php"; require_once "./QueryList.php"; use QL\QueryList; //多页面采集 单页可不写循环与rang $rang=range(1,3); foreach ($rang as $value){ $url="https://采集地址".$value."/"; //追加到数组中形成一个二维数组 采集规则 $data = @QueryList::Query($url,[ // 文章封面 'pic' => ['.lj-lazy','data-original','',function($item){ //得到扩展名 $ext=pathinfo($item,PATHINFO_EXTENSION); //生成文件名 $filename=rand(1,9999).time().'.'.$ext; //生成本地路径 $filepath=dirname(__DIR__).'/public/uploads/article/'.$filename; file_put_contents($filepath,file_get_contents($item)); return '/uploads/article/'.$filename; }], // 文章标题 'title' => ['.text>.LOGCLICK','text'], 'url' => ['.text>.LOGCLICK','href'], // 文章简介 'desn' => ['.summary','text'], ])->data; //入库保存数据 使用pdo $dbms='mysql'; //数据库类型 $host='localhost'; //数据库主机名 $dbName='数据库名'; //使用的数据库 $user='root'; //数据库连接用户名 $pass='root'; //对应的密码 $dsn="$dbms:host=$host;dbname=$dbName"; $pdo = new PDO($dsn, $user, $pass); //初始化一个PDO对象 foreach ($data as $val){ //书写SQL语句 $sql="insert into articles (title,pic,url,desn,body) values (?,?,?,?,?)"; //预处理 $stmt=$pdo->prepare($sql); //插入数据 $stmt->execute([$val['title'],$val['pic'],$val['url'],$val['desn'],'']); } } //可以低得到采集到的数据 print_r($data);