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);

 

posted @ 2020-12-28 23:45  Conqueror·  阅读(273)  评论(0编辑  收藏  举报