广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python实现农历生日提醒功能
  • 491
分享到

Python实现农历生日提醒功能

2024-04-02 19:04:59 491人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

前言:       某天突发奇想,想要实现一个农历生日提醒。这个时候有了如下的大概思路:      &nb

前言:

       某天突发奇想,想要实现一个农历生日提醒。这个时候有了如下的大概思路:

                获取农历   ——>    匹配    ——>     提醒

    发现实现这个需求最主要的在获取农历这一块,后边两个不是什么巨大挑战。遂查阅一番资料,发现数据库可以实现阳历转阴历功能。在数据库这一块,我是在是小菜,看不懂存储过程。蛋疼!直接放弃改用其他思路。思考了许久,想到可以通过爬虫爬取现成的日历信息,存库再进行匹配。所以,现在思路如下:

                爬取农历存库   ——>    匹配姓名表    ——>     提醒



一、爬取日历网站

    刚开始是按照每年一个表的思路去爬,代码及注释如下:

首先是建表:

(文件名:reptile\CreateDb.py)

# -*- coding:utf-8 -*-
import Mysqldb
import os

#将敏感信息写入环境变量 通过export去设置value
mysqlDB_HOST=os.environ.get('MYsqlDB_HOST')
MYSQLDB_USER=os.environ.get('MYSQLDB_USER')
MYSQLDB_PASSWD=os.environ.get('MYSQLDB_PASSWD')

db = MySQLdb.connect(
    host=MYSQLDB_HOST,
    port=3306,
    user=MYSQLDB_USER,
    passwd = MYSQLDB_PASSWD,
    db='Calendar',
    charset = "utf8",
    )
    
cursor = db.cursor()

#数据库插入
def Insert_mysql(sql):
    cursor.execute(sql)
    db.commit()
    
#数据库查询
def Inquire_mysql(sql):
    cursor.execute(sql)
    request = cursor.fetchall()
    return request

if __name__ == "__main__":
    st_sql = "show tables;"
    cursor.execute(st_sql)
    request = cursor.fetchall()
    for year in range(1900,2050):
        if year in request:
            print "[*]%d is in database!"
        else:
            print "[!]%s No in the Database,create now." % year
            ct_sql = """CREATE TABLE `%d` (
                `DAY`  date NOT NULL ,
                `WEEK`  varchar(50) NULL ,
                `CONSTELLATON`  varchar(50) NULL ,
                `FESTIVAL`  varchar(24) NULL ,
                `YEAR`  varchar(24) NULL ,
                `LUNARCALENDAR`  varchar(60) NULL ,
                `LUNNAR`  varchar(24) NULL ,
                `ERSHIBASU`  varchar(24) NULL ,
                `JIAZI`  varchar(24) NULL ,
                PRIMARY KEY (`DAY`)
                )
                ENGINE=InnoDB
                DEFAULT CHARACTER SET=utf8
                ;""" % year
            try:
                cursor.execute(ct_sql)
                db.commit()
                print "[.] %s OK!" % year
            except:
                print "Error:unable to fecth data"
    db.close()

效果:
Python实现农历生日提醒功能


接着爬取:

(文件名:reptile\Spider.py)

#coding:utf-8
import re,urllib2
from bs4 import BeautifulSoup
from urllib import urlencode

class SiteData:
    def __init__(self,url):
        self.Url = url
        
    def Data(self):
         #伪装头
        values = {'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,p_w_picpath/w        ebp,*/*;q=0.8',
        'Accept-Language':'zh-CN,zh;q=0.8',
        'User-Agent':'Mozilla/5.0 (windows NT 6.1; WOW64) AppleWEBKit/537.36 (KHTML, like         Gecko) Chrome/46.0.2490.86 Safari/537.36'
        }
        
        SiteUrl = urllib2.Request(self.Url,headers=values)
        WebSite = urllib2.urlopen(SiteUrl)
        HtmlData = WebSite.read()
        WebSite.close()
        return HtmlData
        
        
    def Find(self):
        #BeautifulSoup筛选出我要的内容
        HtmlData = self.Data()
        HtmlSoup = BeautifulSoup(HtmlData,"HTML5lib")
        FindALL = HtmlSoup.find_all("a")
        List=[]
        for i in FindALL:
            filter = i.encode('gb2312').replace('&#160',' ').replace(';','')
            if "#" in filter:
                ReplaceText = filter.replace('<a href="#" onclick="return(false)" title="','')
                Extract2 = re.sub(r"\<.*\>","",ReplaceText)
                Extract1 = re.sub(r"[0-9]+\:[0-9]+","",Extract2)
                Extract  = Extract1.replace('   0-','').replace('">','')
                List.append(Extract)
            else:
                pass
        return List

