前言:
某天突发奇想,想要实现一个农历生日提醒。这个时候有了如下的大概思路:
获取农历 ——> 匹配 ——> 提醒
发现实现这个需求最主要的在获取农历这一块,后边两个不是什么巨大挑战。遂查阅一番资料,发现数据库可以实现阳历转阴历功能。在数据库这一块,我是在是小菜,看不懂存储过程。蛋疼!直接放弃改用其他思路。思考了许久,想到可以通过爬虫爬取现成的日历信息,存库再进行匹配。所以,现在思路如下:
爬取农历存库 ——> 匹配姓名表 ——> 提醒
一、爬取日历网站
刚开始是按照每年一个表的思路去爬,代码及注释如下:
首先是建表:
(文件名: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()
效果:
接着爬取:
(文件名: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'