Python学习,第三课(结合datetime库,制作生产自动化脚本)

本文介绍如何使用Python的datetime库自动化获取彩票的当前期号,包括分析当前周、日期,并处理节假日特殊情况,确保计算准确无误。
摘要由CSDN通过智能技术生成

深入分析,才能自动化

既然上一课提到,希望实现能够随时间能够自动抓取当前时间的开奖信息,那就要从根本开始思考,如何能够正确的获得当前的期号,打包进去让上一课的爬虫自动获取呢?

从最简单的线索开始

首先来看看期号,今天是2021年8月7日:
在这里插入图片描述
所以编号是7位数:开奖年份 + 第88期,不足7位中间补“0”。
Esay,再来看看,双色球是每周二、四、日开奖,那么可以确认的事情就是每周三期,由此我们可以很容易推断一个公式出来:

	期数 = 当前周是今年的第几周 * 3 + 当前周几的修正数

找到原理,准备一下

既然我们知道了如何去计算,就要找找Python有没有相关函数可以帮我们获得现在的时间信息,这个信息要包含:当前年份、当前周是今年第几周,今天是周几。
简单搜索后,可以知道,有一个datetime的包可以完美解决我们的问题。
好了,快速导入,我们来看看datetime能够为我们获取什么样的信息:

from datetime import datetime

time = datetime.now().isocalendar()
day = datetime.today()

print(day)
print(time)

运行一下,得到下面的信息:
在这里插入图片描述
分析一下:
today()方法获得了当前年份,第几周,当前日是周几
time()方法获得了当前日期,以及当前时间
看起来都可以用哦!
下一步开始实践了吗?
NO,稍等,回来再次仔细看看返回的内容。
today()方法获得的信息,分为:年、月、日、小时、分钟、秒
time()方法返回的是一个数据块,里面分别有年、周数、当前日周几
我们来修改一下显示语句,让他们分别输出试一下,看看能否简单的读出来:

print(day)
print(day.year, day.month, day.day, day.hour, day.minute, day.second)
print(time)
print(time[0], time[1], time[2])

看下结果:
在这里插入图片描述

准备好了,开始干活

既然已经拿到了我们想要的信息,我们可以很容易想到使用if语句来做到自动化计算了。
首先分析一下,获取到当前周是第几周后,把他乘以3,得到的是本周的最后一期期数。
所以,(当前周 - 1)* 3 是上一周最后一期期数。
这时候就要酌情分析:
周一,上一周刚刚开完,所以是:(当前周 - 1)* 3
周二,是开奖日,所以应该是:(当前周 )* 3 - 2 或者是(当前周 - 1)* 3 + 1
周三,周二刚开完,所以是:(当前周)* 3 - 2
周四,是开奖日,所以应该是:(当前周 )* 3 - 1 或者是(当前周 - 1)* 3 + 2
周五、六,周二刚开完,所以是:(当前周)* 3 - 1
周日,是开奖日,应该是:(当前周)* 3
得到信息,我们来尝试一下:

from datetime import datetime

time = datetime.now().isocalendar()
day = datetime.today()

if int(time[2]) == 1:
	num = int(time[1]-1)*3
elif int(time[2]) == 2:
	num = int(time[1]-1)*3
elif int(time[2]) == 3:
	num = int(time[1])*3-2
elif int(time[2]) == 4:
	num = int(time[1])*3-2
elif int(time[2]) == 5:
	num = int(time[1])*3-1
elif int(time[2]) == 6:
	num = int(time[1])*3-1
else:
	num = int(time[1])*3-1

print(num)

运行一下,结果……
在这里插入图片描述
No!Why!当前是88期啊!怎么差了这么多?
按理说,逻辑没有问题啊?
所以这是为什么?
不对,过年也要回家的吧?有放假就有停止开奖的日期了?搜一下:
在这里插入图片描述
果然,过年有10天,国庆有4天。这段时间既然不能开奖,自然而然就没法累加期数了…
所以,就在今年过年和十一的时候,加一个简单修正吧(当然,具体日期的事儿先就不管他啦!到时候再出问题,就修改一下咯!):

if int(day.month) > 3:
	num -= 4
elif int(day.month) > 10:
	num -= 2

运行试试:
在这里插入图片描述
成功!
开搞下一步?稍等一下,忽然想到一个问题:
开奖日,随便搜索一下都能知道,一般是21点后开奖,比如:周二的开奖日是要在那个时间之前能查询到的期数还是前一天的期数。
既然这样,就需要在每个开奖日,考虑到21点开奖后,互联网上不一定能够及时同步信息(你想那个机器还得一个个摇乒乓球),所以给一些宽限时间,加一个小小的修正语句

	if day.hour >= 22 :
		num += 1

在运行一下,如果你没有加错,应该是不会有结果的变动。
接下来,我们就要生成出完整的期号,要记住七位,不足位要在中间补“0”

if num < 100:
	code = str(time[0]) + "0" + str(num)
else:
	code = str(time[0]) + str(num)

走一下!
在这里插入图片描述
成功!贴个完整版:

from datetime import datetime

time = datetime.now().isocalendar()
day = datetime.today()

if int(time[2]) == 1:
	num = int(time[1]-1)*3
elif int(time[2]) == 2:
	num = int(time[1]-1)*3
	if day.hour >= 22 :
		num += 1
elif int(time[2]) == 3:
	num = int(time[1])*3-2
elif int(time[2]) == 4:
	num = int(time[1])*3-2
	print(num)
	if day.hour >= 22 :
		num += 1
elif int(time[2]) == 5:
	num = int(time[1])*3-1
elif int(time[2]) == 6:
	num = int(time[1])*3-1
else:
	num = int(time[1])*3-1
	if day.hour >= 22 :
		num += 1

if int(day.month) > 3:
	num -= 4
elif int(day.month) > 10:
	num -= 2
#print(num)

if num < 100:
	code = str(time[0]) + "0" + str(num)
else:
	code = str(time[0]) + str(num)

clock = day.hour

print(code)

成果,就是要利用起来

成果有了,下一步怎么利用呢?

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

红辣椒炒绿辣椒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值