Python分析彩票記錄并預(yù)測中獎號碼過程詳解
0 引言
上周被一則新聞?wù)痼@到了,《2454萬元大獎無人認領(lǐng)!福彩史上第二大棄獎在廣東中山產(chǎn)生 》,在2019年5月2日開獎的雙色球中,廣東中山一位彩民博中2454萬元,兌獎時間截至2019年7月1日。
令人遺憾的是,中獎?wù)咦罱K未現(xiàn)身領(lǐng)獎,2454萬元大獎成為棄獎。經(jīng)中山市福彩中心查證,這是中國福彩史上金額第二大的棄獎。根據(jù)《彩票管理條例實施細則》的有關(guān)規(guī)定,這次的2454萬元棄獎獎金將被納入彩票公益金。
一直在為福彩做貢獻的我,啥時候能攤上這樣的好事啊。于是我用Python生成了一組雙色球的號碼……
1 環(huán)境
操作系統(tǒng):Windows
Python版本:3.7.3
2 需求分析
隨機生成一組雙色球的號碼,我們可以借助random函數(shù),如下:
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()
但要知道,這么搞的話,絲毫不會有什么中獎的,因為太隨機了……
經(jīng)歷過高考的人,肯定都知道三年模擬五年高考。要知道彩票中獎概率很低的,所以我們在這里先分析下歷年的數(shù)據(jù),借助往年的數(shù)據(jù)來“精準”地推算下一期中獎號碼。
我們通過這個網(wǎng)站來查詢彩票的歷史開獎信息。
http://kaijiang.zhcw.com/zhcw/html/ssq/list_1.html
我們點擊下一頁,看看網(wǎng)址鏈接是否有規(guī)律
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
不難發(fā)現(xiàn),可以將目標網(wǎng)址拆分如下:
url_part = 'http://kaijiang.zhcw.com/zhcw/html/ssq/list' url = url_part + '_' + str(i) + '.html'
而 i 對應(yīng)的正好是頁碼信息,我們借助
記錄下這里的元素信息。
接下來,我們需要抓取每一頁中的具體開獎信息。我們繼續(xù)通過開發(fā)者工具分析出每期開獎信息。
我們依次記錄下每期的開獎日期對應(yīng)的元素信息:
開獎的批次對應(yīng)的元素信息:
中獎號碼對應(yīng)的元素信息:
有了這些元素信息之后,接下來就是代碼的具體實現(xiàn)。
3 代碼實現(xiàn)
在這里,我們獲取網(wǎng)頁的請求使用 requests 模塊;解析網(wǎng)址借助 beautifulsoup4 模塊。因為都是第三方模塊,如環(huán)境中沒有可以使用 pip 進行安裝。
pip install requests pip install beautifulsoup4 pip install lxml
模塊安裝好之后,進行導入
import requests from bs4 import BeautifulSoup
我們需要先在首頁中,拿到頁數(shù)信息
# 發(fā)起請求 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 # 解析內(nèi)容 soup = BeautifulSoup(htm, 'html.parser') # 獲取頁數(shù)信息 page = int(soup.find('p', attrs={"class": "pg"}).find_all('strong')[0].text)
接下來,我們就可以根據(jù)規(guī)律組裝好我們的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發(fā)起請求,并獲取每頁中各期的開獎信息:
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)
這樣,我們就完成了對每一頁中各期開獎數(shù)據(jù)的獲取。獲取的數(shù)據(jù)可以保存在本地。
def save_to_file(content): with open('ssq.txt', 'a', encoding='utf-8') as f: f.write(content + '\n')
我們在獲取每期的開獎數(shù)據(jù)的同時,記錄下紅藍球出現(xià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) # 藍色球
統(tǒng)計出各個號碼出現(xiàn)次數(shù)信息:
red_count = Counter(red_num) blue_count = Counter(blue_num)
接下來我們可以根據(jù)紅藍號碼出現(xiàn)的頻率進行排序,并推測出幾組雙色球號碼信息:
# 按照出現(xiàn)頻率順序 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])
當然了,也可以輸出反序輸出,中獎號碼出現(xiàn)頻率較低的幾組,只需要設(shè)置 reverse=True 即可。
4 后記
這里根據(jù)藍色球各號碼出現(xiàn)的次數(shù),作了張直方圖,可以很直觀到藍色球各號碼出現(xiàn)的頻率。
有人會問了,這樣預(yù)測出的中獎號碼,中獎概率究竟有多大呢?
這個,我可說不清楚,只有買了才會知道……小心錯過一個億喲!
好了,以上就是本篇全部內(nèi)容。
本文全套代碼已上傳至Github:https://github.com/MiracleYoung/You-are-Pythonista/tree/master/PythonExercise/Tool/SSQ_Predict/
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
python實現(xiàn)合并多個list及合并多個django QuerySet的方法示例
這篇文章主要介紹了python實現(xiàn)合并多個list及合并多個django QuerySet的方法,結(jié)合實例形式分析了Python使用chain合并多個list以及合并Django中多個QuerySet的相關(guān)操作技巧,需要的朋友可以參考下2019-06-06解決python調(diào)用matlab時的一些常見問題
這篇文章主要介紹了解決python調(diào)用matlab時的一些常見問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-03-03Jupyter Notebook內(nèi)使用argparse報錯的解決方案
這篇文章主要介紹了在Jupyter Notebook內(nèi)使用argparse報錯的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06創(chuàng)建虛擬環(huán)境打包py文件的實現(xiàn)步驟
使用虛擬環(huán)境,可以為每個項目創(chuàng)建一個獨立的Python環(huán)境,每個環(huán)境都有自己的庫和版本,從而避免了依賴沖突,本文主要介紹了創(chuàng)建虛擬環(huán)境打包py文件的實現(xiàn)步驟,感興趣的可以了解一下2024-04-04python通過yield實現(xiàn)數(shù)組全排列的方法
這篇文章主要介紹了python通過yield實現(xiàn)數(shù)組全排列的方法,實例分析了全排列的概念及yield實現(xiàn)的技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-03-03Python圖片轉(zhuǎn)gif方式(將靜態(tài)圖轉(zhuǎn)化為分塊加載的動態(tài)圖)
這篇文章主要介紹了Python圖片轉(zhuǎn)gif方式(將靜態(tài)圖轉(zhuǎn)化為分塊加載的動態(tài)圖),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-11-11