技术标签: 经验分享 恰饭 python 笔记 数据挖掘 程序人生
决定和女朋友去领证了,心里那个激动啊,无以言表!我们俩都是比较随性的,准备拿到户口本就去领。
可谁知女朋友回家拿户口本的时候,跟我说:最近可能领不了了!
what?到手的鸭子要飞了?我心里咯噔一下。
询问后才知道,丈母娘说领证可以,但是要选择一个良辰吉日,要求有俩:一个是看万年历,选取宜“婚假”的日子;一个是需要选择农历的双数日期,双数代表吉利。
听了之后,我拍着胸脯说没问题。接着准备去翻万年历了,可不想这时候女朋友来一句:你个呆子,还准备一天天地去翻啊?写个小程序不就1秒钟的事吗?
我拍了拍脑袋,对哦,还是老婆聪明!话不多说,打开电脑就开干。
我在百度输入框输入“万年历”查询,弹出的第一个当然是百度自己的万年历咯,但是我不想在百度上耗时间,因为时间紧,任务重,我选取一个相对容易的。
这个网站看起来信息比较全,并且不是那种热门的大网站,所以应该获取信息相对容易些。
首页也比较清晰明了,我所需要的几大信息(日历、农历日期、黄历)都有。
接着,我们来看看页面的请求,来定位我们所需信息的请求。
我在这个页面不算多的请求里面发现了这个请求(https://staticwnl.tianqistatic.com/Public/Home/js/api/yjs/2021.js):
这好像就是我们的目标请求,我们来看看返回:
非常好,人家一次性把一年的数据都返回了,感觉好简单啊,都不用咱们一天天请求了。
我再仔细看了下这个返回,发现并没有那么简单,我没找到农历的日期:
{
"y": [
"祭祀",
"塑绘",
"开光",
"裁衣",
"冠笄",
"嫁娶",
"纳采",
"拆卸",
"修造",
"动土",
"竖柱",
"上梁",
"安床",
"移徙",
"入宅",
"安香",
"结网",
"捕捉",
"畋猎",
"伐木",
"进人口",
"放水"
],
"j": [
"出行",
"安葬",
"修坟",
"开市"
],
"ts": "占房床房内北",
"c": "冲猪",
"s": "煞东",
"zc": "丁亥",
"zh": "执",
"yq": "五富 益後",
"yj": "劫煞 小耗 复日 重日 元武"
}
我收起了天真,又开始寻找获取农历日期的方法。我没有找到获取农历日期的请求,但是我发现了一个特别的请求:
这个请求并没有直接获取农历日期,而是用 JavaScript 计算的,我们可以看到这个请求里面的计算方法:
//====================================== 算出农历, 传入日期控件, 返回农历日期控件
// 该控件属性有 .year .month .day .isLeap
//sDObj = new Date(y,m,i+1); 当月1日日期
function Lunar(objDate) {
var i, leap = 0, temp = 0;
var offset = (Date.UTC(objDate.getFullYear(), objDate.getMonth(), objDate
.getDate()) - Date.UTC(1900, 0, 31)) / 86400000;
for (i = 1900; i < 2100 && offset > 0; i++) {
temp = lYearDays(i);
offset -= temp;
}
if (offset < 0) {
offset += temp;
i--;
}
this.year = i;
leap = leapMonth(i); //闰哪个月
this.isLeap = false;
for (i = 1; i < 13 && offset > 0; i++) {
//闰月
if (leap > 0 && i == (leap + 1) && this.isLeap == false) {
--i;
this.isLeap = true;
temp = leapDays(this.year);
} else {
temp = monthDays(this.year, i);
}
//解除闰月
if (this.isLeap == true && i == (leap + 1)) {
this.isLeap = false;
}
offset -= temp;
}
if (offset == 0 && leap > 0 && i == leap + 1) {
if (this.isLeap) {
this.isLeap = false;
} else {
this.isLeap = true;
--i;
}
}
if (offset < 0) {
offset += temp;
--i;
}
this.month = i;
this.day = offset + 1;
}
当然,这个 js 文件里面还有好多其他诸如计算星期、节假日之类的方法,我们可以把这个 js 里面的方法实现用 python 来实现就可以计算出农历日期以及节假日之类的信息了。但是我的时间比较紧迫,所以我选择用最简单的办法——百度。将度娘里面别人写的方法直接拿来用,就不用重复造轮子了。
搜索可以发现好多计算万年历信息的方法,我从其中选取了一个作为工具类来用。
前奏已经弄完了,接下来就好办了,我们来看看代码怎么写。
第一步是获取某一年每天的信息:
def get_data(year):
url = 'https://staticwnl.tianqistatic.com/Public/Home/js/api/yjs/%d.js' % year
response = requests.get(url)
text = response.text
start_str = 'lmanac["%d"] =' % year
his_end_str = ';if(typeof(lmanac_2345)!="undefined"){lmanac_2345();}'
cur_end_str = ';if(typeof(lmanac_2345)!="undefined"){lmanac_2345()};'
cur_year = datetime.datetime.now().year
jsonstr = text.replace(start_str, '')
if cur_year == year:
jsonstr = jsonstr.replace(cur_end_str, '')
else:
jsonstr = jsonstr.replace(his_end_str, '')
return jsonstr
这里需要注意的是,获取到的结果数据在 JSON 数据的前后都加了字符串干扰信息,我们需要将这些字符串给去掉才能解析 JSON。
你以为这样就完了吗?是不是发现用解析2021年的数据的方法去2020年的数据不行?你没看错,这里网站开发人员开了一个小玩笑,他们把结尾字符串里面的一个分号换了个位置。据我仔细观察发现,当年的返回结果中这个分号是在最后的,而其他年份的返回数据中这个分号是在大括号里面的。
获取到数据之后,我们就来计算日期:
def choose_day(year, jsonstr):
jobj = json.loads(jsonstr)
for day in jobj.keys():
y = jobj[day]['y']
if '嫁娶' in y:
dtime = datetime.datetime(year, int(day[1:3]), int(day[3:5]))
# 获取农历日期
ludar_date = lunarUtils.get_ludar_date(dtime)
# 取得日,然后看是否是双数
if ludar_date[2] % 2 == 0:
print('公历日期:%s,农历日期:%s' % (day, ludar_date))
这里面就相对比较简单了,先解析返回的 JSON 数据,然后遍历日期,获取每天的信息,看哪天宜“嫁娶”,就再获取这天的农历日期,看是不是双数,如果是的话,这就是我们的目标日期。
我最后获得的日期是这样子的:
公历日期:d0107,农历日期:(2020, 11, 24)
公历日期:d0122,农历日期:(2020, 12, 10)
公历日期:d0124,农历日期:(2020, 12, 12)
公历日期:d0126,农历日期:(2020, 12, 14)
公历日期:d0203,农历日期:(2020, 12, 22)
公历日期:d0209,农历日期:(2020, 12, 28)
公历日期:d0225,农历日期:(2021, 1, 14)
公历日期:d0305,农历日期:(2021, 1, 22)
公历日期:d0311,农历日期:(2021, 1, 28)
公历日期:d0318,农历日期:(2021, 2, 6)
公历日期:d0324,农历日期:(2021, 2, 12)
公历日期:d0401,农历日期:(2021, 2, 20)
公历日期:d0419,农历日期:(2021, 3, 8)
公历日期:d0425,农历日期:(2021, 3, 14)
公历日期:d0507,农历日期:(2021, 3, 26)
公历日期:d0513,农历日期:(2021, 4, 2)
公历日期:d0525,农历日期:(2021, 4, 14)
公历日期:d0531,农历日期:(2021, 4, 20)
公历日期:d0606,农历日期:(2021, 4, 26)
公历日期:d0613,农历日期:(2021, 5, 4)
公历日期:d0617,农历日期:(2021, 5, 8)
公历日期:d0619,农历日期:(2021, 5, 10)
公历日期:d0625,农历日期:(2021, 5, 16)
公历日期:d0701,农历日期:(2021, 5, 22)
公历日期:d0711,农历日期:(2021, 6, 2)
公历日期:d0713,农历日期:(2021, 6, 4)
公历日期:d0717,农历日期:(2021, 6, 8)
公历日期:d0723,农历日期:(2021, 6, 14)
公历日期:d0725,农历日期:(2021, 6, 16)
公历日期:d0729,农历日期:(2021, 6, 20)
公历日期:d0804,农历日期:(2021, 6, 26)
公历日期:d0811,农历日期:(2021, 7, 4)
公历日期:d0813,农历日期:(2021, 7, 6)
公历日期:d0815,农历日期:(2021, 7, 8)
公历日期:d0823,农历日期:(2021, 7, 16)
公历日期:d0827,农历日期:(2021, 7, 20)
公历日期:d0914,农历日期:(2021, 8, 8)
公历日期:d0926,农历日期:(2021, 8, 20)
公历日期:d1013,农历日期:(2021, 9, 8)
公历日期:d1015,农历日期:(2021, 9, 10)
公历日期:d1025,农历日期:(2021, 9, 20)
公历日期:d1029,农历日期:(2021, 9, 24)
公历日期:d1106,农历日期:(2021, 10, 2)
公历日期:d1110,农历日期:(2021, 10, 6)
公历日期:d1112,农历日期:(2021, 10, 8)
公历日期:d1116,农历日期:(2021, 10, 12)
公历日期:d1124,农历日期:(2021, 10, 20)
公历日期:d1130,农历日期:(2021, 10, 26)
公历日期:d1207,农历日期:(2021, 11, 4)
公历日期:d1211,农历日期:(2021, 11, 8)
公历日期:d1219,农历日期:(2021, 11, 16)
公历日期:d1223,农历日期:(2021, 11, 20)
公历日期:d1231,农历日期:(2021, 11, 28)
看了一下,昨天就是个好日子,公历是0126,农历是1214,12+14=26,我觉得挺好,可惜昨天错过了,只能推后了。我看了一下,要赶在年前领证的话,只有两个日期可选了,我想选2月3日,这天正好立春,是个好日子。
Python 应用无处不在,只要善于运用,我们的生活会更高效美好!我马上要领证了,大家可否点个赞祝福一下?
在使用VS2015下使用libjpeg-turbo静态库,编译时报错了:error LNK2019: 无法解析的外部符号 __iob_func,该符号在函数 output_message 中被引用根据关键字在网上找到一些文章描述了类似的错误,大都是找不到外部符号__iob,原因是VS2010上使用了VC6编译的DLL。虽然与我的情况不同,但是原理是一样的,我遇到的这个问题的原因是V
PWN,Reverse:偏重对汇编,逆向的理解;Gypto:偏重对数学,算法的深入学习;Web:偏重对技巧沉淀,快速搜索能力的挑战;Mic:则更为复杂,所有与计算机安全挑战有关的都算在其中常规做法;A方向:PWN+Reverse+Gypto,随机搭配;B方向:Web+Misc组合;都要学的内容:Linux基础、计算机组成原理,操作系统原理,网络协议分析;A方向:IDA工具使用(f5插件),逆向工程,密码学,缓冲区溢出等书籍推荐:《RE for Beginners(逆向工程入门)》;
正交表法是一种有效减少测试用例个数的设计方法。正交表法的依据是Galois理论,从大量的实验数据中挑选适量的、有代表性的点,从而合理的安排实验的一种科学实验设计方法。在测试用例的设计中,可以从大量的测试用例数据中挑选适量的、有代表性的测试数据,从而合理地安排测试。应用正交表进行测试的难点是查找合适的正交表,大家可以到以下地址查找正交表:https://www.york.ac....
基于BoF算法的图像分类图像分类一直是计算机视觉中的一个重要问题,BoF(Bag of features)算法在图像分类中具有着重要的作用。本文旨在介绍BoF算法的基本原理和过程并且给出Python代码的实现:用于解决在Caltech 101数据库上的多分类问题。算法起源起源1:纹理识别纹理(texture)是由一些重复的纹理单元(texton)组成的,如图1所示。
本地存储localstoragelocalstorage 是 HTML5 提供的在客户端存储数据的新方法,主要作用是将数据保存在客户端中,并且数据是永久保存的,除非人为干预删除。localstorage作为本地存储来使用,解决了cookie存储空间不足的问题:cookie中每条cookie的存储空间为4k,但localStorage的存储空间有5M大小。另外,相比于cookie,localStor...
我是刚入坑计算机图形学的小菜鸟,在百度上搜索计算机图形学方向和前景和3D,几乎不能搜到什么有用的东西,google还能搜到些有用的,但是需要翻墙。恰好前几天山大承办的games,北京大学陈宝权老师提出了图形学的新疆界,10个左右的国内图形学大牛,包括浙大cad国家重点实验室老师,清华老师,微软研究员,中科大老师等一些大牛发表了讲话,并和台下进行了互动。在台上刘利刚教授说了句话,我印象深刻,他说我的...
邮件发展多年,一直是很多人沟通联系和推广业务的主要工具,很多大公司都会发HTML邮件,因为HTML邮件比普通文本邮件更吸引人,震撼力更强。但作为一名普通员工,我们如果自己制作一封这样的HTML邮件,实在是费事费力不讨好。...
HTTP协议简介-超文本传输协议HTTP协议是请求/响应协议:客户端发送请求到服务器,服务器响应该请求。当前版本为1.1版本。HTTP协议特点1.简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET POST 。2. 灵活:HTTP允许传输任意类型的数据对象。传输的类型由content-type加以标记。3.无连...
解决方案:借鉴 列表的滚动加载,实现 a-select 数据展示时滚动加载隐藏问题:在ant-design-vue 中 ,select 可以通过 输入文字 匹配 数据源中的数据,但是在滚动加载中,如果暂时还没有加载到该条数据,则不能 匹配 到的这条数据。具体思路如下:监听下拉框展开,下拉框展开后,要重置展示的数据,默认每一次新展开就回到初始加载的数据展示。 监听数据滚动 - popupScroll 滚动条改变后 请求数据加载(可以异步请求,也可以一次性请求后,分批加载) 对滚动加载.
9.6智力题(一)——给定两条绳子,每条绳子燃烧殆尽正好用一个小时,用这两条绳子准确计时15分钟 题目:给定两条绳子,每条绳子燃烧殆尽正好用一个小时,用这两条绳子准确计时15分钟。注意:这些绳子密度不均匀,因此燃烧掉半截绳子不一定正好用时半个小时。解答:1)点燃绳子1一头的同一时候。将绳子2的两头点燃。2)绳子2...
1、首先安装phpstudy2016,运行起来选择服务器和php版本如下:2、安装MSVC对应版本先查看phpinfo信息下载对应的MSVC11版本安装:http://www.phpstudy.net/3、下载redis扩展 到:http://windows.php.net/downloads/pecl/snaps/redis/2.2.5/ 下载 到http://windows.php.net/d...
问题描述: 在重新安装ctex后,打开原tex文件,中文部分乱码。解决方法: 不要随意修改原文件,现将原文件用记事本打开,如果中文部分正确,说明原文件没问题。用Texworks(ctex带了一连串软件中的一个)打开,用xelatex编译或者Xelatex+Makeindex+Bibtex编译,编译成功。软件另存为tex文件,再用winedt读取,编码UTF-8格式(我的原文件就是utf-8格式)...