python写一个双色球彩票计算器

python写一个双色球彩票计算器,第1张

概述首先声明,赌博一定不是什么好事,也完全没有意义,不要指望用彩票发财。之所以写这个,其实是用来练手的,可以参考这个来预测一些其他的东西,意在抛砖引玉。啰嗦完了,马上开始,先上伪代码打开网址  读取内容内容解析  根据源码得到需爬取内容  1、开奖日期:2018年8月26日  2、红球                                <li class="ball_red">03</li>                                <li class="ball_red">07</li>                                <li class="ball_red">08</li>                                <li class="ball_red">14</li>                                <li class="ball_red">25</li>                                <li class="ball_red">32</li>  3、篮球                                    <li class="ball_blue">06</li>打开数据库连接  爬取内容写入数据库    共3个字段    1、开奖日期    2、红球,红球使用分号“;”分隔,方便调用和导出    3、篮球在写脚本前,建议先写伪代码,伪代码格式不是固定的,随自己喜好,主要就是在思维及算法落地前,把整个轮廓理清,可以有效降低都快写完了,发现前面有错误,结果导致整个脚本全部更新一遍这种事的发生概率伪代码解读:    共分为两个功能块        一就是抓取彩票数据,这个使用爬虫实现,分别抓取开奖日期、红球区、篮球区,因为考虑双色球的数据量比较庞大,所以这次使用数据库进行存储,选用的是免费又好用的mysql数据库,数据库接口文件使用MySQLdb,这个我以后会单独写一个说明,当然你也可以用文档存储,或者选择别的数据库比如oracle或者nosql的mangodb        二是用来分析彩票的,即使用彩票数据进行下一期的彩票预测,本次选用的是二项分布,这个在之前的算法里面有,就不重复说明了下面先上脚本,再对脚本进行说明#!/usr/bin/python# coding: UTF-8'''打开网址读取内容内容解析根据源码得到需爬取内容1、开奖日期:2018年8月26日2、红球<li class="ball_red">03</li><li class="ball_red">07</li><li class="ball_red">08</li><li class="ball_red">14</li><li class="ball_red">25</li><li class="ball_red">32</li>3、篮球<li class="ball_blue">06</li>打开数据库连接爬取内容写入数据库共3个字段1、开奖日期2、红球,红球使用分号“;”分隔,方便调用和导出3、篮球create table tow_color_ball(open_date varchar(10),red_n varchar(20),blue_n varchar(2))'''import urllibimport urllib2import reimport numpy as npimport operatorimport MySQLdb# 连接mysqldef conn_db():db = 'pythondb'host = 'localhost'iuser = 'xxx'passwd = 'xxxxxx'conn = MySQLdb.connect(db = db, host = host, user = iuser, passwd = passwd)cursor = conn.cursor()return cursor# 处理网页获取页面源码def get_html_values(url):url_open = urllib.urlopen(url)url_read = url_open.read()return url_read# 处理源码,获取日期、红球、篮球def manage_html(html_values):red_no_re = re.compile('(?<=<li class="ball_red">)[0-9]+(?=</li>)')blue_no_re = re.compile('(?<=<li class="ball_blue">)[0-9]+(?=</li>)')date_re = re.compile('(?<=开奖日期:)[0-9]+年[0-9]+月[0-9]+日')red_no_list = re.findall(red_no_re,html_values)red_numbers = ';'.join(red_no_list)blue_number = re.search(blue_no_re,html_values)blue_number = blue_number.group()date_value = re.search(date_re,html_values)date_value = date_value.group()return date_value, red_numbers, blue_number# 可恶的日期,竟然是YYYY年MM月DD日,需要改成YYYY-MM-DDdef manage_date(date_value):date_value = date_value.replace('年','-').replace('月','-').replace('日','')return date_value# 处理页面编号,每次编号-1,也就是说end_page要小于url中的页码def get_page(url,end_page):url_num = re.search('(?<=/)[0-9]+(?=.)',url)url_num = url_num.group()if int(end_page) > int(url_num):return 'end'url_num_1 = int(url_num) - 1url = url.replace(url_num,str(url_num_1))return url# 查看库中是否已存在开奖日期,防止重复写入def check_open_date(open_date):conn = conn_db()check_sql = 'select 1 from tow_color_ball where open_date = %r' %open_dateconn.execute(check_sql)excur = conn.fetchall()conn.close()#如过未查到excur == ()return excur# 写入数据库def write_db(date_value, red_numbers, blue_number):conn = conn_db()in_sql = "insert into tow_color_ball(open_date,red_n,blue_n) values(%r,%r,%r)" %(date_value, red_numbers, blue_number)conn.execute(in_sql)conn.execute('commit')conn.close()# 彩票主程序,用来爬取彩票号码def ball_main(url,end_page):while True:html_values = get_html_values(url)date_value, red_numbers, blue_number = manage_html(html_values)date_value = manage_date(date_value)data_check = check_open_date(date_value)if data_check == ():write_db(date_value, red_numbers, blue_number)url = get_page(url,end_page)if url == 'end':print 'url_page已到达end_page,获取完成'return 0# 二项分布算法class binomial_class(object):def __init__(self,case_count,real_count,p):self.case_count = case_countself.real_count = real_countself.p = pdef multiply_fun(self,xlist):n = 1for x in xlist:n *= xreturn ndef fact_fun(self,n):if n == 0:return 1n += 1fact_list = [i for i in range(1,n)]fact_num = self.multiply_fun(fact_list)return fact_numdef c_n_x(self):fact_n = self.fact_fun(self.case_count)fact_x = self.fact_fun(self.real_count)fact_n_x = self.fact_fun(self.case_count - self.real_count)c_n_x_num = float(fact_n) / (fact_x * fact_n_x)return c_n_x_numdef binomial_fun(self):c_n_k_num = self.c_n_x()pi = (self.p ** self.real_count) * ((1 - self.p) ** (self.case_count - self.real_count))binomial_num = c_n_k_num * pireturn binomial_num# 从库里获取彩票信息def get_ball_infomation(start_dt,end_dt):conn = conn_db()sql = "select red_n,blue_n from tow_color_ball where date_format(open_date,'%%Y-%%m-%%d') >= %r and date_format(open_date,'%%Y-%%m-%%d') <= %r" %(start_d

