获取节假日信息(来源国务院)

# -*- 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)

获取节假日信息(来源国务院)相关推荐

  1. Python怎么获取节假日信息?

    "holidays" 是一个 Python 第三方库,它可以用来解析和处理节假日信息. 该库提供了一系列函数,可以用来检查某一天是否是节假日.获取某一年中所有节假日的列表等.它支持 ...

  2. 节假日api接口之获取指定日期的节假日信息

    获取指定日期的节假日信息 1.接口地址:http://api.goseek.cn/Tools/holiday?date=数字日期 2.返回数据:正常工作日对应结果为 0, 法定节假日对应结果为 1, ...

  3. java获取工作日 日历接口_节假日api接口之获取指定日期的节假日信息

    获取指定日期的节假日信息 1.接口地址:http://api.goseek.cn/Tools/holiday?date=数字日期 2.返回数据: 3.节假日数据说明:本接口包含2017年起的中国法定节 ...

  4. 获取中国节假日信息api

    1.接口地址:http://api.goseek.cn/Tools/holiday?date=数字日期 2.返回数据:正常工作日对应结果为 0, 法定节假日对应结果为 1, 节假日调休补班对应的结果为 ...

  5. php获取指定日期的节假日信息

    /*1.接口地址:http://api.goseek.cn/Tools/holiday?date=数字日期,支持https协议. 2.返回数据:正常工作日对应结果为 0, 法定节假日对应结果为 1, ...

  6. 日期转换工具+获取当年节假日信息 很简单

    //封装成json 自带的JSON.stringify()会崩溃不知道为什么 function Arr2Json(arr) {var str = "{";var i = 1;for ...

  7. 如何获取搜索引擎的来源,以及搜索引擎的相关信息

    本文来源于:http://www.java3z.com/cwbwebhome/article/article5/51093.html 在做商务E流量分析的时候,需要实现一个功能:如果访客是通过搜索引擎 ...

  8. app获取个人信息是否合法_APP隐私合规介绍和实施方案

    近期咨询app隐私合规的人有点多,正好借这个机会把相关内容整理一下供大家学习参考. 一.背景 目前,大量的移动app在使用过程中,涉及个人隐私信息和敏感信息.在个人信息处理.共享.转让.公开披露过程中 ...

  9. Spring Cloud云架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)

    上一篇我根据框架中OAuth2.0的使用总结,画了SSO单点登录之OAuth2.0 登出流程,今天我们看一下根据用户token获取yoghurt信息的流程: /** * 根据token获取用户信息 * ...

最新文章

  1. 关于在WebForm页面使用Ajax
  2. Delphi 的运算符重载(2) - 可重载运算符列表
  3. linux基础,文件目录管理,cd、rm、mkdir
  4. Arrays 的copyOf() - JDK 6 和操作符 instanceof
  5. All cached global options setting for WordPress
  6. uva 436 Arbitrage (II)
  7. 简单python脚本实例-对Python实现简单的API接口实例讲解
  8. php dom怎么创建节点,前端必须掌握的DOM节点操作方法!
  9. 基于QT播放器的实现(一)Rgb、YUV格式(附带代码)
  10. memcached入门
  11. android摄像头(camera)之buffer管理
  12. springdata jpa in查询
  13. 深入解析锂电池保护电路工作原理
  14. 冰刃(icesword) V1.22 Beta1┊查探系统中幕后黑手-木马后门┊英文绿色免费版
  15. Notepad++ 替换换行符
  16. 技术人员如何从外包开始自己的事业
  17. strcpy、strncpy、strncpy_s和snprintf
  18. 一文读懂电磁学发展史[图文版]
  19. 在线ssd测试软件,AS SSD Benchmark测试
  20. 学完java基础语法之后用来练习的不依赖框架的小项目

热门文章

  1. eclipse调试多线程
  2. java模拟器怎么安装路径_如何使用appium访问来自不同网络位置的路径,直接在模拟器中安装移动应用程序(Android / iOS)?...
  3. Android :ConstraintLayout 偏移 ( Bias ) 计算方式详解
  4. 2020-12-21 PMP 群内练习题 - 光环
  5. 数据爬虫 + 数据清洗 + 数据可视化,完整的项目教程!
  6. resultType及resultMap的用法
  7. 关于当前云平台发展现状的调研报告
  8. 卷积神经网络CNN图解
  9. Mysql CASE函数 详解
  10. 苹果将是折叠手机的最大赢家,而三星将赢两次