数据源


官网, 一年自动获取一次即可
体验: 本年节假日接口体验

national_holidays.csv:

,name,startDate,endDate,year
0,元旦,01-01,01-01,2021
1,春节,02-11,02-17,2021
2,清明节,04-03,04-05,2021
3,劳动节,05-01,05-05,2021
4,端午节,06-12,06-14,2021
5,中秋节,09-19,09-21,2021
6,国庆节,10-01,10-07,2021

statutory_holiday_process.py

import datetime
import re
import pandas as pd
import requestsURL_PATTERN = f'<a href="(.*?)".*?国务院办公厅关于%s年部分'
STATUTORY_HOLIDAY_TEXT_PATTERN = '<p align=.*?bold;">.*?、(.*?):</span>(.*?)</p>'
Y_M_D_BETWEEN_PATTERN = r"(\d{4})年(\d{1,2})月(\d{1,2})日至(\d{4})年(\d{1,2})月(\d{1,2})日"
Y_M_D_PATTERN = r"(\d{4})年(\d{1,2})月(\d{1,2})日"
M_D_BETWEEN_PATTERN = r"(\d{1,2})月(\d{1,2})日至(\d{1,2})月(\d{1,2})日"
M_D_BETWEEN_PATTERN2 = r"(\d{1,2})月(\d{1,2})日至(\d{1,2})日"
M_D_PATTERN = r"(\d{1,2})月(\d{1,2})日"STATUTORY_HOLIDAY_PATH = "ETL/statutory_holiday_server/statutory_holiday/"
GOV_OPEN_INFO_URL = r"http://sousuo.gov.cn/s.htm?t=zhengce&q=%E8%8A%82%E5%81%87%E6%97%A5%E5%AE%89%E6%8E%92%E9%80%" \r"9A%E7%9F%A5&timetype=&mintime=&maxtime=&sort=&sortType=&searchfield=&pcodeJiguan=&childtype=" \r"&subchildtype=&tsbq=&pubtimeyear=&puborg=&pcodeYear=&pcodeNum=&filetype=&p=&n=&inpro=&sug_t="CHINA_STATUTORY_HOLIDAY = ["元旦", "春节", "清明节", "劳动节", "端午节", "中秋节", "国庆节"]def get_statutory_holiday_info_url():YEAR = str(datetime.datetime.now().year)response = requests.get(url=GOV_OPEN_INFO_URL)text = response.textresult = re.findall(URL_PATTERN % YEAR, text, re.M)if result:return result[0]raise ValueError("Cannot get statutory holiday info url")def get_date_info(text):"2018年123月30日至2019年1月1日放假调休""2月4日至10日""10月1日至7日放假调休""4月4日放假,与周末连休""1月27日至2月2日"date_info = {}YEAR = str(datetime.datetime.now().year)result = re.search(Y_M_D_BETWEEN_PATTERN, text)if result:start_year = result[1]start_month = result[2] if len(result[2]) == 2 else f"0{result[2]}"start_day = result[3] if len(result[3]) == 2 else f"0{result[3]}"date_info["start_date"] = "-".join([start_year, start_month, start_day])end_year = result[4]end_month = result[5] if len(result[5]) == 2 else f"0{result[5]}"end_day = result[6] if len(result[6]) == 2 else f"0{result[6]}"date_info["end_date"] = "-".join([end_year, end_month, end_day])return date_inforesult = re.search(M_D_BETWEEN_PATTERN, text)if result:start_year = YEARstart_month = result[1] if len(result[1]) == 2 else f"0{result[1]}"start_day = result[2] if len(result[2]) == 2 else f"0{result[2]}"date_info["start_date"] = "-".join([start_year, start_month, start_day])end_year = YEARend_month = result[3] if len(result[3]) == 2 else f"0{result[3]}"end_day = result[4] if len(result[4]) == 2 else f"0{result[4]}"date_info["end_date"] = "-".join([end_year, end_month, end_day])return date_inforesult = re.search(M_D_BETWEEN_PATTERN2, text)if result:start_year = YEARstart_month = result[1] if len(result[1]) == 2 else f"0{result[1]}"start_day = result[2] if len(result[2]) == 2 else f"0{result[2]}"date_info["start_date"] = "-".join([start_year, start_month, start_day])end_year = YEARend_month = start_monthend_day = result[3] if len(result[3]) == 2 else f"0{result[3]}"date_info["end_date"] = "-".join([end_year, end_month, end_day])return date_inforesult = re.search(Y_M_D_PATTERN, text)if result:start_year = result[1]start_month = result[2] if len(result[2]) == 2 else f"0{result[2]}"start_day = result[3] if len(result[3]) == 2 else f"0{result[3]}"date_info["end_date"] = date_info["start_date"] = "-".join([start_year, start_month, start_day])return date_inforesult = re.search(M_D_PATTERN, text)if result:start_year = YEARstart_month = result[1] if len(result[1]) == 2 else f"0{result[1]}"start_day = result[2] if len(result[2]) == 2 else f"0{result[2]}"date_info["end_date"] = date_info["start_date"] = "-".join([start_year, start_month, start_day])return date_inforaise ValueError("statutory holiday info Error")def get_statutory_holiday_info():statutory_holiday_info = {}response = requests.get(url=get_statutory_holiday_info_url())text = response.content.decode("utf8")result = re.findall(STATUTORY_HOLIDAY_TEXT_PATTERN, text, re.M)for info in result:holiday_name_info = info[0]holiday_name = [holiday for holiday in CHINA_STATUTORY_HOLIDAY if holiday == holiday_name_info]if holiday_name:statutory_holiday_info[holiday_name[0]] = get_date_info(info[1].split("。")[0])else:holiday_name = [holiday_name_info for holiday in CHINA_STATUTORY_HOLIDAY if holiday in holiday_name_info]statutory_holiday_info[holiday_name[0]] = get_date_info(info[1].split("。")[0])return statutory_holiday_infodef statutory_holiday_info_to_csv():YEAR = str(datetime.datetime.now().year)statutory_holiday_info = get_statutory_holiday_info()statutory_holiday = []for name, info in statutory_holiday_info.items():statutory_holiday.append({"name": name, "startDate": info["start_date"][-5:], "endDate": info["end_date"][-5:],"year": YEAR})df = pd.DataFrame(statutory_holiday)df.to_csv(STATUTORY_HOLIDAY_PATH + "national_holidays.csv", encoding="utf8")