开始爬取:

(文件名:reptile\Run.py)

#coding:utf-8
import time
from CreateDb import db,cursor    #将数据库操作的一些方法加进来
from Spider import SiteData       #将爬虫操作的方法加进来
def ListMark(list):
    LIST = []
    items = list.split('\n')
    List = [items[1],items[2],items[3],items[4],items[6],items[7],items[8]]
    for i in List:
        item,value = i.split(':')
        LIST.append(value)
    return LIST
    
def get_item(text):
    item,value = text.split(' ')
    return item

def get_value(text):
    item,value = text.split(' ')
    return value

def UTF(text):    
    TEXT = text.decode('gbk').encode('utf8')
    return TEXT
    
if __name__ == '__main__':
    for year in range(1900,2050):
        sql = "select DAY from Calendar.%s order by DAY desc limit 1" % year
        cursor.execute(sql)
        request = cursor.fetchall()
        print "[!]process %s" % year
        try:
            Month = str(request).split(',')[1]
        except:
            Month = str(request)
            if Month == "()":
                print  "[!]No data in Table! Crawling now.."
                for m in range(1,13):
                    url = "Http://www.nongli.com/item3/rili_%s-%s.htm" % (year,m)
                    OpenSite = SiteData(url)
                    returnList = OpenSite.Find()
                    for i in returnList:
                        List = ListMark(i)
                        Day = get_item(List[0])
                        Week = get_value(List[0])
                        Constellation = List[1]
                        Festival = List[2]
                        Year = List[3][0:4]
                        Lunarcalendar = List[3][4:]
                        Lunnar = List[4]
                        Ershibasu = List[5]
                        Jiazi = List[6]
                        Insert_sql = "insert into Calendar.%s values('%s','%s','%s','%s','%s','%s','%s','%s','%s')" \
                          % (year,Day,UTF(Week),UTF(Constellation),UTF(Festival),\
                            UTF(Year),UTF(Lunarcalendar),UTF(Lunnar),UTF(Ershibasu),UTF(Jiazi))
                        try:
                            cursor.execute(Insert_sql)
                            db.commit()
                            print "[ ]Insert %s data ..." % Day
                        except:
                            print "[!]Insert %s Error!!!" % Day
                            db.rollback() 
                        time.sleep(0.1)
        try:
            if Month == 12:
                print "[ ] Have data in Table."
            else:
                NodataMoth = range(int(Month)+1,13)
                for M in NodataMoth:
                    url = "http://www.nongli.com/item3/rili_%s-%s.htm" % (year,M)
                    OpenSite = SiteData(url)
                    returnList = OpenSite.Find()
                    for i in returnList:
                        List = ListMark(i)
                        Day = get_item(List[0])
                        Week = get_value(List[0])
                        Constellation = List[1]
                        Festival = List[2]
                        Year = List[3][0:4]
                        Lunarcalendar = List[3][4:]
                        Lunnar = List[4]
                        Ershibasu = List[5]
                        Jiazi = List[6]
                        Insert_sql = "insert into Calendar.%s values('%s','%s','%s','%s','%s','%s','%s','%s','%s')" \
                          % (year,Day,UTF(Week),UTF(Constellation),UTF(Festival),\
                            UTF(Year),UTF(Lunarcalendar),UTF(Lunnar),UTF(Ershibasu),UTF(Jiazi))
                        try:
                            cursor.execute(Insert_sql)
                            print "[ ]Insert %s data ..." % Day
                            db.commit()
                        except:
                            print "[!]Insert %s Error!!!" % Day
                            db.rollback()
                        time.sleep(0.1) 
        except:
            print "[!]Unknown Error!"
    db.close()

效果:

Python实现农历生日提醒功能


平均1条6条数据 从1900-2049年需要2个半小时以上时间。


爬完仔细一下,一个表才365条记录,1900-2049才150年 完全可以合成一张表。

