分析了16年的福利彩票记录,原来可以用Python这么买彩票

目录
0 引言
1 环境
2 需求分析
3 代码实现
4 后记
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()
但要知道,这么搞的话,丝毫不会有什么中奖的,因为太随机了……
经历过高考的人,肯定都知道三年模拟五年高考。要知道彩票中奖概率很低的,所以我们在这里先分析下历年的数据,借助往年的数据来“精准”地推算下一期中奖号码。
我们通过这个网站来查询彩票的历史开奖信息。
http://kaijiang.zhcw.com/zhcw/html/ssq/list_1.html

我们点击下一页,看看网址链接是否有规律
http://kaijiang.zhcw.com/zhcw/html/ssq/list_1.html
http://kaijiang.zhcw.com/zhcw/html/ssq/list_2.html
http://kaijiang.zhcw.com/zhcw/html/ssq/list_3.html
http://kaijiang.zhcw.com/zhcw/html/ssq/list_4.html
http://kaijiang.zhcw.com/zhcw/html/ssq/list_5.html
不难发现,可以将目标网址拆分如下:
url_part = 'http://kaijiang.zhcw.com/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 = 'http://kaijiang.zhcw.com/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 = requests.get(basic_url, headers=headers, timeout=10)
response.encoding = 'utf-8'
htm = response.text
# 解析内容
soup = BeautifulSoup(htm, 'html.parser')
# 获取页数信息
page = int(soup.find('p', attrs={"class": "pg"}).find_all('strong')[0].text)
接下来,我们就可以根据规律组装好我们的URL:
url_part = 'http://kaijiang.zhcw.com/zhcw/html/ssq/list'
for i in range(1, page+1):
url = url_part + '_' + str(i) + '.html'
拿组装后的url发起请求,并获取每页中各期的开奖信息:
res = requests.get(url, headers=headers, timeout=10)
res.encoding = 'utf-8'
context = res.text
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('ssq.txt', '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()
blue.sort()
print('号码高频-1注:'+str(red)+' | '+blue[0])
print('号码高频-2注:'+str(red)+' | '+blue[1])
print('号码高频-3注:'+str(red)+' | '+blue[2])
当然了,也可以输出反序输出,中奖号码出现频率较低的几组,只需要设置 reverse=True 即可。
4 后记
这里根据蓝色球各号码出现的次数,作了张直方图,可以很直观到蓝色球各号码出现的频率。

有人会问了,这样预测出的中奖号码,中奖概率究竟有多大呢?
这个,我可说不清楚,只有买了才会知道……小心错过一个亿哟!
好了,以上就是本篇全部内容。
关注公众号「Python专栏」,更多有趣好玩的Python等着你~
本文全套代码已上传至Github:https://github.com/MiracleYoung/You-are-Pythonista/tree/master/PythonExercise/Tool/SSQ_Predict/
分析了16年的福利彩票记录,原来可以用Python这么买彩票的更多相关文章
- tensorflow初次接触记录,我用python写的tensorflow第一个模型
tensorflow初次接触记录,我用python写的tensorflow第一个模型 刚用python写的tensorflow机器学习代码,训练60000张手写文字图片,多层神经网络学习拟合17000 ...
- ubuntu 16.04 上使用pybind11进行C++和Python代码相互调用 | Interfacing C++ and Python with pybind11 on ubuntu 16.04
本文首发于个人博客https://kezunlin.me/post/a41adc1/,欢迎阅读! Interfacing C++ and Python with pybind11 on ubuntu ...
- Python - 记录我开始学习Python的时间节点
记录我开始学习Python的时间节点 2019-09-22 从明天开始我要开始学习Python了,坚持学习.坚持写博客,慢慢积累. 结合实例项目,最好能把目前在做的项目用Python实现. 加油!
- 基于binlog来分析mysql的行记录修改情况(python脚本分析)
最近写完mysql flashback,突然发现还有有这种使用场景:有些情况下,可能会统计在某个时间段内,MySQL修改了多少数据量?发生了多少事务?主要是哪些表格发生变动?变动的数量是怎 ...
- Uva LA 3177 - Beijing Guards 贪心,特例分析,判断器+二分,记录区间内状态数目来染色 难度: 3
题目 https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_pr ...
- 【干货】使用EnCase来分析windows 7文件系统------认识元数据记录$MFT,数据恢复
来源:Unit 6: Windows File Systems and Registry 6.1 Windows File Systems and Registry Windows NTFS File ...
- Ubuntu 16.10 虚拟机安装记录
一定要选自定义. 这里一定要选 稍后安装操作系统 都是坑! 启动时出现'SMBus Host Controller not enabled'错误提示,进不到图形界面. 解决办法:1.在启动Ubunt ...
- TouTiao开源项目 分析笔记16 新闻评论
1.要达到的效果 1.1.主要效果图 点击了标题栏的消息图标后,然后会跳转到评论详情的页面. 1.2.触发的点击事件 在新闻详情的片段中的菜单点击事件中 设置上方标题栏的消息标的监听事件 case R ...
- 记录特殊情况的Python脚本的内存异常与处理
问题 Python 脚本使用 requests 模块做 HTTP 请求,验证代理 IP 的可用性,速度等. 设定 HTTP 请求的 connect timeout 与 read response ti ...
随机推荐
- 不使用运算符(+、-、*、/) 来进行四则运算(C#)
最近在LeetCode 上刷题,遇到一个非常有趣的题目,题目的大概意思就是在不使用运算符的情况下实现两个数的加法...原题点这里>>> 说实话,刚看到这题目,我是一脸懵逼的. 后来仔 ...
- boost库交叉编译(Linux生成ARM的库)
1. 环境: Linux系统:Ubuntu 14.04 编译工具:arm-fsl-linux-gnueabi-gcc 2.下载boost源码: 地址:https://sourceforge.net/p ...
- Linux技术学习路线图
- EF CodeFirst的步骤
1 创建各个实体类 2 创建一个空数据模型,然后删除掉,为了引入Entity Framework和System.Data.Entity 3 为实体类增加标注 4 为实体增加导航属性 5 在App.co ...
- PostMessage和SendMessage有什么区别?(有EnumChildWindowsProc的例子)
PostMessage只是把消息放入队列,不管其他程序是否处理都返回,然后继续执行;而SendMessage必须等待其他程序处理消息后才返回,继续执行.PostMessage的返回值表示PostMes ...
- thinkphp前台html格式化输出日期
输出格式: {$time|strtotime|date="Y年m月d日",###} 格式说明: $time 是日期字符串,一般后台的时间是"Y-m-d H:i:s&quo ...
- android L 关机流程图
下面是简单的流程图,从Java到kernel层. ShutdownThread.java文件 stop playing music,因为后面可能要playing shutdown music. 代码如 ...
- SignalR的简单实现(一)
原文:SignalR的简单实现(一) ASP.NET SignalR是ASP.NET开发人员的一个新库,它使您的应用程序添加实时Web功能变得非常简单.什么是"实时网络"功能?能够 ...
- 16.Oct Working Note
01 writing algorithm by assembly,but the bug... now,it runs normaly,but how to print the answer? suc ...
- storm和kafka的wordCount
这个是在window环境下面安装的kafka 下载pom依赖 <dependency> <groupId>org.apache.storm</groupId> &l ...