get_statutory_holiday() 获取信息

STATUTORY_HOLIDAY_PATH = "./"
def get_statutory_holiday():year = datetime.datetime.now().yeardf = pd.read_csv(STATUTORY_HOLIDAY_PATH + "national_holidays.csv", encoding="utf8")df = df.loc[df["year"] == year]if df.empty:statutory_holiday_info_to_csv()df = pd.read_csv(STATUTORY_HOLIDAY_PATH + "national_holidays.csv", encoding="utf8")data = pd.DataFrame(df, columns=["name", "startDate", "endDate"]).to_dict(orient="records")response = json.dumps(data, indent=4, ensure_ascii=False)return response

【Python】自动获取法定假日相关推荐

  1. Python自动获取Redi缓存验证码

    最近做UI自动化测试,登录是需要进行短信验证码验证,和开发聊了聊思路,就开始着手实施 打开cmd 安装redis库 pip install redis 安装完成后,开始写代码,因为是测试环境,Redi ...

  2. python自动获取微信公众号最新文章

    微信公众号获取思路 常用的微信公众号文章获取方法有搜狐.微信公众号主页获取和api接口等多个方法. 听说搜狐最近不怎么好用了,之前用的api接口也频繁维护,所以用了微信公众平台来进行数据爬取. 首先登 ...

  3. Python自动获取邮箱验证码【上集】

    本文阅读时长:3-5min 声明:本文只作学习研究,禁止用于非法用途,否则后果自负,如有侵权,请告知删除,谢谢! 前置:Google IMAP协议设置 与 专用密码设置 本次教程为自动获取邮箱验证码实 ...

  4. Python自动获取QQ群消息

    由于WebQQ关闭了,无法通过webQQ来自动的获取QQ中的消息,故采用模拟人查看消息的操作方式来实现自动获取消息.通过调用win32实现窗口监听,找到需要获取的消息窗口句柄,再通过模拟Ctrl+C和 ...

  5. python自动获取号码归属地_Python批量获取并保存手机号归属地和运营商的示例

    从Excel读取一组手机号码,批量查询该手机号码的运营商和归属地,并将其追加到该记录的末尾.SAb免费资源网 import requests import json import xlrd from ...

  6. echarts 获取点击的y轴数值_用 Python 自动获取NBA现役球员的职业生涯数据曲线

    前言 作为一个看了多年篮球的 NBA球迷,一直在想用 python 和篮球一起来写点什么 加上最近在学习 pyecharts ,所以就有了下面这篇文章: 根据输入的球队和球员名字,自动生成该球员职业生 ...

  7. python 自动获取手机短信验证码

    需要一个有权限的 APK 在手机实时存储短信到手机内存 /sdcard/smslog.txt 里(外部SD卡也可以知道能通过adb命令访问到): /***** ...... try { long ti ...

  8. 用 Python 自动获取NBA现役球员的职业生涯数据曲线

    前言 作为一个看了多年篮球的 NBA球迷,一直在想用 python 和篮球一起来写点什么 加上最近在学习 pyecharts ,所以就有了下面这篇文章: 根据输入的球队和球员名字,自动生成该球员职业生 ...

  9. python自动获取天气_用python获取天气数据,并作定时播报

    原标题:用python获取天气数据,并作定时播报 数据挖掘入门与实战 公众号: datadw 思路 1.调用和风天气的API,获取天气数据 2.用百度语音API,将天气数据合成语音 3.用树莓派每天早 ...

最新文章

  1. Fragment回调Activity的事件分发
  2. m1mac安装linux,M1 Mac 能安装 Ubuntu 和 Linux 了 ??
  3. 常用SQL语句优化技巧总结
  4. 华为S5700系列交换机配置文件导出、导入
  5. SAP UI5 web Component里的条件渲染机制
  6. gettimeofday_PHP gettimeofday()函数与示例
  7. VXLAN详解(一)
  8. Masonry的使用
  9. avast6.0网络安全软件破解至2050年_avast激活码_avast有效激活
  10. 易语言基于HTML(网页)开发软件界面UI的方法
  11. 电子电路原理面试题目及答案(一)
  12. vs2017优雅配色
  13. centos系统 -官网下载mysql
  14. centos7开启网卡命令_Centos7启动网卡并查看IP地址的方法
  15. 17家IT创业公司的血泪史(3)
  16. 贝叶斯统计-0531
  17. web前端期末大作业:基于HTML+CSS+JavaScript奥迪企业bootstrap响应式网站
  18. 北京冬奥带火“数字雪花”,隐藏的科技秘密暴露了
  19. Mock.js 使用
  20. 希捷1.5T硬盘2天变废铁!12代依然问题重重!购买慎重

热门文章

  1. 音频:听声识曲,音乐均衡器与傅立叶变换算法,双音多频(DTMF)
  2. 网站建设技术回顾:动态网页
  3. 丰田生产方式和水库模型的类比分析
  4. 电脑知识:常见电脑蓝屏代码识别与处理方法
  5. java时间戳防重放_API防重放机制
  6. 【渝粤教育】国家开放大学2018年秋季 7404-22T数学建模 参考试题
  7. 服务和控制器应用CPU占用过高问题
  8. 在64位ubuntu11.10中用锐捷上网
  9. 【移动前端】需要了解的HTML5 head 头标签
  10. 一篇文章告诉你如何拍摄720度全景图片