遂,写脚本,将所有表合体,现在所有日期数据都在数据库里了:

Python实现农历生日提醒功能


二、将想要提醒的人加入一张表,用于匹配


    姓名表比较简单,主要有姓名,性别,日期,农历日期。一些星座等其他信息可以根据需要自己添加。一个字段一个字段添加太过蛋疼,可以用数据库触发器自动填充一些,但是。。我!不!会!遂,写了个脚本用于添加:

(文件名:add_use.py)

#coding:utf-8
import re,sys
from reptile.CreateDb import Insert_mysql,Inquire_mysql


def UTF(text):
    TEXT = text.decode('UTF-8').encode('UTF-8')
    return TEXT

    
#新增用户的方法  
def add(Name,Sex,Birthday):
        #自动新增ID,匹配最后一个ID,新ID是最后一个ID+1
    Last_id_sql = "SELECT Tb_use.USE_ID FROM Calendar.`Tb_use` \
    ORDER BY Tb_use.USE_ID DESC LIMIT 1"
    Last_id = Inquire_mysql(Last_id_sql)
    try:
        m = re.search(r"[0-9]+",str(Last_id))
        n = m.group()
        id = int(n)+1
    except:
        id = 1

    #如果填入为1 则为男性
    if Sex == "1":
        SEX = "男"
    else:
        SEX = "女"
        
    birthday_sql = "SELECT Calendar.Lunarcalendar FROM Calendar WHERE \
Calendar.TB_DAY = '%s';" % Birthday
       
        #匹配日历表 自动填充农历信息
    Lunarcalendar = Inquire_mysql(birthday_sql)
    Lunar = Lunarcalendar[0][0].encode('UTF-8')
    Insert_sql ="INSERT INTO `Tb_use` (`USE_ID`,`NAME`,`SEX`,`TB_DAY`,\
        `LUNARCALENDAR`) VALUES ('%s','%s','%s','%s','%s');" % \
        (id,UTF(Name),UTF(SEX),Birthday,Lunar)
    Insert_mysql(Insert_sql)
    print "[!]新增新记录,编号为%s\n姓名:%s  性别:%s \n生日:%s 农历:%s" \
          %(id,Name,SEX,Birthday,Lunar)

#删除用户的方法可以根据新增用户方法去修改,这里pass   
def DEL(self):
    pass


#将方法映射到字典
def run(type,Name=None,Sex=None,Birthday=None):
    RUN = {
        'add':lambda:add(Name,Sex,Birthday),
        'del':lambda:DEL()
    }
    return RUN[type]()
        
if __name__ == "__main__": 
        #实现类似命令行交互式效果 
    while True:
        echo = raw_input(">>")
        Split = echo.split(' ')       
        if echo == "exit":
            print "Exit!"
            break
        elif echo == "":
            pass
            
        #如果输入信息正确,则运行方法
        elif Split[0] == "add" or Split[0] == "del":
            try:
                a = run(Split[0],Split[1],Split[2],Split[3])
            except:
                pass                
        else:
            print "Please Use 'add' to Add user."




三、匹配后发送提醒

(文件名:Run.py)

#coding:utf-8
import time,JSON,smtplib,os
from reptile.CreateDb import Insert_mysql,Inquire_mysql
from email.mime.text import MIMEText
from email.MIMEMultipart import MIMEMultipart
from email.MIMEBase import MIMEBase

#今天的日期
Today = time.strftime('%Y-%m-%d',time.localtime(time.time()))
#从数据库从获取今天的ID
Today_Sql = "SELECT Calendar.ID FROM `Calendar` WHERE TB_DAY='%s';" % Today
TodayID = Inquire_mysql(Today_Sql)[0][0]

#这个方法用于获取今天日期
def Get_today(id):
    Sql = "SELECT Calendar.TB_DAY FROM `Calendar` WHERE ID='%s';" % id
    Today = Inquire_mysql(Sql)[0][0]
    return Today

#用于获取今天有哪些小伙伴生日    
def Today_Birthday(id):
    Text = []
    Today_Sql = "SELECT Calendar.LUNARCALENDAR FROM `Calendar` WHERE ID='%s'" % id
    TodayLunar = Inquire_mysql(Today_Sql)[0][0]
    Today_Birthday_sql = "SELECT Tb_use.NAME FROM `Tb_use` WHERE LUNARCALENDAR='%s';" % TodayLunar
    Today_Birthday = Inquire_mysql(Today_Birthday_sql)
    if str(Today_Birthday) == '()':
        Text =  []
    else:
        for i in range(0,len(Today_Birthday)):
            Text.append(Today_Birthday[i][0])
   
    if Text == []:
        Str = ""
    else:
        Str = '\t'.join(i.encode('utf-8') for i in Text)
    return Str

