PHP 结合前端 ajax 爬取网站信息后, 向指定用户发送指定短信;


<?php
/**
 * Description
 * @authors Your Name ([email protected])
 * # 根据时时彩的最新一期的号码, 判断如果为首尾同号则发送短信
 *  - phpQuery 分析网页, 获得网页数据, 获得html数据
 *  - curl_init 模拟真实浏览器访问, 配合 PHPquery
 *  - 根据手机号, 结合前端 get与post 请求发送短信通知
 *  - 使用的 php 的正则, 替换字符串
 *  - 使用 sleep 与 while 反复执行代码
 *  - 反复执行代码的同时, 还可以在浏览器输出
 * # 只有刷新 wamp 才能终止进程`
 * # 实际在云服务中会报错: FastCGI 进程超过了配置的活动超时时限的解决方法
 *  - 无解
 *  - 所以只能在本机使用wamp开启
 * @date    2018-07-26 17:13:39
 * @version 1.0.0
 */

header("Content-Type: text/html;charset=utf-8");
require('phpQuery/phpQuery.php');
// $eg1=phpQuery::newDocumentFile("http://www.whu.edu.cn/tzgg.htm");
// $eg2=phpQuery::newDocumentFile("https://www.baidu.com/");
// $eg3=phpQuery::newDocumentFile("http://caipiao.163.com/award/cqssc/");
// echo pq("title",$eg1->getDocumentID())->html()."<br>";//$eg1与$eg1->getDocumentID()效果等同
// echo pq("title")->html()."<br>";//就近匹配 $eg2
// phpQuery::selectDocument($eg1); //默认会使用选定的文档
// $mes=pq("ul")->html();//获取所有的ul标签中的html内容
// $mes=pq("ul,li")->html();//获取所有的ul以及li标签中的html内容
// $t=pq("ul[class='article']")->html();//获取ul class="article"的html内容

/***
 * 根据 手机号, 第几期, 当期号码 发送短信通知
 */
function fnSendMessageNotifications($mobile, $lotteryNumber1, $lotteryNumber2)
{
  echo '<br>****[' . $mobile . ']****<br>' ;
  echo '<br>****[' . $lotteryNumber1 . ']****<br>' ;
  echo '<br>****[' . $lotteryNumber2 . ']****<br>' ;
  $host = "http://cowsms.market.alicloudapi.com";
  $path = "/intf/smsapi";
  $method = "GET";
  $appcode = "你的appcode";
  $headers = array();
  array_push($headers, "Authorization:APPCODE " . $appcode);
  $querys = "mobile=" . $mobile . "&paras=" . $lotteryNumber1 . "%2C" . $lotteryNumber2 . "&sign=%E6%B6%88%E6%81%AF%E9%80%9A&tpid=155";
  echo '<br>****[' . $querys . ']****<br>' ;
  $bodys = "";
  $url = $host . $path . "?" . $querys;

  $curl = curl_init();
  curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);
  curl_setopt($curl, CURLOPT_URL, $url);
  curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
  curl_setopt($curl, CURLOPT_FAILONERROR, false);
  curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($curl, CURLOPT_HEADER, true);
  if (1 == strpos("$".$host, "https://"))
  {
      curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
      curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
  }
  var_dump(curl_exec($curl));
}

/**
 * 添加 USERAGENT , 模拟真实浏览器访问
 * */
