Python学习第三课(全面分析,是自动化的前提)
深入分析,才能自动化
既然上一课提到,希望实现能够随时间能够自动抓取当前时间的开奖信息,那就要从根本开始思考,如何能够正确的获得当前的期号,打包进去让上一课的爬虫自动获取呢?
从最简单的线索开始
首先来看看期号,今天是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)
成果,就是要利用起来
成果有了,下一步怎么利用呢?