#用于获取7天内有哪些小伙伴生日    
def Week_Birthday():
    Text = []
    for item in range(TodayID,TodayID+7):
        if Today_Birthday(item) == "":
            pass
        else:
            Text.append("%s : %s" % (Get_today(item),Today_Birthday(item)))
    Str = '\n'.join(i for i in Text)
    return Str
    
#发邮件提醒
def Mail(Subject,text):
    
    MAIL_USER=os.environ.get('MAIL_USER')
    MAIL_PASSWD=os.environ.get('MAIL_PASSWD')
    sender = 'cctv<你的邮箱@qq.com>'
    receiver = ['发送到@139.com']
    subject = Subject
    smtpserver = 'smtp.mail.qq.com'
    msg = MIMEMultipart('alternative')
    msg['Subject'] = subject
    html = text
    part = MIMEText(html,'html','utf-8')
    msg.attach(part)
    smtp = smtplib.SMTP()
    smtp.connect('smtp.mail.qq.com')
    smtp.login(MAIL_USER,MAIL_PASSWD)
    smtp.sendmail(sender,receiver,msg.as_string())
    smtp.quit()
    
if __name__ == '__main__':
      #获取今天星期
    a = time.localtime()
    Time = time.strftime("%w",a)
    
    #今天生日的小伙伴
    tb_text = Today_Birthday(TodayID)
    #7天内生日的小伙伴
    wb_text = Week_Birthday()
    
    #如果今天有人生日就发邮件
    if tb_text == '':
        pass
    else:
        Mail('TodayBirthday',tb_text)
        
    #每周一查一下,如果未来7天内有人生日就发邮件
    if Time == '1':
        if wb_text == '':
            pass
        else:
            Mail('WeekBirthday',wb_text)
    else:
        pass

最后,加入任务计划

(文件名:Run.sh)

#!/bin/bash
export MYSQLDB_USER=****
export MYSQLDB_PASSWD=****
export MYSQLDB_HOST=****
export MAIL_PASSWD=****
export MAIL_USER=****
#我是在虚拟环境下的,所以要用虚拟环境的路径运行
`/home/ubuntu/class/env/bin/python /home/ubuntu/class/LunarBirthday/Run.py`

加入任务计划,大功告成!

--结束END--

本文标题: Python实现农历生日提醒功能

