Python分析记录并预测中奖号码过程详解
0 引⾔
上周被⼀则新闻震惊到了,《2454万元⼤奖⽆⼈认领!福彩史上第⼆⼤弃奖在⼴东中⼭产⽣》,在2019年5⽉2⽇开奖的双⾊球中,⼴东中⼭⼀位彩民博中2454万元,兑奖时间截⾄2019年7⽉1⽇。
令⼈遗憾的是,中奖者最终未现⾝领奖,2454万元⼤奖成为弃奖。经中⼭市福彩中⼼查证,这是中国福彩史上⾦额第⼆⼤的弃奖。根据《管理条例实施细则》的有关规定,这次的2454万元弃奖奖⾦将被纳⼊公益⾦。
⼀直在为福彩做贡献的我,啥时候能摊上这样的好事啊。于是我⽤Python⽣成了⼀组双⾊球的号码……
1 环境
操作系统:Windows
Python版本:3.7.3
2 需求分析
随机⽣成⼀组双⾊球的号码,我们可以借助random函数,如下:
import random
def ball():
ball_list=[]
while 1:
a=random.randint(1,33)
if a not in ball_list:
ball_list.append(a)
if len(ball_list)==6:
break
ball_list.sort()
ball_list.append(random.randint(1,16))
print(ball_list)
ball()
但要知道,这么搞的话,丝毫不会有什么中奖的,因为太随机了……
经历过⾼考的⼈,肯定都知道三年模拟五年⾼考。要知道中奖概率很低的,所以我们在这⾥先分析下历年的数据,借助往年的数据来“精准”地推算下⼀期中奖号码。
我们通过这个⽹站来查询的历史开奖信息。
我们点击下⼀页,看看⽹址链接是否有规律
不难发现,可以将⽬标⽹址拆分如下:
url_part = 'kaijiang.zhcw/zhcw/html/ssq/list'
url = url_part + '_' + str(i) + '.html'
⽽ i 对应的正好是页码信息,我们借助
记录下这⾥的元素信息。
接下来,我们需要抓取每⼀页中的具体开奖信息。我们继续通过开发者⼯具分析出每期开奖信息。
我们依次记录下每期的开奖⽇期对应的元素信息:
开奖的批次对应的元素信息:
中奖号码对应的元素信息:
有了这些元素信息之后,接下来就是代码的具体实现。
3 代码实现
在这⾥,我们获取⽹页的请求使⽤ requests 模块;解析⽹址借助 beautifulsoup4 模块。因为都是第三⽅模块,如环境中没有可以使⽤ pip 进⾏安装。
pip install requests
pip install beautifulsoup4
pip install lxml
模块安装好之后,进⾏导⼊
import requests
from bs4 import BeautifulSoup
我们需要先在⾸页中,拿到页数信息
# 发起请求
basic_url = 'kaijiang.zhcw/zhcw/html/ssq/list_1.html'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36'
}
response = (basic_url, headers=headers, timeout=10)
htm =
# 解析内容
soup = BeautifulSoup(htm, 'html.parser')
# 获取页数信息
page = int(soup.find('p', attrs={"class": "pg"}).find_all('strong')[0].text)
接下来,我们就可以根据规律组装好我们的URL:
url_part = 'kaijiang.zhcw/zhcw/html/ssq/list'
for i in range(1, page+1):
url = url_part + '_' + str(i) + '.html'
拿组装后的url发起请求,并获取每页中各期的开奖信息:
res = (url, headers=headers, timeout=10)
context =
soups = BeautifulSoup(context, 'html.parser')
if soups.table is None:
continue
elif soups.table:
table_rows = soups.table.find_all('tr')
for row_num in range(2, len(table_rows)-1):
row_tds = table_rows[row_num].find_all('td')
ems = row_tds[2].find_all('em')
result = row_tds[0].string +', '+ row_tds[1].string +', '+ems[0].string+' '+ems[1].string+' '+ems[2].string+' '+ems[3].string+' '+ems[4].string+' '+ems[5].string+', '+ems[6].string  print(result)
这样,我们就完成了对每⼀页中各期开奖数据的获取。获取的数据可以保存在本地。
def save_to_file(content):
with open('', 'a', encoding='utf-8') as f:
f.write(content + '\n')
我们在获取每期的开奖数据的同时,记录下红蓝球出现的号码信息。
# 定义两个变量, ⽤于记录历史开奖信息中的红球、蓝球号码信息
# 定义两个变量, ⽤于记录历史开奖信息中的红球、蓝球号码信息
red_num = []
blue_num = []
red_num.append(ems[0].string) # 红⾊球1
red_num.append(ems[1].string) # 红⾊球2
red_num.append(ems[2].string) # 红⾊球3
red_num.append(ems[3].string) # 红⾊球4
red_num.append(ems[4].string) # 红⾊球5
red_num.append(ems[5].string) # 红⾊球6
blue_num.append(ems[6].string) # 蓝⾊球
统计出各个号码出现次数信息:
red_count = Counter(red_num)
blue_count = Counter(blue_num)
接下来我们可以根据红蓝号码出现的频率进⾏排序,并推测出⼏组双⾊球号码信息:
# 按照出现频率顺序
red_sorted = sorted(red_count.items(), key=lambda x: x[1], reverse=False)
blue_sorted = sorted(blue_count.items(), key=lambda x: x[1], reverse=False)
red = red_sorted[0:6]
blue = blue_sorted[0:3]
red = list(map(lambda x:x[0], red))
blue = list(map(lambda x:x[0], blue))
red.sort()
sortedlistblue.sort()
print('号码⾼频-1注:'+str(red)+' | '+blue[0])
print('号码⾼频-2注:'+str(red)+' | '+blue[1])
print('号码⾼频-3注:'+str(red)+' | '+blue[2])
当然了,也可以输出反序输出,中奖号码出现频率较低的⼏组,只需要设置 reverse=True 即可。
4 后记
这⾥根据蓝⾊球各号码出现的次数,作了张直⽅图,可以很直观到蓝⾊球各号码出现的频率。
有⼈会问了,这样预测出的中奖号码,中奖概率究竟有多⼤呢?
这个,我可说不清楚,只有买了才会知道……⼩⼼错过⼀个亿哟!
好了,以上就是本篇全部内容。
以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。