效果图

整体思路

从国务办网站爬取所有URL到本地

chinese_holIDAy_urls.json

{

"20191121": [

"国务院办公厅关于2020年部分节假日安排的通知",

"http://www.gov.cn/zhengce/content/2019-11/21/content_5454164.htm"

],

...

}

读取选择本年度的发布URL

读取标题包含本年(2020)的URL

每年可能发布多次文件

爬取发布关于本年的URL

正则取数据[节假日,多少天,调休日]

chinese_holiday.json

{

"holidays": {

"20200101": [

"元旦",

"星期三",

"1"

],

...

},

"workdays": {

"20200119": [

"调休日",

"星期天"

],

...

}

节假日数据整合

把周末加入到以上的 holidays 字段

然后 holidays 字段所有数据按 key 重新排序

剔除掉加入的周末数据里的调休日

将最后的数据重新保存到 Json 文件

chinese_holiday.json

{

"holidays": {

"20200101": [

"元旦",

"星期三",

"1"

],

"20200104": [

"星期六"

],

...

},

"workdays": {

"20200119": [

"调休日",

"星期天"

],

...

}

推送

使用 apscheduler 每天一次从 chinese_holiday.json 读取数据推送

使用 apscheduler 每月一次从网站爬取更新数据到两个 Json 文件

使用 wxpusher 推送消息

代码部分

导入库

import os

import re

import sys

import json

import requests

import calendar

from collections import OrderedDict

from bs4 import BeautifulSoup

from datetime import datetime, timedelta

from wxpusher import WxPusher

from apscheduler.schedulers.blocking import BlockingScheduler

从国务办网站爬取所有URL到本地

知识点01: requests|BeautifulSoup 基础网页处理

知识点02: Json 文件的保存与读取

ensure_ascii=False 设置为 False, 会禁止中文转码为 Unicode 码

indent=4 设置 Json 每行缩进为 4 格

sort_keys=True 设置保存 json 文件时,按key 排序保存

###############################################################################

# 保存所有节假日发布网址 url

def SaveUrl(url):

respose_html = requests.get(url, params=PARAMS, headers=HEADERS)

soup_html = BeautifulSoup(respose_html.content, "html.parser")

info_elems = soup_html.find_all("td", attrs={"class": "info"})

# today_str = datetime.today().__format__('%Y年%m月%d日')

for info_elem in info_elems:

push_date_str = info_elem.find_all("li")[-1].text

push_date_str = push_date_str.split(':')[-1].strip(' ')

push_date_str = ''.join(re.findall('[0-9]+', push_date_str))

href_url = info_elem.find('a')['href']

title = info_elem.find('a').text

if os.path.exists(JSON_FILE) and os.path.getsize(JSON_FILE):

with open(JSON_FILE, 'r', encoding='utf-8') as ff:

json_obj = json.load(ff)

if push_date_str in json_obj.keys():

break

else:

json_obj[push_date_str] = [title, href_url]

with open(JSON_FILE, 'w', encoding='utf-8') as ff:

json.dump(json_obj, ff, indent=4, sort_keys=True, ensure_ascii=False)

else:

json_obj = {}

json_obj[push_date_str] = [title, href_url]

with open(JSON_FILE, 'w', encoding='utf-8') as ff:

json.dump(json_obj, ff, indent=4, sort_keys=True, ensure_ascii=False)

return JSON_FILE

读取并爬取需要的URL

###############################################################################

# 爬取当年的节假日发布网址

# HOLIDAY_DIC = {"20200101":["元旦", "星期三"], }

# WORKDAY_DIC = {"20200119": ["调休","星期天"],}

def CrawPage(href):

global PARAMS, HEADERS, THIS_YEAR, HOLIDAY_DIC, WEEKDAYS

respose_html = requests.get(href, params=PARAMS, headers=HEADERS)

soup_html = BeautifulSoup(respose_html.content, "html.parser")

info_elems = soup_html.find_all("p")

for info in info_elems:

text = info.text

regx = '^.{2}(?P.*):(\d{4}年)?(?P\d+月\d+日)至?' \

'(\d+月)?(?P\d+日)?放假(调休)?,共(?P[1-9]+天)。' \

'(?P(\d+月\d+日(星期.)、?)+上班。)?$'

re_obj = re.search(regx, text)

if re_obj:

# 春节

holiday = re_obj.group('holiday')

# 1月24日

startday = re_obj.group('startday')

startday = str(THIS_YEAR) + ''.join(format_date(startday))

# month = re.search('\d+月', startday).group(0)

# 1月30日

# endday = re_obj.group('endday')

# if endday is not None:

#     endday = month + endday

# 休假 7 天

offdays = re_obj.group('offdays')

offdays = int(re.sub('\D', '', offdays))

start_dt = datetime.strptime(startday, "%Y%m%d")

# 放假的日期列表

offdates = list(gen_dates(start_dt, offdays))

for offday in offdates:

HOLIDAY_DIC[offday] = re.split('、', holiday) + [WEEKDAYS[get_week(offday)], str(offdays)]

# 调休['1月19日','2月1日']

ondays = re_obj.group('ondays')

if ondays is not None:

ondays = re.findall('\d+月\d+日', ondays)

for onday in ondays:

onday = str(THIS_YEAR) + ''.join(format_date(onday))

WORKDAY_DIC[onday] = ["调休日", WEEKDAYS[get_week(onday)]]

节假日数据整合

知识点: calendar库的使用

###############################################################################

# 数据处理

# WEEKEND_DIC = {"20200104": "星期六", "20200104": "星期天"}

def All_WEEEK():

global WEEKEND_DIC, THIS_YEAR, THIS_MONTH

for month in range(THIS_MONTH, 13):

month_cal = calendar.monthcalendar(THIS_YEAR, month)

for week in month_cal:

sa = week[-2]

su = week[-1]

if sa != 0:

date_str = ''.join(format_date(str(month) + '-' + str(sa)))

date_str = str(THIS_YEAR) + date_str

WEEKEND_DIC[date_str] = "星期六"

if su != 0:

date_str = ''.join(format_date(str(month) + '-' + str(su)))

date_str = str(THIS_YEAR) + date_str

WEEKEND_DIC[date_str] = "星期天"

return WEEKEND_DIC

# MULTI_DIC = {}

def HolidayMain():

global HOLIDAY_DIC, WORKDAY_DIC

# 计算所有节假日和周末

WEEKEND_DIC = All_WEEEK()

for dd in WEEKEND_DIC.keys():

if dd not in HOLIDAY_DIC:

HOLIDAY_DIC[dd] = [WEEKEND_DIC[dd]]

# 节假日按时间key排序

TEMP_DIC = HOLIDAY_DIC

HOLIDAY_DIC = OrderedDict()

for key in sorted(TEMP_DIC.keys()):

HOLIDAY_DIC[key] = TEMP_DIC[key]

# 剔除调休日

for key in WORKDAY_DIC.keys():

if key in HOLIDAY_DIC.keys():

HOLIDAY_DIC.pop(key)

MULTI_DIC['holidays'] = HOLIDAY_DIC

MULTI_DIC['workdays'] = WORKDAY_DIC

# 保存到 json

with open(BASE_FILE, 'w', encoding='utf-8') as ff:

json.dump(MULTI_DIC, ff, indent=4, sort_keys=True, ensure_ascii=False)

微信推送

需要去 wxpusher 创建应用

使用 markdown 格式发送

主要需要从 json 文件中计算出需要的数据

MESSAGE = """### 节假日推送

> 今天:

>   + {today_key}

>   + {today_value}

>

> 明天:

>   + {tomorrow_key}

>   + {tomorrow_value}

>

> 下一个节假日:

>   + {next_key}

>   + {next_value}

>

> 今年剩余节假日:

>   + {last_holidays} 天

"""

def MsgPusher():

# 查询用户获取 UID

query_user_ret = WxPusher.query_user(1, 100, APP_TOKEN)

users_info = query_user_ret['data']['records']

for each_user in users_info:

UID_LIST.append(each_user['uid'])

with open(BASE_FILE, 'r', encoding='utf-8') as ff:

multi_json = json.load(ff)

today_key = DATE_NOW.strftime("%Y%m%d")

today_value = PushInfo(today_key, multi_json)

tomorrow_key = (DATE_NOW + timedelta(days=1)).strftime("%Y%m%d")

tomorrow_value = PushInfo(tomorrow_key, multi_json)

# 计算下个节假日

for key in multi_json['holidays'].keys():

value = multi_json['holidays'][key]

if today_key in multi_json['holidays'].keys():

t_value = multi_json['holidays'][today_key]

else:

t_value = None

if key > today_key and (t_value is None or value[0] != t_value[0]):

if len(value) > 2:

next_key = key

# 计算相差多少天

next_dt = datetime.strptime(next_key, "%Y%m%d")

today_dt = datetime.strptime(today_key, "%Y%m%d")

diff_days = (next_dt - today_dt).days

next_value = "|".join(value[:-1]) + \

", 再过 {} 天就可以玩 {} 天了哦!". \

format(diff_days, value[-1])

break

else:

next_key = None

next_value = None

else:

next_key = None

next_value = None

# 计算今年剩余节假日天数

temp_list = []

for key in multi_json['holidays'].keys():

value = multi_json['holidays'][key]

if key > today_key:

if len(value) > 2:

# 以元组的形式保存到set

temp_list.append(value)

last_holidays = len(temp_list)

message = MESSAGE.format(

today_key=today_key, today_value=today_value,

tomorrow_key=tomorrow_key, tomorrow_value=tomorrow_value,

next_key=next_key, next_value=next_value,

last_holidays=str(last_holidays))

print(">>> 开始推送消息")

# print(message)

result = WxPusher.send_message(message, UID_LIST, APP_TOKEN, content_type=3)

print(result)

print("<<< 推送消息完成")

python代码表达元旦节_【原创】Python小实例(节假日微信推送)相关推荐

  1. python代码表达元旦节_2020元旦的python学习

    效率好低今天(我爱屁股,毕竟今天好歹爬上黄金了hhh) 总结一下今天学的东西吧 + 加 - 减 * 乘 / 除 // 整除(取商) % 取余 ** 指数(x**y=xy ) 1.+可以用来连接多个字符 ...

  2. python代码表达元旦节_python3提示节日脚本

    最近临近元旦.春节,回家的迫切心情,接踵而来,就想知道离这些节日还有多少天了,因此有了引篇文章,下面直接上干货! def op(y,m,d,jr): day = [] t1 = datetime.da ...

  3. python代码少的作品_原创 8行python代码展示程序员从入门到大神(或跑路)的全部状态...

    一行python代码可以做什么? 人生苦短,我用python.python的世界里无处不在的简洁和短小,往往一行代码可以实现很多有意思功能. 你敢想象你从入门python代码.网络达人.反重力怪才.爱 ...

  4. 为什么python代码运行不了_为什么Python代码能运行但是PyCharm给我画红线?

    PyCharm在遇到模块找不到时,会使用红色波浪线提醒开发者.这本来是一个非常好的功能,但却由于另外一个问题,会给一些Python初学者造成困扰. 这一篇文章,我们讲讲工作区导致的这个问题. 首先我们 ...

  5. 一行python代码值多少钱_一行python代码

    Life is short, just use Python. 自从08年接触Python,就有爱不释手的感觉,逐渐地,有些不忍地疏远了Perl 和Shell编程,因为python 的优雅么? 不全是 ...

  6. python代码怎么变成软件_从Python代码到APP,你只需要一个小工具:GitHub已超6000星

    点击上方Python知识圈,选择设为星标 回复1024获取Python资料 选自TowardsDataScience作者:Adrien Treuille机器之心编译参与:魔王.一鸣 阅读文本大概需要 ...

  7. python代码库能干什么_一行Python代码能做什么?

    很典型的文章,基本可以展示Python代码到底有多黑魔法.虽然文中有些案例连我都觉得走火入魔,但真的很值得一看... 自从08年接触Python,就有爱不释手的感觉,逐渐地,有些不忍地疏远了Perl ...

  8. python代码弄成网站_原创:用python把链接指向的网页直接生成图片的http服务及网站(含源码及思想)...

    原创:用python把链接指向的网页直接生成图片的http服务及网站(含源码及思想) 总体思想: 希望让调用方通过 http调用传入一个需要生成图片的网页链接生成一个网页的图片并返回图片链接 最终调用 ...

  9. python代码执行过程记录_[原创]IDAPython+OdbgScript动态获取程序执行流程

    题记: 最近知道了有一种方法,可以获取到程序的执行流程,具体做法是先获取程序中每一个函数的地址,在这些地址上设置断点,然后让程序运行起来,hook调试器,断点中断时,不要停下来继续执行,并记录命中的断 ...

最新文章

  1. SharedPreferences的工具类,使用起来方便、快捷
  2. 企业安全建设之搭建开源SIEM平台(上)
  3. poj2112 二分最大流+Floyd
  4. 迁移 Express 到函数计算
  5. c#窗口科学计算机,c#窗口科学计算器连等如何实现,大神帮忙一下好么?
  6. easyui edatagrid 触发编辑行回掉onEdit
  7. 前端学习(2780):创建项目和外观
  8. 推荐一个好库 热键监听 hotkeys-js
  9. Matlab一个窗口中绘制多个图形
  10. 洛谷 P4409 [ZJOI2006] 皇帝的烦恼
  11. envi窗口滤波_高光谱ENVI图像处理之滤波
  12. sublime配置python开发环境_【教程】把Sublime Text 2用作Python的IDE去实现Python的开发...
  13. qlikview 地图插件制作教程
  14. 送书 | 聊聊阳光问政
  15. 李四光预测地震 中国60年内将有4次特大地震
  16. matlab提取电压基波分量,有源电力滤波器三种基波提取方法的对比分析
  17. Android 面试黑洞——当我按下 Home 键再切回来,2021必看-Android高级面试题总结
  18. WIN10教育版激活方法
  19. 什么是服务端与客户端详解
  20. 基于新浪云的微信公众号开发配置过程

热门文章

  1. cad lisp 微盘 程序_CAD LISP 程序(精校版本)
  2. [IL2CPP] 在编译时获取struct的大小
  3. 好好搭搭机器人编程视频_小学生“玩转”机器人 自学编程制作40多个作品
  4. onmousemove、onmouseout事件
  5. AD自带 PCB中放置LOGO/图片/丝印
  6. HIVE实战处理(二十二)股票连续上涨最长的天数
  7. 信号的采样和奇妙的混叠(Aliasing) 贰
  8. 暴笑三国之张飞的流水帐
  9. 对字符串进行切分的技巧
  10. Python3的文件操作笔记