今天闲聊群有朋友问我怎么判断今天是不是法定节假日,是上班还是放假还是假期补班,想了想应该有相应的api,直接去调用就行了,但也可以去国务院官网发的放假通知上面去抓取,今天就跟大家分享下php实现爬虫抓取页面。

说到爬虫,大家首先想到的是python,其实什么语言都一样,无非是抓取网页数据,然后正则分析网页结构,把想要的信息取出来,更深层次的无非是递归爬取所有链接,数据库操作等,php做爬虫也不算稀奇,今天这个需求很简单,就是抓取一篇放假通知的文章,从里面整理出法定节假日期间哪几天放假,哪几天补班,整理成规则的数组或者json,主要用到curl和正则。

下面还是先上代码

<?php
class calendar{public function __construct(){$this->getHolidays();}public function getHolidays(){$data=[];$html=$this->curlGet("http://www.gov.cn/zhengce/content/2021-10/25/content_5644835.htm");preg_match_all('/<p([\s\S]*?)<\/p>/s',$html,$pHandel);foreach($pHandel[0] as $key=>&$value){if(preg_match('/(共[1-9]天)/s',$value,$tempHandel)==1){$value=strip_tags($value);$value=explode("。",$value);$holidayName=explode("、",explode(":",$value[0])[0])[1];$start=preg_replace("/(年|月)/", "-",explode("日至",explode("、",explode(":",$value[0])[1])[0])[0]);if(strlen($start)<7){$start=date("Y")."-".$start;}$start=strtotime($start);$length=(int)preg_replace("/(共|天)/","",$tempHandel[0]);for($i=0;$i<$length;$i++){$item=[];$item["holidayName"]=$holidayName;$item["type"]="休假";$item["date"]=date("Y-m-d",$start+$i*86400+1);$data[]=$item;}if(count($value)==3){$value[1]=explode("、",$value[1]);foreach($value[1] as $ke=>&$val){$val=date("y")."-".explode("日(",str_replace("月", "-",$val))[0];$item=[];$item["holidayName"]=$holidayName."补班";$item["type"]="正常上班";$item["date"]=$val;$data[]=$item;}}}else{}}//echo json_encode($data,JSON_UNESCAPED_SLASHES|JSON_UNESCAPED_UNICODE);$this->dump($data);}private function curlGet($url, $username=null, $password=null) {$ch = curl_init();$header = array('Content-Type: text/xml',);curl_setopt($ch, CURLOPT_HTTPHEADER, $header);curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET");curl_setopt($ch, CURLOPT_TIMEOUT, 30); //30秒超时curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);if(!is_null($username)&&!is_null($password)){curl_setopt($ch, CURLOPT_USERPWD, "$username:$password");}$status_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); //get status code$result = curl_exec($ch);if (curl_error($ch)) {//curl_error($ch);//错误原因curl_close($ch);return false;} else {curl_close($ch);return $result;}}private function dump($data){echo "<pre>";var_dump($data);echo "</pre>";}
}
$c=new calendar();

也很简单,就是curl请求抓取网页源码,想尽一切办法把自己想要的数据抠出来,可以自己用正则匹配,可以用dom类,也可以用第三方库,我这个需求比较简单,就自己用正则和字符串操作把内容转换成数组,不得不说php的精髓就是字符串和数组,尤其是数组,一个array实现了各种类型,字符串的函数也很方便,很多都是直接调用C库函数。

运行了一下,爬虫爬到了放假和补班的日期数据,如下:

array(38) {[0]=>array(3) {["holidayName"]=>string(6) "元旦"["type"]=>string(6) "休假"["date"]=>string(10) "2022-01-01"}[1]=>array(3) {["holidayName"]=>string(6) "元旦"["type"]=>string(6) "休假"["date"]=>string(10) "2022-01-02"}[2]=>array(3) {["holidayName"]=>string(6) "元旦"["type"]=>string(6) "休假"["date"]=>string(10) "2022-01-03"}[3]=>array(3) {["holidayName"]=>string(6) "春节"["type"]=>string(6) "休假"["date"]=>string(10) "2022-01-31"}[4]=>array(3) {["holidayName"]=>string(6) "春节"["type"]=>string(6) "休假"["date"]=>string(10) "2022-02-01"}[5]=>array(3) {["holidayName"]=>string(6) "春节"["type"]=>string(6) "休假"["date"]=>string(10) "2022-02-02"}[6]=>array(3) {["holidayName"]=>string(6) "春节"["type"]=>string(6) "休假"["date"]=>string(10) "2022-02-03"}[7]=>array(3) {["holidayName"]=>string(6) "春节"["type"]=>string(6) "休假"["date"]=>string(10) "2022-02-04"}[8]=>array(3) {["holidayName"]=>string(6) "春节"["type"]=>string(6) "休假"["date"]=>string(10) "2022-02-05"}[9]=>array(3) {["holidayName"]=>string(6) "春节"["type"]=>string(6) "休假"["date"]=>string(10) "2022-02-06"}[10]=>array(3) {["holidayName"]=>string(12) "春节补班"["type"]=>string(12) "正常上班"["date"]=>string(7) "22-1-29"}[11]=>array(3) {["holidayName"]=>string(12) "春节补班"["type"]=>string(12) "正常上班"["date"]=>string(7) "22-1-30"}[12]=>array(3) {["holidayName"]=>string(9) "清明节"["type"]=>string(6) "休假"["date"]=>string(10) "2022-04-03"}[13]=>array(3) {["holidayName"]=>string(9) "清明节"["type"]=>string(6) "休假"["date"]=>string(10) "2022-04-04"}[14]=>array(3) {["holidayName"]=>string(9) "清明节"["type"]=>string(6) "休假"["date"]=>string(10) "2022-04-05"}[15]=>array(3) {["holidayName"]=>string(15) "清明节补班"["type"]=>string(12) "正常上班"["date"]=>string(6) "22-4-2"}[16]=>array(3) {["holidayName"]=>string(9) "劳动节"["type"]=>string(6) "休假"["date"]=>string(10) "2022-04-30"}[17]=>array(3) {["holidayName"]=>string(9) "劳动节"["type"]=>string(6) "休假"["date"]=>string(10) "2022-05-01"}[18]=>array(3) {["holidayName"]=>string(9) "劳动节"["type"]=>string(6) "休假"["date"]=>string(10) "2022-05-02"}[19]=>array(3) {["holidayName"]=>string(9) "劳动节"["type"]=>string(6) "休假"["date"]=>string(10) "2022-05-03"}[20]=>array(3) {["holidayName"]=>string(9) "劳动节"["type"]=>string(6) "休假"["date"]=>string(10) "2022-05-04"}[21]=>array(3) {["holidayName"]=>string(15) "劳动节补班"["type"]=>string(12) "正常上班"["date"]=>string(7) "22-4-24"}[22]=>array(3) {["holidayName"]=>string(15) "劳动节补班"["type"]=>string(12) "正常上班"["date"]=>string(6) "22-5-7"}[23]=>array(3) {["holidayName"]=>string(9) "端午节"["type"]=>string(6) "休假"["date"]=>string(10) "2022-06-03"}[24]=>array(3) {["holidayName"]=>string(9) "端午节"["type"]=>string(6) "休假"["date"]=>string(10) "2022-06-04"}[25]=>array(3) {["holidayName"]=>string(9) "端午节"["type"]=>string(6) "休假"["date"]=>string(10) "2022-06-05"}[26]=>array(3) {["holidayName"]=>string(9) "中秋节"["type"]=>string(6) "休假"["date"]=>string(10) "2022-09-10"}[27]=>array(3) {["holidayName"]=>string(9) "中秋节"["type"]=>string(6) "休假"["date"]=>string(10) "2022-09-11"}[28]=>array(3) {["holidayName"]=>string(9) "中秋节"["type"]=>string(6) "休假"["date"]=>string(10) "2022-09-12"}[29]=>array(3) {["holidayName"]=>string(9) "国庆节"["type"]=>string(6) "休假"["date"]=>string(10) "2022-10-01"}[30]=>array(3) {["holidayName"]=>string(9) "国庆节"["type"]=>string(6) "休假"["date"]=>string(10) "2022-10-02"}[31]=>array(3) {["holidayName"]=>string(9) "国庆节"["type"]=>string(6) "休假"["date"]=>string(10) "2022-10-03"}[32]=>array(3) {["holidayName"]=>string(9) "国庆节"["type"]=>string(6) "休假"["date"]=>string(10) "2022-10-04"}[33]=>array(3) {["holidayName"]=>string(9) "国庆节"["type"]=>string(6) "休假"["date"]=>string(10) "2022-10-05"}[34]=>array(3) {["holidayName"]=>string(9) "国庆节"["type"]=>string(6) "休假"["date"]=>string(10) "2022-10-06"}[35]=>array(3) {["holidayName"]=>string(9) "国庆节"["type"]=>string(6) "休假"["date"]=>string(10) "2022-10-07"}[36]=>array(3) {["holidayName"]=>string(15) "国庆节补班"["type"]=>string(12) "正常上班"["date"]=>string(7) "22-10-8"}[37]=>array(3) {["holidayName"]=>string(15) "国庆节补班"["type"]=>string(12) "正常上班"["date"]=>string(7) "22-10-9"}
}

php实现爬虫抓取法定节假日放假和补班安排数据相关推荐