function get_fcontent($url,  $timeout = 5 ) {
  $url = str_replace( "&", "&", urldecode(trim($url)) );
  $cookie = tempnam ("/tmp", "CURLCOOKIE");
  $ch = curl_init();
  curl_setopt( $ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; rv:1.7.3) Gecko/20041001 Firefox/0.10.1" );
  curl_setopt( $ch, CURLOPT_URL, $url);//需要获取的URL地址,也可以在 curl_init()函数中设置。
  curl_setopt( $ch, CURLOPT_COOKIEJAR, $cookie );//连接结束后保存cookie信息的文件。
  curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, true );//启用时会将服务器服务器返回的"Location: "放在header中递归的返回给服务器,使用CURLOPT_MAXREDIRS可以限定递归返回的数量。
  curl_setopt( $ch, CURLOPT_ENCODING, "" );//HTTP请求头中"Accept-Encoding: "的值。支持的编码有"identity","deflate"和"gzip"。如果为空字符串"",请求头会发送所有支持的编码类型。在cURL 7.10中被加入。
  curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );//将 curl_exec()获取的信息以文件流的形式返回,而不是直接输出。
  curl_setopt( $ch, CURLOPT_AUTOREFERER, true );//当根据Location:重定向时,自动设置header中的Referer:信息。
  //禁用后cURL将终止从服务端进行验证。使用CURLOPT_CAINFO选项设置证书使用CURLOPT_CAPATH选项设置证书目录 如果CURLOPT_SSL_VERIFYPEER(默认值为2)被启用,CURLOPT_SSL_VERIFYHOST需要被设置成TRUE否则设置为FALSE。自cURL 7.10开始默认为TRUE。从cURL 7.10开始默认绑定安装。
  curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, false );   //  # required for https urls, 在发起连接前等待的时间,如果设置为0,则无限等待。
  curl_setopt( $ch, CURLOPT_CONNECTTIMEOUT, $timeout );
  curl_setopt( $ch, CURLOPT_TIMEOUT, $timeout ); // 设置cURL允许执行的最长秒数。
  curl_setopt( $ch, CURLOPT_MAXREDIRS, 10 ); //指定最多的HTTP重定向的数量,这个选项是和CURLOPT_FOLLOWLOCATION一起使用的。
  $content = curl_exec( $ch );
  curl_close ( $ch );
  return $content;
}

// set_time_limit(0); // Maximum execution time , 设置成0的话,就是永不过期。
$lastQi = '';  // foreach保存的最后一个 期号
$lastNumber = ''; // foreach保存的最后一个 号码
$nTheLastTraversalPeriod = ''; // 缓存上一个foreach的首尾相同的期号, 用以比对是否为最新一期, 也用来当做最后一个符合条件的期号
$nTheLastTraversalNumber = '';
$sessionStorage_cacheQi = ''; // 缓存上一个发送了短信的期号

/**
 * 获得最新一期期号, 获得最新一期号码
 * */
