获取节假日信息(来源国务院)
获取节假日信息(来源国务院)
# -*- coding:utf-8 -*-
# @Author: Aiden
# @Date: 2021/10/27 09:54import datetime, re, os, csv
from bs4 import BeautifulSoup
from urllib import parse, requestclass Holiday:def __init__(self, year=None):self.url = "http://sousuo.gov.cn/s.htm?" # 国务院办公厅self.year = year if year else datetime.datetime.now().yearself.oneDay = datetime.timedelta(days=1)self.kwargs = {"t": "zhengce","q": "{}节假日".format(year if year else self.year)}self.firstDay = datetime.datetime.strptime(str(self.year), "%Y") # 本年第一天self.finalDay = datetime.datetime.strptime(str(self.year + 1), "%Y") - self.oneDay # 本年最后一天self.totalDay = (self.finalDay - self.firstDay + self.oneDay).days # 本年总天数@staticmethoddef get_url(url, kwargs=None, timeout=5):"""爬取网页"""url = url + parse.urlencode(kwargs) if kwargs else urlreturn BeautifulSoup(request.urlopen(url=url, timeout=timeout), "lxml")def holidays(self, data: list):"""假期数据处理"""result = {}for row in data:if len(row) == 0 or row[0] not in ["一", "二", "三", "四", "五", "六", "七"]:continueholiday_str, total, workday_str = re.split(r"共(.)天", row)title = re.compile(r"、(.+):").findall(holiday_str)[0]if title == "元旦":result[str(self.year) + "-01-01"] = titleresult[str(self.year) + "-01-02"] = titleresult[str(self.year) + "-01-03"] = titlecontinueholiday_dates = re.findall(r"\d+", holiday_str)workday_dates = re.findall(r"\d+", workday_str)start_date = datetime.datetime.strptime(str(self.year) + holiday_dates[0] + holiday_dates[1], "%Y%m%d")for i in range(int(total)): # 假期result[(start_date + self.oneDay * i).strftime("%Y-%m-%d")] = titleif len(workday_dates) == 2: # 调休一天result["-".join([str(self.year), workday_dates[0].zfill(2), workday_dates[1].zfill(2)])] = "补班"if len(workday_dates) == 4: # 调休两天result["-".join([str(self.year), workday_dates[0].zfill(2), workday_dates[1].zfill(2)])] = "补班"result["-".join([str(self.year), workday_dates[2].zfill(2), workday_dates[3].zfill(2)])] = "补班"return resultdef all_days(self, holidays: dict):"""整合所有日期"""result = []date = self.firstDayfor _ in range(self.totalDay):res = holidays.get(date.strftime("%Y-%m-%d"))date_str = date.strftime("%Y-%m-%d")if res:if res == "补班":row = {"Date": date_str, "Holiday": res, "Tag": "补班"}else:row = {"Date": date_str, "Holiday": res, "Tag": "假期休息"}else:if date.weekday() <= 4:row = {"Date": date_str, "Holiday": "", "Tag": "工作日"}else:row = {"Date": date_str, "Holiday": "", "Tag": "周末休息"}result.append(row)date += self.oneDayreturn resultdef get_data(self):"""获取数据"""resp = self.get_url(url=self.url, kwargs=self.kwargs)try:href = resp.select("a[href][onclick][target]")[0]["href"]except:if "抱歉" in resp.select("div[class='jg_box'] p")[0].get_text():print("抱歉, 没有找到相关结果")exit()text = self.get_url(url=href).select("td[class='b12c']")[0].get_text().split("\n")return self.all_days(self.holidays(text))def export(self, filepath=None, filename=None):"""导出文件:param filepath: 导出路径, 默认: 当前文件目录:param filename: 文件名称, 默认: 2021Holiday"""data = self.get_data()filename = filename + ".csv" if filename else f"{self.year}Holiday.csv"path = os.path.join(filepath, filename) if filepath else filenamewith open(path, "w", newline="", encoding="utf-8-sig") as f:f_csv = csv.DictWriter(f, ["Date", "Holiday", "Tag"])f_csv.writeheader()f_csv.writerows(data)@staticmethoddef get_workday(filepath, date=None, which="last"):"""获取指定工作日:param filepath::param date: 指定日期, 格式: 2021-10-01:param which: 指定类型, "last" | "next":return: 日期对象"""with open(filepath, "r") as f:data = {k: v for k, _, v in list(csv.reader(f))[1:]}day = datetime.datetime.strptime(date, "%Y-%m-%d") if date else datetime.datetime.now()if which == "last":oneDay = datetime.timedelta(days=-1)else:oneDay = datetime.timedelta(days=1)for i in range(10):day += oneDayif data.get(day.strftime("%Y-%m-%d")) in ["补班", "工作日"]:breakreturn dayif __name__ == '__main__':Holiday(year=2021).export(filepath=None, filename=None)
获取节假日信息(来源国务院)相关推荐
- Python怎么获取节假日信息?
"holidays" 是一个 Python 第三方库,它可以用来解析和处理节假日信息. 该库提供了一系列函数,可以用来检查某一天是否是节假日.获取某一年中所有节假日的列表等.它支持 ...
- 节假日api接口之获取指定日期的节假日信息
获取指定日期的节假日信息 1.接口地址:http://api.goseek.cn/Tools/holiday?date=数字日期 2.返回数据:正常工作日对应结果为 0, 法定节假日对应结果为 1, ...
- java获取工作日 日历接口_节假日api接口之获取指定日期的节假日信息
获取指定日期的节假日信息 1.接口地址:http://api.goseek.cn/Tools/holiday?date=数字日期 2.返回数据: 3.节假日数据说明:本接口包含2017年起的中国法定节 ...
- 获取中国节假日信息api
1.接口地址:http://api.goseek.cn/Tools/holiday?date=数字日期 2.返回数据:正常工作日对应结果为 0, 法定节假日对应结果为 1, 节假日调休补班对应的结果为 ...
- php获取指定日期的节假日信息
/*1.接口地址:http://api.goseek.cn/Tools/holiday?date=数字日期,支持https协议. 2.返回数据:正常工作日对应结果为 0, 法定节假日对应结果为 1, ...
- 日期转换工具+获取当年节假日信息 很简单
//封装成json 自带的JSON.stringify()会崩溃不知道为什么 function Arr2Json(arr) {var str = "{";var i = 1;for ...
- 如何获取搜索引擎的来源,以及搜索引擎的相关信息
本文来源于:http://www.java3z.com/cwbwebhome/article/article5/51093.html 在做商务E流量分析的时候,需要实现一个功能:如果访客是通过搜索引擎 ...
- app获取个人信息是否合法_APP隐私合规介绍和实施方案
近期咨询app隐私合规的人有点多,正好借这个机会把相关内容整理一下供大家学习参考. 一.背景 目前,大量的移动app在使用过程中,涉及个人隐私信息和敏感信息.在个人信息处理.共享.转让.公开披露过程中 ...
- Spring Cloud云架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)
上一篇我根据框架中OAuth2.0的使用总结,画了SSO单点登录之OAuth2.0 登出流程,今天我们看一下根据用户token获取yoghurt信息的流程: /** * 根据token获取用户信息 * ...
最新文章
- 关于在WebForm页面使用Ajax
- Delphi 的运算符重载(2) - 可重载运算符列表
- linux基础,文件目录管理,cd、rm、mkdir
- Arrays 的copyOf() - JDK 6 和操作符 instanceof
- All cached global options setting for WordPress
- uva 436 Arbitrage (II)
- 简单python脚本实例-对Python实现简单的API接口实例讲解
- php dom怎么创建节点,前端必须掌握的DOM节点操作方法!
- 基于QT播放器的实现(一)Rgb、YUV格式(附带代码)
- memcached入门
- android摄像头(camera)之buffer管理
- springdata jpa in查询
- 深入解析锂电池保护电路工作原理
- 冰刃(icesword) V1.22 Beta1┊查探系统中幕后黑手-木马后门┊英文绿色免费版
- Notepad++ 替换换行符
- 技术人员如何从外包开始自己的事业
- strcpy、strncpy、strncpy_s和snprintf
- 一文读懂电磁学发展史[图文版]
- 在线ssd测试软件,AS SSD Benchmark测试
- 学完java基础语法之后用来练习的不依赖框架的小项目
热门文章
- eclipse调试多线程
- java模拟器怎么安装路径_如何使用appium访问来自不同网络位置的路径,直接在模拟器中安装移动应用程序(Android / iOS)?...
- Android :ConstraintLayout 偏移 ( Bias ) 计算方式详解
- 2020-12-21 PMP 群内练习题 - 光环
- 数据爬虫 + 数据清洗 + 数据可视化,完整的项目教程!
- resultType及resultMap的用法
- 关于当前云平台发展现状的调研报告
- 卷积神经网络CNN图解
- Mysql CASE函数 详解
- 苹果将是折叠手机的最大赢家,而三星将赢两次