首先声明,赌博一定不是什么好事,也完全没有意义,不要指望用彩票发财。之所以写这个,其实是用来练手的,可以参考这个来预测一些其他的东西,意在抛砖引玉。

啰嗦完了,马上开始,先上伪代码

打开网址

  读取内容内容解析

  根据源码得到需爬取内容

  1、开奖日期:2018年8月26日

  2、红球

                               

                               

                               

                               

                               

                               

  3、篮球

                                   

打开数据库连接

  爬取内容写入数据库

    共3个字段

    1、开奖日期

    2、红球,红球使用分号“;”分隔,方便调用和导出

    3、篮球

在写脚本前,建议先写伪代码,伪代码格式不是固定的,随自己喜好,主要就是在思维及算法落地前,把整个轮廓理清,可以有效降低都快写完了,发现前面有错误,结果导致整个脚本全部更新一遍这种事

的发生概率

伪代码解读:

    共分为两个功能块

        一就是抓取彩票数据,这个使用爬虫实现,分别抓取开奖日期、红球区、篮球区,因为考虑双色球的数据量比较庞大,所以这次使用数据库进行存储,选用的是免费又好用的MysqL数据库,数据库接口文件使用MysqLdb,这个我以后会单独写一个说明,当然你也可以用文档存储,或者选择别的数据库比如oracle或者nosql的mangodb

        二是用来分析彩票的,即使用彩票数据进行下一期的彩票预测,本次选用的是二项分布,这个在之前的算法里面有,就不重复说明了

