1 环境
操作系统:Windows
Python版本:3.7.3
2 需求分析
随机生成一组双色球的号码,我们可以借助random函数,如下:
import randomdef 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()
但要知道,这么搞的话,丝毫不会有什么中奖的,因为太随机了……
经历过高考的人,肯定都知道三年模拟五年高考。要知道彩票中奖概率很低的,所以我们在这里先分析下历年的数据,借助往年的数据来“精准”地推算下一期中奖号码。
小编是一名python开发工程师,这里有我自己整理了一套最新的python系统学习教程,包括从基础的python脚本到web开发、爬虫、数据分析、数据可视化、机器学习等。想要这些资料的可以关注小编,并在后台私信小编:“01”即可领取。
不难发现,可以将目标网址拆分如下:
url_part = "/zhcw/html/ssq/list"url = url_part + "_" + str(i) + ".html"
而 i 对应的正好是页码信息,我们借助开发调试工具,来看看页数的信息怎么获取:
记录下这里的元素信息。
接下来,我们需要抓取每一页中的具体开奖信息。我们继续通过开发者工具分析出每期开奖信息。
我们依次记录下每期的开奖日期对应的元素信息:
开奖的批次对应的元素信息:
中奖号码对应的元素信息:
有了这些元素信息之后,接下来就是代码的具体实现。
3 代码实现
在这里,我们获取网页的请求使用 requests 模块;解析网址借助 beautifulsoup4 模块。因为都是第三方模块,如环境中没有可以使用 pip 进行安装。
pip install requestspip install beautifulsoup4pip install lxml
模块安装好之后,进行导入
import requestsfrom bs4 import BeautifulSoup
我们需要先在首页中,拿到页数信息
# 发起请求basic_url = "/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 = "/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.textsoups = BeautifulSoup(context, "html.parser")if soups.table is None: continueelif 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) # 红色球1red_num.append(ems[1].string) # 红色球2red_num.append(ems[2].string) # 红色球3red_num.append(ems[3].string) # 红色球4red_num.append(ems[4].string) # 红色球5red_num.append(ems[5].string) # 红色球6blue_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 后记
这里根据蓝色球各号码出现的次数,作了张直方图,可以很直观到蓝色球各号码出现的频率。
有人会问了,这样预测出的中奖号码,中奖概率究竟有多大呢?
这个,我可说不清楚,只有买了才会知道……小心错过一个亿哟!