08-定时任务

一、什么是定时任务

  • 定时任务(计划任务),简单的说就是雇个免费钟点工,让他在特定时间去自动帮你完成某些你已经分配好了的任务

二、小皮面板

http://211.149.134.75:9080/A6E7E0


三、面板配置【选读】

1、环境

apache 要开启
php 要安装需要的版本

2、添加站点

添加站点,是为了让定时任务能请求到代码

3、添加任务


四、全自动任务

1、任务表

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 方法

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

百度抓取方法

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

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;

五、生成任务

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'].'&region=合肥&page_size=20&page_num=';
    insert('task_list',$data);
  }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

七色的天空

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值