下面先上脚本,再对脚本进行说明

<span >'''<span >
打开网址
读取内容
内容解析
根据源码得到需爬取内容
1、开奖日期:2018年8月26日
2、红球
<li >03
<li >07
<li >08
<li >14
<li >25
<li >32
3、篮球
<li >06
打开数据库连接
爬取内容写入数据库
共3个字段
1、开奖日期
2、红球,红球使用分号“;”分隔,方便调用和导出
3、篮球
create table tow_color_ball(open_date varchar(10),red_n varchar(20),blue_n varchar(2))
<span >'''

<span >import<span > urllib
<span >import<span > urllib2
<span >import<span > re
<span >import<span > numpy as np
<span >import<span > operator
<span >import<span > MysqLdb

<span >#<span > 连接MysqL
<span >def<span > conn_db():
db = <span >'<span >pythondb<span >'<span >
host = <span >'<span >localhost<span >'<span >
iuser = <span >'<span >xxx<span >'<span >
passwd = <span >'<span >xxxxxx<span >'<span >
conn = MysqLdb.connect(db = db,host = host,user = iuser,passwd =<span > passwd)
cursor =<span > conn.cursor()
<span >return<span > cursor

<span >#<span > 处理网页获取页面源码
<span >def<span > get_HTML_values(url):
url_open =<span > urllib.urlopen(url)
url_read =<span > url_open.read()
<span >return<span > url_read

<span >#<span > 处理源码,获取日期、红球、篮球
<span >def<span > manage_HTML(HTML_values):
red_no_re = re.compile(<span >'<span >(?<=\<li class\=\"ball_red\">)[0-9]+(?=\<\/li>)<span >'<span >)
blue_no_re = re.compile(<span >'<span >(?<=\<li class\=\"ball_blue\">)[0-9]+(?=\<\/li>)<span >'<span >)
date_re = re.compile(<span >'<span >(?<=开奖日期:)[0-9]+年[0-9]+月[0-9]+日<span >'<span >)
rednoList =<span > re.findall(red_no_re,HTML_values)
red_numbers = <span >'<span >;<span >'<span >.join(rednoList)
blue_number =<span > re.search(blue_no_re,HTML_values)
blue_number =<span > blue_number.group()
date_value =<span > re.search(date_re,HTML_values)
date_value =<span > date_value.group()
<span >return<span > date_value,red_numbers,blue_number

<span >#<span > 可恶的日期,竟然是YYYY年MM月DD日,需要改成YYYY-MM-DD
<span >def<span > manage_date(date_value):
date_value = date_value.replace(<span >'<span >年<span >',<span >'<span >-<span >').replace(<span >'<span >月<span >',<span >'<span >-<span >').replace(<span >'<span >日<span >',<span >''<span >)
<span >return<span > date_value

<span >#<span > 处理页面编号,每次编号-1,也就是说end_page要小于url中的页码
<span >def<span > get_page(url,end_page):
url_num = re.search(<span >'<span >(?<=\/)[0-9]+(?=.)<span >'<span >,url)
url_num =<span > url_num.group()
<span >if int(end_page) ><span > int(url_num):
<span >return <span >'<span >end<span >'<span >
url_num_1 = int(url_num) - 1<span >
url =<span > url.replace(url_num,str(url_num_1))
<span >return<span > url

<span >#<span > 查看库中是否已存在开奖日期,防止重复写入
<span >def<span > check_open_date(open_date):
conn =<span > conndb()
check
sql = <span >'<span >select 1 from tow_color_ball where open_date = %r<span >' %<span >opendate
conn.execute(check
sql)
excur =<span > conn.fetchall()
conn.close()
<span >#<span >如过未查到excur == ()
<span >return<span > excur

<span >#<span > 写入数据库
<span >def<span > write_db(date_value,blue_number):
conn =<span > conndb()
in
sql = <span >"<span >insert into tow_color_ball(open_date,red_n,blue_n) values(%r,%r,%r)<span >" %<span >(date_value,bluenumber)
conn.execute(in
sql)
conn.execute(<span >'<span >commit<span >'<span >)
conn.close()