function fnGetTheLatestPhase(){
  //详细每个curlopt意思.转http://www.jb51.net/article/39331.htm
  global $lastQi;
  global $lastNumber;
  global $nTheLastTraversalPeriod;
  global $nTheLastTraversalNumber;
  global $sessionStorage_cacheQi;
  $url = 'http://caipiao.163.com/award/cqssc/';
  $content = get_fcontent($url);
  phpQuery::newDocumentHTML($content);

  // $main = pq('title')->html();
  // $table = pq('.award-winNum')->html();
  $table_tr  = pq('tr');
  $nCurrentTerm = '';

  foreach( pq(".award-winNum") as $table_tr ) {
    $nCurrentTerm = pq($table_tr) -> prev()-> html(); // 当前的期号
    $nCurrentNumber = pq($table_tr) -> html();// 当前号码
    if($nCurrentNumber[0] === $nCurrentNumber[strlen($nCurrentNumber)-1] && intval($nTheLastTraversalPeriod)<intval($nCurrentTerm)){ // 假设当前号码的首尾相同, 且上一个遍历的首尾相同的期号小于当前期号(是foreach最后一个遍历的最大的期号)
      $nTheLastTraversalPeriod = $nCurrentTerm;
      $nTheLastTraversalNumber = $nCurrentNumber;
      echo '<br>****[' . $nTheLastTraversalPeriod . ']****<br>' ;
    }
    if($nCurrentTerm === '001' && !is_numeric(preg_replace('/ /', '', $nCurrentNumber))){
      // 假设重新开始, 每天新一期, 旧的还在缓存, 如何办?
      // 假设当前的期号为001, 表示的时时彩从头开始, 此时需要:
      // - 删除缓存的上一个发送短信的期号
      // - 删除缓存的上一个首尾相同的期号
      $nTheLastTraversalPeriod = '';
      $sessionStorage_cacheQi = '';
    }

    // // echo pq($table_tr);
    // $text = pq($table_tr) -> html();// 号码
    // $_lastQi = pq($table_tr) -> prev()-> html(); // 当前元素的上一个元素
    // echo '<br>****[' . $nTheLastTraversalPeriod . ']****<br>' ;
    // if($text[0] === $text[strlen($text)-1] && intval($sessionStorage_cacheQi||'')<intval($_lastQi) && intval($nTheLastTraversalPeriod)<intval($_lastQi) ){
    // if($text[0] === $text[strlen($text)-1] && intval($nTheLastTraversalPeriod)<intval($_lastQi) ){

    echo '<br>';
  }
  echo '<hr>';

  if($nTheLastTraversalPeriod !== $sessionStorage_cacheQi){
    // 假设没有值得发送的期号, 假设当前发送的期号与之前发送的期号不同(不能相同), 则不执行相关代码(发送短信)
    $sessionStorage_cacheQi = $nTheLastTraversalPeriod;
    $object = (object) [
      'nPeriodNumber' => $nTheLastTraversalPeriod,
      'nNumber' => preg_replace('/ /', '', $nTheLastTraversalNumber),
    ];
    return $object;
  }else{
    $object = (object) [
      'nPeriodNumber' => '',
      'nNumber' => '',
    ];
    return $object;
  }
}
// var_dump(fnGetTheLatestPhase());

// $options = fnGetTheLatestPhase();
// fnSendMessageNotifications('185********', $options->nPeriodNumber, $options->nNumber);
while (1) {
  $options = fnGetTheLatestPhase();

  // 两者必须同时使用来刷新输出缓冲
  ob_flush(); //将数据从php的buffer中释放出来
  flush(); //将释放出来的数据发送给浏览器, 要是没有 flush 和 ob_flush , 浏览器就会陷入一种假卡死的状态

  var_dump($options);
  if($options->nPeriodNumber){
    fnSendMessageNotifications('185****', $options->nPeriodNumber, $options->nNumber);
  }
  sleep(5);
}

原文地址:https://segmentfault.com/a/1190000015798666

原文地址:https://www.cnblogs.com/lalalagq/p/9979035.html

时间: 2024-08-04 05:57:23

PHP 结合前端 ajax 爬取网站信息后, 向指定用户发送指定短信;的相关文章

使用HtmlAgilityPack爬取网站信息并存储到mysql

前言:打算做一个药材价格查询的功能,但刚开始一点数据都没有靠自己找信息录入的话很麻烦的,所以只有先到其它网站抓取存到数据库再开始做这个了. HtmlAgilityPack在c#里应该很多人用吧,简单又强大.之前也用它做过几个爬取信息的小工具.不过很久了源代码都没有了,都忘了怎么用了,这次也是一点一点找资料慢慢做出来的! (不过最麻烦的是将数据存到mysql,.net数据库我一直用的都是mssql,所以第一次做连接mysql遇到了好多问题.) 1.使用HtmlAgilityPack 下载HtmlA

用JAVA制作一个爬取商品信息的爬虫(爬取大众点评)

很多企业要求利用爬虫去爬取商品信息,一般的开发模型如下: for i=1;i<=最大页号;i++ 列表页面url=商品列表页面url+?page=i(页号) 列表页面=爬取(列表页面url) 商品链接列表=抽取商品链接(列表页面)  for 链接 in 商品链接列表: 商品页面=爬取(链接) 抽取(商品页面); 这样的模型看似简单,但是有一下几个问题: 1)爬虫没有线程池支持. 2)没有断点机制. 3)没有爬取状态存储,爬取商品网站经常会出现服务器拒绝链接(反问次数过多),导致一旦出现 拒绝链接