  1. 【Python爬虫】利用爬虫抓取双色球开奖号码,获取完整数据,简洁45行代码实现,更新时间2023-06-28

    链接:https://pan.baidu.com/s/18oE308_NVNPaCOACw_H5Hw?pwd=abc1 利用爬虫抓取双色球开奖号码,获取完整数据,简洁45行代码实现,更新时间2023- ...

  2. 爬虫抓取某饿了app商铺的评论数据

    前言: 最近研究了一下某饿了app的商铺评论的抓取,该app使用了ssl-pinning的技术来防止中间人攻击,中间代理抓包的时候,出现了unknown,你的代理工具的协议不支持,你可以手写协议或者使 ...

  3. java 获取法定节假日+周末+排除补班

    1.代码 package com.example.demo.controller; import org.springframework.web.client.RestTemplate; import ...

  4. python爬取百度贴吧中的所有邮箱_使用 Python 编写多线程爬虫抓取百度贴吧邮箱与手机号...

    原标题:使用 Python 编写多线程爬虫抓取百度贴吧邮箱与手机号 不知道大家过年都是怎么过的,反正栏主是在家睡了一天,醒来的时候登QQ发现有人找我要一份贴吧爬虫的源代码,想起之前练手的时候写过一个抓 ...

  5. 爬虫抓取页面数据原理(php爬虫框架有很多 )

