采集神器,八爪鱼的自动抓取策略和入库操作!

冷暖自知 提交于 2020-08-13 13:01:46

采集一些很多防爬虫的网站,有个很好用的工具:八爪鱼...直接通过浏览器方式访问,一力破万法.

准备工作:money,花钱去八爪鱼官网买一个月或者更长时间的会员,这样你才能搞云采集

下面,自己去抓取数据,抓取完成后,设置定时云采集

然后你点击云采集,查看数据,就会有很多数据了,,下面是,如何把这些数据搞到本地,然后定时清空

上代码:

直接通过get_group_list获取你的分组id,然后把你需要的分组id,拿到下面get_task_list中去运行,获取所有任务列表,这样你就可以循环任务列表,获取里面的数据,运行完成后,执行api的清空操作,就完事儿了


class NewsData extends Frontend{



    //备注
    //八爪鱼接口文档
    //https://dataapi.bazhuayu.com/help#_ref_status_code


    public function ins_list()
    {
        $task_list=$this->get_task_list();
        if($task_list==false){
            echo "任务列表为空";
            die();
        }
        $NewsSource=new NewsSource();
        foreach ($task_list as $k=>$v){
            $task_id=$v['taskId'];//任务id
            //根据任务ID调用任务相关的数据详情
            echo "任务{$v['taskName']}:{$task_id}开始:    ";
            sleep(1);

            //循环获取数据
            $data=$this->get_task_data($task_id);
            $ins=[];
            if(empty($data)){
                echo "数据为空:跳过!      ";
                continue;
            }
            //循环插入数据
            foreach ($data as $k2=>$item){
                $ins=[
                    "cate_name"=>"新闻",
                    "search_name"=>$item['搜索关键词'],
                    "title"=>$item['最新文章标题'],
                    "keywords"=>"",
                    "description"=>"",
                    "thumb"=>"",
                    "content"=>'',
                    "create_time_text"=>$item['时间'],
                    "status"=>"1",
                    "oldurl"=>$item['最新文章链接'],
                    "author"=>$item['公众号名称'],
                    "author_avatar"=>$item['公总号头像'],
                    "author_wechat"=>$item['公众号微信号'],
                ];
                if(strlen($item['内容'])<10){
                    echo "内容为空,跳过!   ";
                    continue;
                }

                $ins['content']=$NewsSource->gz_str($item['内容']);

                //查询是否重复
                $has_id=Db::name("news_source")->where(["title"=>$ins['title']])->value("id");

                if(intval($has_id)!==0){

                    echo "重复ID:{$has_id},标题:{$ins['title']}--标题重复,跳过!   ";
                    continue;
                }

                //插入一条数据
                $ins_id=Db::name("news_source")->insertGetId($ins);
                echo "成功插入一条id:{$ins_id}    ";
                unset($ins);
            }
            unset($data);

            //清空任务数据
            $this->remove_task_data($task_id);
        }
        echo "执行结束!";
        die();
    }



    public $url="https://dataapi.bazhuayu.com";

    //获取token值
    public function get_token(){
        $token_name="bazhuayu_token";
        $token_data=Cache::get($token_name);
        //如果数据为空 或者 数据过期时间<当前时间(token过期)
        if($token_data==false||$token_data['expires_time']<time()){
            $url="https://dataapi.bazhuayu.com/token";
            $params=[
                "username"=>"xxxx",
                "password"=>"xxxx..",
                "grant_type"=>"password",
            ];
            $params=http_build_query($params);
            $token_json=$this->sendPost($url,$params);
            $token_data=json_decode($token_json,true);
            if(!isset($token_data['expires_in'])){
                echo $token_json;
                return false;
            }
            $token_data['expires_time']=$token_data['expires_in']+time();
            Cache::set($token_name,$token_data,$token_data['expires_in']);
            return $token_data;
        }
        if(!empty($token_data)){
            return $token_data;
        }else{
            return false;
        }


    }

    //获取header  封装token到header中
    public function get_header(){
        $token_data=$this->get_token();

        if($token_data==false){
            echo "token错误!";
            die();
        }else{
            $header=[
                "Authorization:".$token_data['token_type'].' '.$token_data["access_token"],
            ];
            return $header;
        }

    }