<span >#<span > 彩票主程序,用来爬取彩票号码
<span >def<span > ball_main(url,end_page):
<span >while<span > True:
HTML_values =<span > get_HTML_values(url)
date_value,blue_number =<span > manage_HTML(HTML_values)
date_value =<span > manage_date(date_value)
data_check =<span > check_open_date(date_value)
<span >if data_check ==<span > ():
write_db(date_value,blue_number)
url =<span > get_page(url,end_page)
<span >if url == <span >'<span >end<span >'<span >:
<span >print <span >'<span >url_page已到达end_page,获取完成<span >'
<span >return<span > 0

<span >#<span > 二项分布算法
<span >class<span > binomial_class(object):
<span >def <span >init<span >(self,case_count,real_count,p):
self.case_count =<span > case_count
self.real_count =<span > real_count
self.p =<span > p

<span >def<span > multiply_fun(self,xList):
n = 1
<span >for x <span >in<span > xList:
n *=<span > x
<span >return<span > n

<span >def<span > fact_fun(self,n):
<span >if n ==<span > 0:
<span >return 1<span >
n += 1<span >
fact_List = [i <span >for i <span >in range(1<span >,n)]
fact_num =<span > self.multiplyfun(factList)
<span >return<span > fact_num

<span >def<span > c_n_x(self):
fact_n =<span > self.fact_fun(self.case_count)
fact_x =<span > self.fact_fun(self.real_count)
fact_n_x = self.fact_fun(self.case_count -<span > self.real_count)
c_n_x_num = float(fact_n) / (fact_x *<span > fact_n_x)
<span >return<span > c_n_x_num

<span >def<span > binomial_fun(self):
c_n_k_num =<span > self.c_n_x()
pi = (self.p * self.real_count) ((1 - self.p) * (self.case_count -<span > self.real_count))
binomial_num = c_n_k_num
<span > pi
<span >return<span > binomial_num

<span >#<span > 从库里获取彩票信息
<span >def<span > get_ball_infomation(start_dt,end_dt):
conn =<span > conn_db()
sql = <span >"<span >select red_n,blue_n from tow_color_ball where date_format(open_date,'%%Y-%%m-%%d') >= %r and date_format(open_date,'%%Y-%%m-%%d') <= %r<span >" %<span >(start_dt,end_dt)
conn.execute(sql)
excur =<span > conn.fetchall()
conn.close()
case_array =<span > np.array(excur)
row_count =<span > case_array.shape[0]
col_count = case_array.shape[1<span >]
red_ball_array =<span > case_array[:,0]
blue_ball_array = case_array[:,1<span >]
<span >return<span > red_ball_array,blue_ball_array,row_count,col_count

<span >#<span > 统计每个号码球的出现次数,这个应该在数据库里做,先放这,以后改
<span >def<span > every_ball_count(ballarray):
ball
List =<span > []
<span >for ball_char <span >in<span > ballarray:
ball
List += ball_char.split(<span >'<span >;<span >'<span >)
ball_count =<span > {}
<span >for ball_num <span >in<span > ball_List:
<span >if ball_num <span >in<span > ball_count:
ball_count[ball_num] += 1
<span >else<span >:
ball_count[ball_num] = ball_count.get(ball_num,0) + 1
<span >return<span > ball_count