    爬虫抓取页面数据原理(php爬虫框架有很多 ) 一.总结 1.php爬虫框架有很多,包括很多傻瓜式的软件 2.照以前写过java爬虫的例子来看,真的非常简单,就是一个获取网页数据的类或者方法(这里的话 ...

  6. python爬取大众点评评论_python爬虫抓取数据 小试Python——爬虫抓取大众点评上的数据 - 电脑常识 - 服务器之家...

    python爬虫抓取数据 小试Python--爬虫抓取大众点评上的数据 发布时间:2017-04-07

  7. python爬虫招聘-Python爬虫抓取智联招聘(基础版)

    原标题:Python爬虫抓取智联招聘(基础版) 作者:C与Python实战 「若你有原创文章想与大家分享,欢迎投稿.」 对于每个上班族来说,总要经历几次换工作,如何在网上挑到心仪的工作?如何提前为心仪 ...

  8. python爬取慕课视频-Python爬虫抓取技术的门道

    web是一个开放的平台,这也奠定了web从90年代初诞生直至今日将近30年来蓬勃的发展.然而,正所谓成也萧何败也萧何,开放的特性.搜索引擎以及简单易学的html.css技术使得web成为了互联网领域里 ...

  9. Python学习教程:Python爬虫抓取技术的门道

    Python学习教程:Python爬虫抓取技术的门道 web是一个开放的平台,这也奠定了web从90年代初诞生直至今日将近30年来蓬勃的发展.然而,正所谓成也萧何败也萧何,开放的特性.搜索引擎以及简单 ...

最新文章

  1. 机器学习(14)逻辑回归(实战) -- 癌症分析
  2. python同步异步_python中Tornado的同步与异步I/O的介绍(附示例)
  3. python中str和input_对python中raw_input()和input()的用法详解
  4. location和location.href跳转url的区别
  5. Java:Java和c的区别
  6. 微软示例数据仓库AdventureWorksDW 与数据仓库概述
  7. DIOCP 运作核心探密
  8. 红米k30pro工程测试代码_3299起?红米K30Pro官宣3.24发 对比米10 追悼会来了?
  9. mysql 存储过程的使用;
  10. C#-WinForm-发送邮件
  11. 一年多开源没进展,我也放弃了
  12. IPhone在横屏字体变大解决办法-webkit-text-size-adjust
  13. ModuleNotFoundError: No module named ‘views‘
  14. python 拼音 英文识别_识别同音字词pypinyin, 分词 jieba
  15. php定义一个矩形类rectangle,Python3面向对象—点和矩形类
  16. 关于applicaiton.yml不是绿叶子图标的处理办法
  17. graylog+kafka+zookeeper(单机测试及源码),graylog测试用例及源码(三)
  18. 微信自定义分享--失效问题
  19. Mybatis缓存机制(一级缓存、二级缓存、三级缓存)
  20. 解决XUI 1.1.7版本报错问题:gradle因umeng仓库配置失效,导致编译出错

热门文章

  1. 关于bit-banding的解释和相关作用(转载)
  2. 王牌特工:黄金圈 经典例句
  3. 中国和欧洲两大市场均下了最后通牒,苹果这次恐怕逃不过了
  4. z-index诡异事件之背锅侠
  5. postman传String类型参数时不能加双引号
  6. keras 实现GAN(生成对抗网络)
  7. (01背包扩展) 算法提高 金明的预算方案
  8. Tracup|使用项目管理独一无二的六大好处
  9. 计算机房摆放布局,数据中心机房位置及设备布置的几点要求
  10. UE4 利用Mixamo自动绑骨并导入虚幻4