python写⼀个双⾊球计算器
⾸先声明,赌博⼀定不是什么好事,也完全没有意义,不要指望⽤发财。之所以写这个,其实是⽤来练⼿的,可以参考这个来预测⼀些其他的东西,意在抛砖引⽟。
啰嗦完了,马上开始,先上伪代码
打开⽹址
读取内容
内容解析
根据源码得到需爬取内容
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
'''
打开⽹址
读取内容
内容解析
根据源码得到需爬取内容
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 urllib
import urllib2
import re
import numpy as np
import operator
import MySQLdb
# 连接mysql
def conn_db():
网页计算器html代码db = 'pythondb'
host = 'localhost'
iuser = 'xxx'
passwd = 'xxxxxx'
conn = t(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 = ad()
return url_read
# 处理源码,获取⽇期、红球、篮球
def manage_html(html_values):
red_no_re = repile('(?<=\<li class\=\"ball_red\"\>)[0-9]+(?=\<\/li\>)')
blue_no_re = repile('(?<=\<li class\=\"ball_blue\"\>)[0-9]+(?=\<\/li\>)')
date_re = repile('(?<=开奖⽇期:)[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 = up()
date_value = re.search(date_re,html_values)
date_value = up()
return date_value, red_numbers, blue_number
# 可恶的⽇期,竟然是YYYY年MM⽉DD⽇,需要改成YYYY-MM-DD
def manage_date(date_value):
date_value = place('年','-').replace('⽉','-').replace('⽇','')
# 处理页⾯编号,每次编号-1,也就是说end_page要⼩于url中的页码
def get_page(url,end_page):
url_num = re.search('(?<=\/)[0-9]+(?=\.)',url)
url_num = up()
if int(end_page) > int(url_num):
return'end'
url_num_1 = int(url_num) - 1
url = place(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_date
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) ute(in_sql)
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_count
self.p = p
def multiply_fun(self,xlist):
n = 1
for x in xlist:
n *= x
return n
def fact_fun(self,n):
if n == 0:
return 1
n += 1
fact_list = [i for i in range(1,n)]
fact_num = self.multiply_fun(fact_list)
return fact_num
fact_n = self.fact_fun(self.case_count)
fact_x = self.fact_al_count)
fact_n_x = self.fact_fun(self.case_count - al_count)
c_n_x_num = float(fact_n) / (fact_x * fact_n_x)
return c_n_x_num
def binomial_fun(self):
c_n_k_num = self.c_n_x()
pi = (self.p ** al_count) * ((1 - self.p) ** (self.case_count - al_count))
binomial_num = c_n_k_num * pi
return 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_dt,end_dt)
excur = conn.fetchall()
conn.close()
case_array = np.array(excur)
row_count = case_array.shape[0]
col_count = case_array.shape[1]
red_ball_array = case_array[:,0]
blue_ball_array = case_array[:,1]
return red_ball_array,blue_ball_array,row_count,col_count
# 统计每个号码球的出现次数,这个应该在数据库⾥做,先放这,以后改
def every_ball_count(ball_array):
ball_list = []
for ball_char in ball_array:
ball_list += ball_char.split(';')
ball_count = {}
for ball_num in ball_list:
if ball_num in ball_count:
ball_count[ball_num] += 1
else:
ball_count[ball_num] = (ball_num,0) + 1
return ball_count
# 数据分析主函数,样本量必须⼤于等于7,否则不进⾏处理
def analysis_main(start_dt,end_dt):
red_ball_array,blue_ball_array,row_count,col_count = get_ball_infomation(start_dt,end_dt)
if row_count < 7:
print'样本量不⾜以⽀持分析'
return 1
red_count_dict = every_ball_count(red_ball_array)
blue_count_dict = every_ball_count(blue_ball_array)
for red_case in red_count_dict:
red_rate = binomial_class((red_count_dict[red_case] + 1),(row_count + 1),0.5)
red_count_dict[red_case] = red_rate.binomial_fun()
for blue_case in blue_count_dict:
blue_rate = binomial_class((blue_count_dict[blue_case] + 1),(row_count + 1),0.5)
blue_count_dict[blue_case] = blue_rate.binomial_fun()
sorted_red_count = sorted(red_count_dict.iteritems(),key=operator.itemgetter(1),reverse=True)
sorted_blue_count = sorted(blue_count_dict.iteritems(),key=operator.itemgetter(1),reverse=True)
print sorted_blue_count[0]
print'选择红球是:'
n = 1
for key,value in sorted_red_count:
if n == 7:
break
print'%s,%s' %(key,str(value))
n += 1
if__name__ == '__main__':
n = ''
while n != '1'or n != '2':
input_n = raw_input('''
请选择需要进⾏的功能
1、爬取页⾯的球号
2、进⾏球号分析
输⼊quit退出
请选择: ''')
if input_n == '1':
url = raw_input('''
请输⼊需要爬取的地址(此为开始地址,因此建议选择页码较⼤的地址)
输⼊: ''')
end_page = raw_input('''
输⼊结束页码
(注意:如果结束页码⼤于输⼊地址的页码,则不会爬取任何页⾯)
输⼊: ''')
ball_main(url,end_page)
elif input_n == '2':
analysis_main('2018-08-15','2018-09-09')
elif input_n == 'quit':
exit(0)
脚本共分两个功能块,⼀个是爬⾍,⽤来爬取双⾊球号码,另⼀个是分析,使⽤⼆项分布对已抓取数据进⾏概率计算
先说说爬⾍,依然是先观察页⾯
看过之前初级爬⾍的同学应该对这个很熟悉,要爬的是1的地⽅,观察位置2和位置3,不难看出,每期占⽤⼀个页⾯,那么只要利⽤翻页,每次页码-1即可,下⾯看看1位置的源代码
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论