Loading... 定时任务 一、什么是定时任务 定时任务(计划任务),简单的说就是雇个免费钟点工,让他在特定时间去自动帮你完成某些你已经分配好了的任务 二、小皮面板 http://211.149.134.75:9080/A6E7E0 linux linux linux 三、面板配置【选读】 1、环境 apache 要开启 php 要安装需要的版本 linux 2、添加站点 添加站点,是为了让定时任务能请求到代码 linux 3、添加任务 linux 四、全自动任务 1、任务表 ```mysql CREATE TABLE `task_list` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', `url` varchar(200) NOT NULL COMMENT '抓取网址', `num` int(10) unsigned NOT NULL DEFAULT '1' COMMENT '数量', `status` tinyint(1) unsigned NOT NULL DEFAULT '1' COMMENT '状态 1未完成 2已完成', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; ``` 2、代码改为方法 curl 方法 ```php function curl($url,$is_post=0,$data=[]){ if(empty($url)){ return false; } $ch = curl_init(); // 创建一个新cURL资源 curl_setopt($ch, CURLOPT_URL, $url); // 设置URL curl_setopt($ch, CURLOPT_TIMEOUT, 30); // 设置超时限制防止死循环 curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);// 爬取重定向页面 curl_setopt($ch, CURLOPT_AUTOREFERER, 1); // 自动设置Referer,防止盗链 curl_setopt($ch, CURLOPT_HEADER, 0); // 显示返回的Header区域内容 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);// 要求结果保存到字符串中还是输出到屏幕上 curl_setopt($ch, CURLOPT_USERAGENT, 'Data');// 在HTTP请求中包含一个"User-Agent: "头的字符串。 if($is_post == 1){ curl_setopt($ch, CURLOPT_POST, 1); // 发送一个常规的Post请求 curl_setopt($ch, CURLOPT_POSTFIELDS, $data);// Post提交的数据包 } $html = curl_exec($ch); // 运行cURL,请求URL,把结果复制给变量 if(curl_errno($ch)){ echo 'Errno'.curl_error($curl); // 捕抓异常 } curl_close($ch); // 关闭cURL连接 return json_decode($html,true); } ``` 百度抓取方法 ```php function baidu($data){ $msg = ''; if(!empty($data)){ foreach ($data as $k => $v) { # 判断经纬度是否存在 $find = find('baidu_shop','*',['lng'=>$v['location']['lng'],'lat'=>$v['location']['lat']]); if($find){ $msg .= '<span style="color:grey;">'.$v['name'].'已存在,ID为:'.$find['id'].'</span><br/>'; continue; } $tag = explode(';',$v['detail_info']['tag']); $cat_one = find('baidu_cat','*',['name'=>$tag[0]]); $cat_two = find('baidu_cat','*',['name'=>$tag[1]]); $data = [ 'name' => $v['name'], 'province' => $v['province'], 'city' => $v['city'], 'area' => $v['area'], 'address' => $v['address'], 'telephone' => $v['telephone'], 'tag' => $v['detail_info']['tag'], 'detail_url' => $v['detail_info']['detail_url'], 'lng' => $v['location']['lng'], 'lat' => $v['location']['lat'], 'cat_one' => isset($cat_one['id'])?$cat_one['id']:0, 'cat_two' => isset($cat_two['id'])?$cat_two['id']:0 ]; $id = insertId('baidu_shop',$data); if($id){ $msg .= '<span style="color:green;">'.$v['name'].'添加成功,ID为:'.$id.'</span><br/>'; }else{ $msg .= '<span style="color:red;">'.$v['name'].'添加失败</span><br/>'; } } } return $msg; } ``` 3、自动抓取任务 auto.php ```php header("Content-Type:text/html;charset=utf8"); # 载入公用pdo文件 require 'pdo.php'; # 条件 $where = [ 'status' => 1 ]; # 查询任务数据表 $find = find('task_list','*',$where); if(empty($find)){ echo '没有任务了'; return false; } # 组装url $url = $find['url'].$find['num']; # 请求url,获取数据 $curl = curl($url); # 总页数 $page = ceil($curl['total']/10); if($find['num'] <= $page){ $ret = baidu($curl['results']); if(empty($ret)){ $data = [ 'status' => 2 ]; }else{ $data = [ 'num' => $find['num']+1 ]; } }else{ $data = [ 'status' => 2 ]; } update('task_list',$data,'id='.$find['id']); echo $ret; return false; ``` 五、生成任务 ```php header("Content-Type:text/html;charset=utf8"); # 载入公用pdo文件 require 'pdo.php'; # 查询全部分类 $cat = select('baidu_cat','*'); $tmp = []; # 整理分类的分层 foreach($cat as $cat_v){ if($cat_v['pid'] == 0){ $tmp[$cat_v['id']] = $cat_v; }else{ $tmp[$cat_v['pid']]['son'][] = $cat_v; } } $url = []; # 循环生成url,并插入到任务数据表 foreach($tmp as $tmp_v){ foreach($tmp_v['son'] as $tmp_v_v){ $data['url'] = 'http://api.map.baidu.com/place/v2/search?ak=1PQvdVNrRaLeCbkVB9VbZoQ9RyGFy7Kq&scope=2&output=json&query='.$tmp_v['name'].$tmp_v_v['name'].'®ion=合肥&page_size=20&page_num='; insert('task_list',$data); } } ``` Last modification:January 16, 2023 © Allow specification reprint Like 如果觉得我的文章对你有用,请随意赞赏