<span >#<span > 数据分析主函数,样本量必须大于等于7,否则不进行处理
<span >def<span > analysis_main(start_dt,end_dt):
red_ball_array,col_count =<span > get_ball_infomation(start_dt,end_dt)
<span >if row_count < 7<span >:
<span >print <span >'<span >样本量不足以支持分析<span >'
<span >return 1<span >
red_count_dict =<span > every_ball_count(red_ball_array)
blue_count_dict =<span > every_ball_count(blue_ball_array)
<span >for red_case <span >in<span > red_count_dict:
red_rate = binomial_class((red_count_dict[red_case] + 1),(row_count + 1),0.5<span >)
red_count_dict[red_case] =<span > red_rate.binomial_fun()
<span >for blue_case <span >in<span > blue_count_dict:
blue_rate = binomial_class((blue_count_dict[blue_case] + 1),0.5<span >)
blue_count_dict[blue_case] =<span > blue_rate.binomial_fun()
sorted_red_count = sorted(red_count_dict.iteritems(),key=operator.itemgetter(1),reverse=<span >True)
sorted_blue_count = sorted(blue_count_dict.iteritems(),reverse=<span >True)
<span >print<span > sorted_blue_count[0]
<span >print <span >'<span >选择红球是:<span >'<span >
n = 1
<span >for key,value <span >in<span > sorted_red_count:
<span >if n == 7<span >:
<span >break
<span >print <span >'<span >%s,%s<span >' %<span >(key,str(value))
n += 1
<span >print <span >'<span >选择蓝球是<span >'
<span >print <span >'<span >%s,%s<span >' %(sorted_blue_count[0][0],str(sorted_blue_count[0][1<span >]))

<span >if <span >name == <span >'<span >main<span >'<span >:
n = <span >''
<span >while n != <span >'<span >1<span >' <span >or n != <span >'<span >2<span >'<span >:
inputn = rawinput(<span >'''<span >
请选择需要进行的功能
1、爬取页面的球号
2、进行球号分析
输入quit退出
请选择: <span >'''<span >)
<span >if input_n == <span >'<span >1<span >'<span >:
url = raw_input(<span >'''<span >
请输入需要爬取的地址(此为开始地址,因此建议选择页码较大的地址)
输入: <span >'''<span >)
endpage = rawinput(<span >'''<span >
输入结束页码
(注意:如果结束页码大于输入地址的页码,则不会爬取任何页面)
输入: <span >'''<span >)
ball_main(url,end_page)
<span >elif input_n == <span >'<span >2<span >'<span >:
analysis_main(<span >'<span >2018-08-15<span >',<span >'<span >2018-09-09<span >'<span >)
<span >elif input_n == <span >'<span >quit<span >'<span >:
exit(0)

脚本共分两个功能块,一个是爬虫,用来爬取双色球号码,另一个是分析,使用二项分布对已抓取数据进行概率计算

,依然是先观察页面

看过之前初级爬虫的同学应该对这个很熟悉,要爬的是1的地方,观察位置2和位置3,不难看出,每期占用一个页面,那么只要利用翻页,每次页码-1即可,下面看看1位置的源代码

在源码中搜索开奖号码,找到红圈位置,这个和伪代码中写的一样,现在看爬取正则

)

)

分别爬取红球,篮球,日期

,二项分布为方便管理,单独写了个类,以后也可以单独调用,这个用法我之前的文里面有说明,就不再说了。这里有几个功能说明下

结果是这样,看到概率最高的是2.34863516114e-08,这是一个科学技术法,大约是0.00000002349,也就是1/5000万,因此这个概率没有任何意义,当然你也可以尝试买2块钱的,买不中别赖我啊,哈哈

细心的同学可能注意到了,算出来的最后两个红球概率是一样的,举个例子C(5,2)其实和C(5,3)的组合数是一样的,那么二项分布的概率当然也一样,这样就需要用到泊松分布,加入历史平均值的计算,因为这个需要在库中单独建表,还没有时间做这个事,因此没有加入这项计算,如果各位有兴趣可以自己尝试把这块加上,等我有时间了,我也会把这个写出来完善下的

总结

以上是内存溢出为你收集整理的python写一个双色球彩票计算器全部内容,希望文章能够帮你解决python写一个双色球彩票计算器所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1208140.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-04
下一篇 2022-06-04

发表评论

登录后才能评论

评论列表(0条)

保存