[python] 常用正则表达式爬取网页信息及分析HTML标签总结【转】

[python] 常用正则表达式爬取网页信息及分析HTML标签总结 转http://blog.csdn.net/Eastmount/article/details/51082253 标签: pythonpython爬虫正则表达式html知识总结 2016-04-07 06:13 3615人阅读 评论(4) 收藏 举报  分类: Python爬虫(23)  Python基础知识(17)  版权声明:本文为博主原创文章,转载请注明CSDN博客源地址!共同学习,一起进步~ 这篇文章主要是介绍Pytho

使用scrapy爬取网站的商品数据

目标是爬取网站http://www.muyingzhijia.com/上全部的商品数据信息,包括商品的一级类别,二级类别,商品title,品牌,价格. 搜索了一下,python的scrapy是一个不错的爬虫框架,于是基于scrapy写了一个简易的爬虫. 先分析商品页面,在http://www.muyingzhijia.com/主页面上,有类链接有用的链接,即:http://www.muyingzhijia.com/Shopping/category.aspx?cateID=11和http://w

【python爬虫】根据查询词爬取网站返回结果

最近在做语义方面的问题,需要反义词.就在网上找反义词大全之类的,但是大多不全,没有我想要的.然后就找相关的网站,发现了http://fanyici.xpcha.com/5f7x868lizu.html,还行能把"老师"-"学生","医生"-"病人"这样对立关系的反义词查出来. 一开始我想把网站中数据库中存在的所有的词语都爬出来(暗网爬虫),但是分析了url的特点: http://fanyici.xpcha.com/5f7x86

Python 利用 BeautifulSoup 爬取网站获取新闻流

0. 引言 介绍下 Python 用 Beautiful Soup 周期性爬取 xxx 网站获取新闻流: 图 1 项目介绍 1. 开发环境 Python: 3.6.3 BeautifulSoup:   4.2.0 , 是一个可以从HTML或XML文件中提取数据的Python库* ( BeautifulSoup 的中文官方文档:https://www.crummy.com/software/BeautifulSoup/bs4/doc.zh/ ) 2. 代码介绍 实现主要分为三个模块: 1. 计时

第一周、学会爬取网页信息总结

目标:爬取网页,获得自己需要的信息 步骤: 1. 导入需要的模块2. 利用request向目标网站获得网页信息3. 用BeautifulSoup解析所获得的网页 3. 获得需要的信息所在的标签内容 4. 精简标签获得关键信息5. 获得关键信息之后,再处理(比如比大小) 1.导入需要的模块 BeautifulSoup模块: BeautifulSoup:是一个可以从HTML和XML中读取数据的库.库也叫模块,在笨办法学Python中叫做特征,是其他程序员开发好的一些代码,可以拿来导入(import)

Python爬取网页信息

Python爬取网页信息的步骤 以爬取英文名字网站(https://nameberry.com/)中每个名字的评论内容,包括英文名,用户名,评论的时间和评论的内容为例. 1.确认网址 在浏览器中输入初始网址,逐层查找链接,直到找到需要获取的内容. 在打开的界面中,点击鼠标右键,在弹出的对话框中,选择“检查”,则在界面会显示该网页的源代码,在具体内容处点击查找,可以定位到需要查找的内容的源码. 注意:代码显示的方式与浏览器有关,有些浏览器不支持显示源代码功能(360浏览器,谷歌浏览器,火狐浏览器等

PHP curl模拟浏览器抓取网站信息

curl是一个利用URL语法在命令行方式下工作的文件传输工具. 官方解释 curl是一个利用URL语法在命令行方式下工作的文件传输工具.curl是一个利用URL语法在命令行方式下工作的文件传输工具.它支持很多协议:FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE 以及 LDAP.curl同样支持HTTPS认证,HTTP POST方法, HTTP PUT方法, FTP上传, kerberos认证, HTTP上传, 代理服务器, cookies,