本文链接: https://www.lsjlt.com/news/39984.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python实现农历生日提醒功能
    前言:       某天突发奇想,想要实现一个农历生日提醒。这个时候有了如下的大概思路:      &nb...
    99+
    2022-10-18
  • 如何在PHP项目中实现日历功能和事件提醒?
    如何在PHP项目中实现日历功能和事件提醒?在开发Web应用程序时,日历功能和事件提醒是常见的需求之一。无论是个人日程管理、团队协作,还是在线活动安排,日历功能都可以提供便捷的时间管理和事务安排。在PHP项目中实现日历功能和事件提醒可以通过以...
    99+
    2023-11-02
    事件 日历 提醒
  • Python利用zhdate模块实现农历日期处理
    目录简介安装主要功能源码简介 zhdate模块统计从1900年到2100年的农历月份数据代码,支持农历和公历之间的转化,并且支持日期差额运算。 安装 pip install zhda...
    99+
    2022-11-13
  • java实现日历功能
    本文实例为大家分享了java实现日历功能的具体代码,供大家参考,具体内容如下 完成一个 java application应用程序,输出一份当前所在时区当前时间的一个月的日历(1号到2...
    99+
    2022-11-13
  • Vue.js实现日历功能
    本文实例为大家分享了Vue.js实现日历功能的具体代码,供大家参考,具体内容如下 Github 功能需求 使用 Vue.js 实现指定年月的日历表,配合后台接口数据,添加对应日期的...
    99+
    2022-11-12
  • js如何实现日历功能
    这篇文章给大家分享的是有关js如何实现日历功能的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。突然发现日期对象可以进行 加减 , 利用这个特性写了一个可以说是对只要会JavaScr...
    99+
    2022-10-19
  • 如何用js实现日历功能
    这篇文章主要讲解了“如何用js实现日历功能”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何用js实现日历功能”吧! 示例代码...
    99+
    2022-10-19
  • Android实现每天定时提醒功能
    这个是设置定时提醒的功能,即设置几点几分后提醒,用的是给系统设置个时间点,当系统时间到达设置的时间点的时候就会给我们发送一个广播,然后达到时间提醒功能 网上找了很多,遇到了很多...
    99+
    2022-06-06
    Android
  • Android后台定时提醒功能实现
    前提:考虑到自己每次在敲代码或者打游戏的时候总是会不注意时间,一不留神就对着电脑连续3个小时以上,对眼睛的伤害还是挺大的,重度近视了可是会遗传给将来的孩子的呀,可能老婆都跟别人...
    99+
    2022-06-06
    Android
  • java如何实现消息提醒功能
    Java可以通过以下几种方式实现消息提醒功能:1. 使用弹窗:可以使用Java的Swing或JavaFX库来创建弹窗,当需要提醒用户...
    99+
    2023-08-08
    java
  • 微信小程序向系统日历添加事件(提醒)实现
    直接上代码 // pages/calendar/calendar.jsPage({ // 点击添加日程按钮 handleAddCalendar() { wx.getSetting({ success(res) { ...
    99+
    2023-09-22
    微信小程序 小程序 javascript
  • 小程序实现日历打卡功能
    本文实例为大家分享了小程序实现日历打卡功能的具体代码,供大家参考,具体内容如下 一、效果图展示 老惯例,先上效果图 二、实现思路 1、日历展示 例如下图中: 2021月7月打卡日历...
    99+
    2022-11-13
  • android studio怎么实现弹窗提醒功能
    要在Android Studio中实现弹窗提醒功能,可以使用AlertDialog类。下面是一个简单的示例代码:```javaAle...
    99+
    2023-08-08
    android studio
  • JavaScript自定义日历实现签到功能
    本文实例为大家分享了JavaScript自定义日历签到功能的具体代码,供大家参考,具体内容如下 先看下效果图 红色块为已签到的日期,样式可以随意更改,清晰明了,话不多说上代码: &...
    99+
    2022-11-13
  • 怎么使用PHP实现开播提醒功能
    这篇文章主要介绍“怎么使用PHP实现开播提醒功能”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么使用PHP实现开播提醒功能”文章能帮助大家解决问题。一、前期准备1 配置服务器开播提醒功能需要在服务...
    99+
    2023-07-05
  • MySQL 实现点餐系统的订单提醒功能
    MySQL 实现点餐系统的订单提醒功能,需要具体代码示例随着移动互联网的发展,订餐系统越来越受欢迎,越来越多的人选择通过手机或网络下单点餐。在这个过程中,订单的实时性和准确性变得尤为重要。为了实现点餐系统的订单提醒功能,我们可以使用MySQ...
    99+
    2023-11-01
    MySQL 点餐系统 订单提醒
  • Android使用GridView实现日历的简单功能
    简单的日历实现,只是显示了每一个月,没有显示当天和记事这些功能 主要是计算月初是周几,月末是周几,然后相应的显示上一月多少天和下一月多少天。 先看一下关于日期的用到的几个工具...
    99+
    2022-06-06
    gridview Android
  • 微信小程序实现日历签到功能
    本文实例为大家分享了微信小程序实现日历签到的具体代码,供大家参考,具体内容如下 wxml: <!--pages/signin/signin.wxml--> <vi...
    99+
    2022-11-13
  • Android中AlarmManager+Notification实现定时通知提醒功能
    AlarmManager简介 AlarmManager实质是一个全局的定时器,是Android中常用的一种系统级别的提示服务,在指定时间或周期性启动其它组件(包括Activit...
    99+
    2022-06-06
    alarmmanager notification Android
  • Python实现历史记录功能(实际案例)
    目录1、如何实现用户的历史记录功能(最多n条)2、代码演示1、如何实现用户的历史记录功能(最多n条) 实际案例: 很多应用程序都有浏览用户的历史记录的功能, 例如: 浏览器可以查看最...
    99+
    2022-11-10
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作