    //获取任务组 列表
    public function get_group_list(){
        $url="https://dataapi.bazhuayu.com/api/TaskGroup";
        $header=$this->get_header();
        $list=$this->sendGet($url,$header);
        $list=json_decode($list,true);
        var_dump($list);
    }

    //获取任务详情 列表
    public function get_task_list(){
        $group_id=2206006;//定义任务组id
        $url=$this->url."/api/Task?taskGroupId=".$group_id;

        $header=$this->get_header();
        $list=$this->sendGet($url,$header);
        $list=json_decode($list,true);
        $list=isset($list['data'])?$list['data']:false;


        return $list;
    }

    //获取任务的数据
    public function get_task_data($task_id=null)
    {
        //$task_id="0385e312-b674-4793-9435-xxxx";
        $offset=0;
        $size=200;
        //$url=$this->url."/api/alldata/GetDataOfTaskByOffset?taskId={$task_id}&offset={$offset}&size={$size}";
        $url=$this->url."/api/notexportdata/gettop?taskId={$task_id}&size={$size}";
        $header=$this->get_header();
        $data=$this->sendGet($url,$header);
        $data=json_decode($data,true);


        if(isset($data['data']['dataList'])&&!empty($data['data']['dataList'])){

            return $data['data']['dataList'];
        }else{
            return false;
        }
    }



    //清空任务的数据
    public function remove_task_data($task_id=null)
    {
        //$task_id="02be503d-4568-430b-9f15-c3511ad8e98b";
        $url=$this->url."/api/task/RemoveDataByTaskId?taskId=".$task_id;
        $header=$this->get_header();
        $json=$this->sendPOst($url,null,$header);
        var_dump($json);
        echo "任务ID{$task_id}数据销毁完成!";

    }
    


    /**
     * 发起请求
     * @param  string $url  请求地址
     * @param  string $data 请求数据包
     * @return   string      请求返回数据
     */
    public function sendPost($url,$data,$header=null)
    {
        $curl = curl_init(); // 启动一个CURL会话
        curl_setopt($curl, CURLOPT_URL, $url); // 要访问的地址
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); // 对认证证书来源的检测
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2); // 从证书中检查SSL加密算法是否存在
        if(!empty($header)){
            curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
            curl_setopt($curl, CURLOPT_HEADER, 0);//返回response头部信息
        }

        curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); // 使用自动跳转
        curl_setopt($curl, CURLOPT_AUTOREFERER, 1); // 自动设置Referer
        curl_setopt($curl, CURLOPT_POST, 1); // 发送一个常规的Post请求
        curl_setopt($curl, CURLOPT_POSTFIELDS, $data); // Post提交的数据包
        curl_setopt($curl, CURLOPT_TIMEOUT, 30); // 设置超时限制防止死循
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // 获取的信息以文件流的形式返回

        $return_data = curl_exec($curl); // 执行操作
        if (curl_errno($curl)) {
            echo 'Errno'.curl_error($curl);
        }
        curl_close($curl); // 关键CURL会话
        return $return_data; // 返回数据
    }



    public function sendGet($url,$header=null)
    {
        $curl = curl_init(); // 启动一个CURL会话
        curl_setopt($curl, CURLOPT_URL, $url); // 要访问的地址
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); // 对认证证书来源的检测
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2); // 从证书中检查SSL加密算法是否存在

        curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); // 使用自动跳转
        curl_setopt($curl, CURLOPT_AUTOREFERER, 1); // 自动设置Referer
        if(!empty($header)){
            curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
            curl_setopt($curl, CURLOPT_HEADER, 0);//返回response头部信息
        }

        curl_setopt($curl, CURLOPT_TIMEOUT, 20); // 设置超时限制防止死循
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // 获取的信息以文件流的形式返回

        $return_data = curl_exec($curl); // 执行操作
        if (curl_errno($curl)) {
            echo 'Errno'.curl_error($curl);
        }
        curl_close($curl); // 关键CURL会话
        return $return_data; // 返回数据
    }


}

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!