目录
1 环境
2 需求分析
3 代码实现
4 后记
上周被一则新闻震惊到了,《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://www.cnblogs.com/moonhmily/p/11155066.html