python简易的大乐透数据获取及初步分析
Posted unknowcry
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python简易的大乐透数据获取及初步分析相关的知识,希望对你有一定的参考价值。
该项目从网上爬取并分析彩票数据,为用户查看和初步分析往期数据提供一种简易的工具。
https://github.com/unknowcry/Lottery
1 # -*- coding: utf-8 -*- 2 """ 3 @author UKC_unknowcry 4 @date 2020-4-12 5 @desc 彩票数据获取 6 @filename Lottery_data.py 7 tips: 8 数据来自:http://kaijiang.500.com 9 10 """ 11 12 import requests 13 import re 14 import random 15 import datetime 16 import threading 17 import time 18 from bs4 import BeautifulSoup 19 from fake_useragent import UserAgent 20 from concurrent.futures import ThreadPoolExecutor,as_completed 21 22 class Lottery: 23 """ 24 单一网页数据获取 25 """ 26 no=None 27 url=None 28 header=None 29 data=None 30 data_history=None 31 new_url=None 32 __threadlock=None 33 def __init__(self, no=None): 34 ‘‘‘ 35 :param no:期号 36 ‘‘‘ 37 if no == None: 38 self.no=None 39 else: 40 self.no=no 41 self.url=None 42 self.header=None 43 self.data=None 44 self.data_history=None 45 self.new_url=‘http://kaijiang.500.com/dlt.shtml‘ 46 self.threadlock=threading.Lock() 47 48 def set_header(self): 49 """ 50 随机生成ip,设置X-Forwarded-For 51 设置用户代理 52 :return: 53 """ 54 if self.header == None: 55 ua = UserAgent() 56 ip = ‘{}.{}.{}.{}‘.format(112, random.randint(64, 68), random.randint(0, 255), random.randint(0, 255)) 57 self.header={ 58 "X-Forwarded-For": ip, 59 "User-Agent":ua.random 60 } 61 else: 62 pass 63 64 def set_url(self): 65 """ 66 :return: 67 """ 68 self.url=‘http://kaijiang.500.com/shtml/dlt/{}.shtml?‘.format(self.no) 69 70 def get_response(self,url): 71 """ 72 链接测试 73 :return: get请求返回的response 74 """ 75 response = requests.get(url=url, headers=self.header) 76 return response 77 78 def get_html(self,response): 79 """ 80 :return: html文档 81 """ 82 try: 83 r=response 84 r.raise_for_status() 85 charset=re.search(re.compile(r‘charset=(w+)‘),r.text).group()[8:] 86 r.encoding=charset 87 return r.text 88 except Exception as err: 89 print(err) 90 return ‘‘ 91 92 def fill_data(self, soup): 93 """ 94 :param soup: 95 :return: 96 """ 97 try: 98 tableinfo=soup.find(‘table‘,‘kj_tablelist02‘) 99 response_no=re.findall(re.compile(r‘<font class="cfont2"><strong>(d+)</strong></font>‘),str(tableinfo))[0] 100 if int(response_no) != int(self.no): 101 raise Exception(‘期号错误,响应期号{0}不匹配请求期号{1}‘.format(response_no,self.no)) 102 else: 103 date_l=re.findall(re.compile(r‘(d+)年(d+)月(d+)日 兑奖截止日期:(d+)年(d+)月(d+)日</span></td>‘),str(tableinfo)) 104 date_start=datetime.date(int(date_l[0][0]),int(date_l[0][1]),int(date_l[0][2])) 105 date_end=datetime.date(int(date_l[0][3]),int(date_l[0][4]),int(date_l[0][5])) 106 nums=tuple(re.findall(re.compile(r‘>(dd)<‘),str(tableinfo))) 107 money_l=re.findall(r‘<span class="cfont1">(d+(.d+)?)‘,str(tableinfo)) 108 sale=money_l[0][0] 109 jackpot=money_l[1][0] 110 self.data=tuple((response_no,nums,date_start,date_end,sale,jackpot)) 111 except Exception as err: 112 print(err) 113 114 def get_newno(self): 115 """ 116 :return: bool,最新期号 117 """ 118 self.set_header() 119 response=self.get_response(self.new_url) 120 if response.status_code != 200: 121 print(‘error ‘,response.status_code,self.url) 122 return False,None 123 else: 124 soup=BeautifulSoup(self.get_html(response),‘html.parser‘) 125 tableinfo=soup.find(‘span‘,‘iSelectBox‘) 126 newno=re.findall(re.compile(r‘(ddddd)</a>‘),str(tableinfo))[0] 127 return True,newno 128 129 def get_nos(self): 130 """ 131 :return: 历史期号 132 """ 133 self.set_header() 134 response=self.get_response(self.new_url) 135 if response.status_code != 200: 136 print(‘error ‘,response.status_code,self.url) 137 else: 138 soup=BeautifulSoup(self.get_html(response),‘html.parser‘) 139 tableinfo=soup.find(‘span‘,‘iSelectBox‘) 140 nos=re.findall(re.compile(r‘(ddddd)</a>‘),str(tableinfo)) 141 return nos[1:] 142 143 def data_single(self,no=None): 144 """ 145 :return: bool,no期数据 146 """ 147 if no == None: 148 pass 149 else: 150 self.no=no 151 self.set_header() 152 self.set_url() 153 response=self.get_response(self.url) 154 if response.status_code != 200: 155 print(‘error ‘,response.status_code,self.url) 156 return False,None 157 else: 158 soup=BeautifulSoup(self.get_html(response),‘html.parser‘) 159 self.fill_data(soup) 160 return True,self.data 161 162 163 class Lottery_multi: 164 """ 165 多网页数据获取 166 """ 167 number=None 168 data=None 169 __threadlock=None 170 max_workers=None 171 nos=None 172 renos=None 173 list=None 174 def __init__(self,number=None,max_workers=8): 175 """ 176 :param number: 数量 177 :param max_workers=5:默认线程数 178 """ 179 self.number=number 180 self.data=set() 181 self.threadlock=threading.Lock() 182 self.max_workers=max_workers 183 self.nos=Lottery().get_nos() 184 if number != None: 185 self.nos=self.nos[:number] 186 self.renos=None 187 self.list=None 188 189 def thread_onedata(self,no): 190 """ 191 :param no: 期号 192 :return: 期号,bool 193 """ 194 a=Lottery() 195 data=a.data_single(no)[1] 196 if data == None: 197 flag=False 198 else: 199 flag=True 200 self.threadlock.acquire() 201 self.data.add(data) 202 self.threadlock.release() 203 return no,flag 204 205 def data_multi(self,number=None): 206 """ 207 :return: 历史数据 208 """ 209 self.data.clear() 210 nos=self.nos 211 with ThreadPoolExecutor(max_workers=self.max_workers) as t: 212 obj_list=[] 213 for i in nos: 214 obj=t.submit(self.thread_onedata,i) 215 obj_list.append(obj) 216 for future in as_completed(obj_list): 217 no,flag=future.result() 218 if flag: 219 print(‘thread‘,no,‘done‘) 220 else: 221 print(‘thread‘,no,‘failed‘) 222 self.check() 223 return self.data 224 225 def check_no(self,number=None): 226 """ 227 :param number: 期数量 228 :return: 未匹配期号列 229 """ 230 nos=self.nos 231 if number != None: 232 nos=nos[:number] 233 for data in self.data: 234 i=data[0] 235 nos.remove(i) 236 self.renos=nos 237 print(‘check_no done‘) 238 return nos 239 240 def adddata(self): 241 with ThreadPoolExecutor(max_workers=self.max_workers) as t: 242 obj_list=[] 243 for i in self.renos: 244 print(‘thread‘,i,‘restart‘) 245 obj=t.submit(self.thread_onedata,i) 246 obj_list.append(obj) 247 for future in as_completed(obj_list): 248 no,flag=future.result() 249 if flag: 250 print(‘thread‘,no,‘done‘) 251 else: 252 print(‘thread‘,no,‘failed‘) 253 print(‘adddata done‘) 254 255 def check(self): 256 self.check_no(self.number) 257 if len(self.renos)==0: 258 print(‘no done‘) 259 return True 260 else: 261 print(‘no‘,self.renos) 262 self.adddata() 263 self.check_no(self.number) 264 if len(self.renos)==0: 265 return True 266 else: 267 return False 268 269 def get_list(self): 270 """ 271 :return: 数据以顺序列表返回 272 """ 273 self.list=list(self.data) 274 self.list.sort(key=lambda x: x[0],reverse=True) 275 return self.list 276 277 if __name__ == "__main__": 278 time_start=time.time() 279 l=Lottery_multi(number=10,max_workers=5) 280 l.data_multi() 281 data=l.get_list() 282 data.sort(key=lambda x: x[0],reverse=True) 283 time_end=time.time() 284 for i in range(len(data)): 285 print(i+1,data[i]) 286 print(‘time‘,time_end-time_start)
1 # -*- coding: utf-8 -*- 2 """ 3 @auther UKC_unknowcry 4 @date 2020-4-18 5 @desc 简单的彩票分析及ui 6 @filename Lottery_ui.py 7 8 """ 9 10 import os 11 import sys 12 import datetime 13 import tkinter as tk 14 import tkinter.messagebox 15 import matplotlib 16 import matplotlib.pyplot as plt 17 import configparser 18 from tkinter import ttk 19 from Lottery_data import Lottery 20 from Lottery_data import Lottery_multi 21 from matplotlib.pyplot import MultipleLocator 22 from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg,NavigationToolbar2Tk 23 24 class window(): 25 """ 26 界面设计 27 """ 28 root=None 29 menubar=None 30 filemenu=None 31 windowmenu=None 32 statusbar=None 33 tabbar=None 34 tab_new=None 35 tab_history=None 36 canvas_number=None 37 canvas_position=None 38 39 data=None 40 data_no=0 41 data_number=0 42 data_date_start=0 43 data_date_end=0 44 data_sale=0 45 data_jackpot=0 46 data_query_no=0 47 data_query_number=0 48 data_query_date_start=0 49 data_query_date_end=0 50 data_query_sale=0 51 data_query_jackpot=0 52 data_newno=0 53 54 myfont=‘Arial‘ 55 56 def __init__(self): 57 """ 58 切换工作目录为文件目录 59 获取最新数据 60 加载组件 61 """ 62 path=os.path.realpath(__file__) 63 dirpath=os.path.dirname(path) 64 os.chdir(dirpath) 65 self.get_data_new() 66 self.set_root() 67 self.set_statusbar() 68 self.update_statusbar(‘准备中…‘) 69 self.set_menubar() 70 self.set_notebookbar() 71 self.update_statusbar() 72 73 #主窗口 74 def set_root(self): 75 self.root=tk.Tk() 76 self.root.title(‘超级大乐透‘) 77 try: 78 self.root.iconbitmap(‘icon.ico‘) 79 except: 80 pass 81 try: 82 config=configparser.ConfigParser() 83 config.read("Lottery_ui.conf") 84 # with open("Lottery_ui.conf", "r") as conf: 85 # alignstr=conf.read() 86 alignstr=config.get(‘window‘,‘geometry‘) 87 self.root.geometry(alignstr) 88 print(alignstr) 89 except Exception as err: 90 print(err) 91 self.reset_root_geometry() 92 self.root.resizable(width=True,height=True) 93 self.root.protocol(‘WM_DELETE_WINDOW‘,self.quit) 94 95 ‘‘‘控件‘‘‘ 96 #菜单栏 97 def set_menubar(self): 98 self.menubar=tk.Menu(self.root) 99 self.set_filemenu() 100 self.set_windowmenu() 101 self.root.config(menu=self.menubar) 102 103 #文件项 104 def set_filemenu(self): 105 self.filemenu=tk.Menu(self.menubar) 106 self.save=tk.Menu(self.filemenu) 107 self.save.add_command(label=‘按数分析‘,font=self.myfont,command=self.save_number) 108 self.save.add_command(label=‘按位分析‘,font=self.myfont,command=self.save_position) 109 self.filemenu.add_cascade(label=‘图片另存为‘,font=self.myfont,menu=self.save) 110 self.filemenu.add_command(label=‘退出‘,font=self.myfont,command=self.quit) 111 self.menubar.add_cascade(label=‘文件‘,font=self.myfont,menu=self.filemenu) 112 113 #窗口项 114 def set_windowmenu(self): 115 self.windowmenu=tk.Menu(self.menubar) 116 self.windowmenu.add_command(label=‘重置‘,font=self.myfont,command=self.reset_root_geometry) 117 self.menubar.add_cascade(label=‘窗口‘,font=self.myfont,menu=self.windowmenu) 118 119 #状态栏 120 def set_statusbar(self): 121 self.statusbar=tk.Label(self.root,text=‘状态‘,font=self.myfont,bd=1,relief=tk.SUNKEN,anchor=tk.W) 122 self.statusbar.pack(side=tk.BOTTOM,fill=tk.X) 123 124 #标签页 125 def set_notebookbar(self): 126 self.tab=ttk.Notebook(self.root) 127 self.set_tab_new() 128 self.set_tab_history() 129 self.set_tab_number() 130 self.set_tab_position() 131 self.tab.pack(expand=True,fill=‘both‘) 132 self.tab.select(self.tab_new) 133 134 #标签页-最新数据 135 def set_tab_new(self): 136 self.tab_new=tk.Frame(self.tab,bg=‘blue‘) 137 self.tab.add(self.tab_new,text=‘现在‘) 138 self.fill_tab_new() 139 140 #标签页-历史数据查询 141 def set_tab_history(self): 142 self.tab_history=tk.Frame(self.tab,bg=‘red‘) 143 self.tab.add(self.tab_history,text=‘历史‘) 144 self.fill_tab_history() 145 146 #标签页-按数分析 147 def set_tab_number(self): 148 self.tab_number=tk.Frame(self.tab) 149 self.tab.add(self.tab_number,text=‘按数分析‘) 150 self.fill_tab_number() 151 152 #标签页-按位分析 153 def set_tab_position(self): 154 self.tab_position=tk.Frame(self.tab) 155 self.tab.add(self.tab_position,text=‘按位分析‘) 156 self.fill_tab_position() 157 158 #小部件 159 #填充最新页 160 def fill_tab_new(self): 161 self.tab_new_no=tk.Label(self.tab_new,text=‘第‘+str(self.data_no)+‘期‘,bg=‘orange‘,font=(self.myfont, 14)) 162 self.tab_new_no.pack(side=‘top‘,fill=‘x‘) 163 if type(self.data_number)==tuple: 164 self.tab_new_number=tk.Label(self.tab_new,text=‘开奖号码‘+‘{0}-{1}-{2}-{3}-{4}-{5}-{6}‘.format(self.data_tmp_number[0], 165 self.data_tmp_number[1],self.data_tmp_number[2],self.data_tmp_number[3],self.data_tmp_number[4], 166 self.data_tmp_number[5],self.data_tmp_number[6]),bg=‘pink‘,font=(self.myfont, 14)) 167 else: 168 tkinter.messagebox.showerror(‘error‘,‘数据错误‘) 169 self.tab_new_number=tk.Label(self.tab_new,text=‘开奖号码‘+str(self.data_number),bg=‘pink‘,font=(self.myfont, 14)) 170 self.tab_new_number.pack(side=‘top‘,fill=‘x‘) 171 self.tab_new_date_start=tk.Label(self.tab_new,text=‘开奖日期‘+str(self.data_date_start),bg=‘pink‘,font=(self.myfont, 14)) 172 self.tab_new_date_start.pack(side=‘top‘,fill=‘x‘) 173 self.tab_new_date_end=tk.Label(self.tab_new,text=‘兑奖截止‘+str(self.data_date_end),bg=‘pink‘,font=(self.myfont, 14)) 174 self.tab_new_date_end.pack(side=‘top‘,fill=‘x‘) 175 self.tab_new_sale=tk.Label(self.tab_new,text=‘销售金额‘+str(self.data_sale)+‘亿‘,bg=‘pink‘,font=(self.myfont, 14)) 176 self.tab_new_sale.pack(side=‘top‘,fill=‘x‘) 177 self.tab_new_jackpot=tk.Label(self.tab_new,text=‘奖池滚存‘+str(self.data_jackpot)+‘亿‘,bg=‘pink‘,font=(self.myfont, 14)) 178 self.tab_new_jackpot.pack(side=‘top‘,fill=‘x‘) 179 180 #填充历史页 181 def fill_tab_history(self): 182 self.tab_history_query=tk.Frame(self.tab_history,bg=‘blue‘) 183 self.tab_history_query.pack(side=‘top‘,fill=‘x‘) 184 self.tab_history_label=tk.Label(self.tab_history_query,text=‘输入期号‘,bd=1,font=self.myfont) 185 self.tab_history_label.pack(side=‘left‘) 186 self.tab_history_btn=tk.Button(self.tab_history_query,text=‘搜索‘,bd=1,font=self.myfont,command=lambda :self.tab_history_search(self.tab_history_entry.get())) 187 self.tab_history_btn.pack(side=‘right‘) 188 self.tab_history_entry=tk.Entry(self.tab_history_query,bd=3,font=self.myfont) 189 self.tab_history_entry.pack(side=‘left‘,fill=‘x‘) 190 self.tab_history_frame=tk.Frame(self.tab_history,bg=‘pink‘) 191 self.tab_history_frame.pack(side=‘top‘,fill=‘x‘) 192 self.tab_history_no=tk.Label(self.tab_history_frame,text=‘第‘+str(self.data_query_no)+‘期‘,bg=‘orange‘,font=(self.myfont, 14)) 193 self.tab_history_no.pack(side=‘top‘,fill=‘x‘) 194 self.tab_history_number=tk.Label(self.tab_history_frame,text=‘开奖号码‘+str(self.data_query_number),bg=‘pink‘,font=(self.myfont, 14)) 195 self.tab_history_number.pack(side=‘top‘,fill=‘x‘) 196 self.tab_history_date_start=tk.Label(self.tab_history_frame,text=‘开奖日期‘+str(self.data_query_date_start),bg=‘pink‘,font=(self.myfont, 14)) 197 self.tab_history_date_start.pack(side=‘top‘,fill=‘x‘) 198 self.tab_history_date_end=tk.Label(self.tab_history_frame,text=‘兑奖截止‘+str(self.data_query_date_end),bg=‘pink‘,font=(self.myfont, 14)) 199 self.tab_history_date_end.pack(side=‘top‘,fill=‘x‘) 200 self.tab_history_sale=tk.Label(self.tab_history_frame,text=‘销售金额‘+str(self.data_query_sale)+‘亿‘,bg=‘pink‘,font=(self.myfont, 14)) 201 self.tab_history_sale.pack(side=‘top‘,fill=‘x‘) 202 self.tab_history_jackpot=tk.Label(self.tab_history_frame,text=‘奖池滚存‘+str(self.data_query_jackpot)+‘亿‘,bg=‘pink‘,font=(self.myfont, 14)) 203 self.tab_history_jackpot.pack(side=‘top‘,fill=‘x‘) 204 205 #填充按数分析 206 def fill_tab_number(self): 207 self.tab_number_query=tk.Frame(self.tab_number,bg=‘blue‘) 208 self.tab_number_query.pack(side=‘top‘,fill=‘x‘) 209 self.tab_number_label=tk.Label(self.tab_number_query,text=‘最近‘,bd=1,font=self.myfont) 210 self.tab_number_label.pack(side=‘left‘) 211 self.tab_number_btn=tk.Button(self.tab_number_query,text=‘生成‘,bd=1,font=self.myfont,command=self.tab_number_search) 212 self.tab_number_btn.pack(side=‘right‘) 213 self.tab_number_entry=tk.Entry(self.tab_number_query,bd=3,font=self.myfont) 214 self.tab_number_entry.pack(side=‘left‘,fill=‘x‘) 215 self.tab_number_label2=tk.Label(self.tab_number_query,text=‘期‘,bd=1,font=self.myfont) 216 self.tab_number_label2.pack(side=‘left‘) 217 self.tab_number_frame=tk.Frame(self.tab_number,bg=‘pink‘) 218 self.tab_number_frame.pack(side=‘top‘,fill=‘both‘) 219 220 #填充按位分析 221 def fill_tab_position(self): 222 self.tab_position_query=tk.Frame(self.tab_position,bg=‘blue‘) 223 self.tab_position_query.pack(side=‘top‘,fill=‘x‘) 224 self.tab_position_label=tk.Label(self.tab_position_query,text=‘最近‘,bd=1,font=self.myfont) 225 self.tab_position_label.pack(side=‘left‘) 226 self.tab_position_btn=tk.Button(self.tab_position_query,text=‘生成‘,bd=1,font=self.myfont,command=self.tab_position_search) 227 self.tab_position_btn.pack(side=‘right‘) 228 self.tab_position_entry=tk.Entry(self.tab_position_query,bd=3,font=self.myfont) 229 self.tab_position_entry.pack(side=‘left‘,fill=‘x‘) 230 self.tab_position_label=tk.Label(self.tab_position_query,text=‘期‘,bd=1,font=self.myfont) 231 self.tab_position_label.pack(side=‘left‘) 232 self.tab_position_frame=tk.Frame(self.tab_position,bg=‘pink‘) 233 self.tab_position_frame.pack(side=‘top‘,fill=‘both‘) 234 235 ‘‘‘事件‘‘‘ 236 237 #重置窗口大小和位置 238 def reset_root_geometry(self): 239 width=380 240 height=300 241 screenwidth=self.root.winfo_screenwidth() 242 screenheight=self.root.winfo_screenheight() 243 alignstr=‘{}x{}+{}+{}‘.format(width,height,int((screenwidth-width)/2),int((screenheight-height)/2)) 244 self.root.geometry(alignstr) 245 config=configparser.ConfigParser() 246 config[‘window‘]={‘geometry‘:‘{}‘.format(self.root.geometry())} 247 with open("Lottery_ui.conf", "w") as conf: 248 config.write(conf) 249 250 #查询某期,并重新填充历史页 251 def tab_history_search(self,no): 252 self.update_statusbar(‘查询中…‘) 253 if self.get_data_single(no): 254 self.tab_history_no[‘text‘]=‘第‘+‘{:0^4}‘.format(self.data_tmp_no)+‘期‘ 255 self.tab_history_number[‘text‘]=‘开奖号码‘+‘{0}-{1}-{2}-{3}-{4}-{5}-{6}‘.format(self.data_tmp_number[0],self.data_tmp_number[1], 256 self.data_tmp_number[2],self.data_tmp_number[3],self.data_tmp_number[4],self.data_tmp_number[5],self.data_tmp_number[6]) 257 self.tab_history_date_start[‘text‘]=‘开奖日期‘+‘{}‘.format(self.data_tmp_date_start) 258 self.tab_history_date_end[‘text‘]=‘兑奖截止‘+‘{}‘.format(self.data_tmp_date_end) 259 self.tab_history_sale[‘text‘]=‘销售金额‘+‘{}‘.format(self.data_tmp_sale)+‘亿‘ 260 self.tab_history_jackpot[‘text‘]=‘奖池滚存‘+‘{}‘.format(self.data_tmp_jackpot)+‘亿‘ 261 self.update_statusbar() 262 else: 263 tkinter.messagebox.showerror(‘error‘,‘数据错误‘) 264 self.update_statusbar(‘就绪‘) 265 266 #生成按数分析的图形 267 def tab_number_search(self): 268 self.update_statusbar(‘生成中…‘) 269 self.tab_number_frame.destroy() 270 self.tab_number_frame=tk.Frame(self.tab_number,bg=‘pink‘) 271 self.tab_number_frame.pack(side=‘top‘,fill=‘both‘) 272 no_number=str(self.tab_number_entry.get()) 273 if no_number.isdigit(): 274 nums=self.get_number_rate(int(no_number)) 275 self.draw_number_rate(nums) 276 self.update_statusbar() 277 else: 278 tkinter.messagebox.showerror(‘error‘,‘输入数字‘) 279 self.update_statusbar(‘就绪‘) 280 281 #生成按位分析的图形 282 def tab_position_search(self): 283 self.update_statusbar(‘生成中…‘) 284 self.tab_position_frame.destroy() 285 self.tab_position_frame=tk.Frame(self.tab_position,bg=‘pink‘) 286 self.tab_position_frame.pack(side=‘top‘,fill=‘both‘) 287 pos=str(self.tab_position_entry.get()) 288 if pos.isdigit(): 289 nums=self.get_number_line(no_number=int(pos)) 290 self.draw_number_line(nums) 291 self.update_statusbar() 292 else: 293 tkinter.messagebox.showerror(‘error‘,‘输入正确的期号‘) 294 self.update_statusbar(‘就绪‘) 295 296 #保存按数分析的图形 297 def save_number(self): 298 fname = tkinter.filedialog.asksaveasfilename(title=u‘保存文件‘, filetypes=[("PNG", ".png")]) 299 if fname !=None and fname!=‘‘: 300 filename, _ = os.path.splitext(fname) 301 self.canvas_number.print_png(‘{}.png‘.format(str(filename))) 302 303 #保存按位分析的图形 304 def save_position(self): 305 fname = tkinter.filedialog.asksaveasfilename(title=u‘保存文件‘, filetypes=[("PNG", ".png")]) 306 if fname !=None and fname!=‘‘: 307 filename, _ = os.path.splitext(fname) 308 self.canvas_position.print_png(‘{}.png‘.format(str(filename))) 309 310 #退出 311 def quit(self): 312 quit=tkinter.messagebox.askokcancel(‘tip‘,‘sure to exit?‘) 313 if quit == True: 314 self.update_statusbar(‘退出…‘) 315 config=configparser.ConfigParser() 316 config[‘window‘]={‘geometry‘:‘{}‘.format(self.root.geometry())} 317 with open("Lottery_ui.conf", "w") as conf: 318 # conf.write(self.root.geometry()) 319 config.write(conf) 320 self.root.destroy() 321 sys.exit(0) 322 323 ‘‘‘操作‘‘‘ 324 #更新状态栏 325 def update_statusbar(self,text=‘就绪‘): 326 self.statusbar[‘text‘]=str(text) 327 self.statusbar.update() 328 print(self.statusbar[‘text‘]) 329 330 #数据 331 #获取最新数据 332 def get_data_new(self): 333 """ 334 :return: bool 335 """ 336 flag=self.get_data_newno() 337 if flag: 338 flag=self.get_data_single(no=self.data_newno) 339 if flag: 340 self.data_no=self.data_tmp_no 341 self.data_number=self.data_tmp_number 342 self.data_date_start=self.data_tmp_date_start 343 self.data_date_end=self.data_tmp_date_end 344 self.data_sale=self.data_tmp_sale 345 self.data_jackpot=self.data_tmp_jackpot 346 return True 347 else: 348 return False 349 else: 350 return False 351 352 #获取指定某期数据 353 def get_data_single(self,no): 354 """ 355 :param no: 期号 356 :return: bool 357 """ 358 flag,lot=Lottery().data_single(no) 359 if flag==False: 360 return False 361 self.data_tmp_no=lot[0] 362 self.data_tmp_number=lot[1] 363 self.data_tmp_date_start=lot[2] 364 self.data_tmp_date_end=lot[3] 365 self.data_tmp_sale=lot[4] 366 self.data_tmp_jackpot=lot[5] 367 if self.data_tmp_number!=None: 368 return True 369 else: 370 return False 371 372 #获取最新期号 373 def get_data_newno(self): 374 """ 375 :return: bool 376 """ 377 flag,newno=Lottery().get_newno() 378 if flag==False: 379 return False 380 else: 381 self.data_newno=int(newno) 382 return True 383 384 #获取多期数据 385 def get_data_multi(self,number): 386 """ 387 :param number: 期数量 388 :return: 开奖号码 389 """ 390 lotm=Lottery_multi(number,max_workers=7) 391 lotm.data_multi() 392 datas=lotm.get_list() 393 numbers=[] 394 for data in datas: 395 numbers.append(data[1]) 396 for number in numbers: 397 print(number) 398 return numbers 399 400 #按频次分析号码 401 def get_number_rate(self, no_number): 402 """ 403 :param no_number: 期数量 404 :return: 按顺序的号码频次 405 """ 406 nums=[] 407 for _ in range(35): 408 nums.append(0) 409 numbers=self.get_data_multi(no_number) 410 for number in numbers: 411 for i in number: 412 nums[int(i)-1]=nums[int(i)-1]+1 413 print(nums) 414 return nums 415 416 #按各个位置的号码分析 417 def get_number_line(self,no_number): 418 """ 419 :param no_number: 期数量 420 :return: 各个位置的号码变化 421 """ 422 nums=[[],[],[],[],[],[],[]] 423 numbers=self.get_data_multi(no_number) 424 for i in range(len(numbers)): 425 for j in range(7): 426 nums[j].append(int(numbers[i][j])) 427 print(nums) 428 return nums 429 430 #图形 431 #生成频次图 432 def draw_number_rate(self,nums): 433 """ 434 :param nums: 数据列表 435 """ 436 self.figure_number=plt.figure() 437 plt.barh(range(35),nums,height=0.8,color=‘steelblue‘,alpha=0.8) 438 plt.yticks(range(35),list(range(1,36))) 439 for x,y in enumerate(nums): 440 plt.text(y,x,‘{}‘.format(y)) 441 # plt.show() 442 self.canvas_number=FigureCanvasTkAgg(self.figure_number,self.tab_number_frame) 443 self.canvas_number.draw() 444 self.canvas_number.get_tk_widget().pack(side=tk.TOP,fill=tk.BOTH,expand=1) 445 446 #生成折线图 447 def draw_number_line(self,nums): 448 """ 449 :param nums: 数据列表 450 """ 451 self.figure_position=plt.figure() 452 plt.plot(nums[0],label=‘1‘) 453 plt.plot(nums[1],label=‘2‘) 454 plt.plot(nums[2],label=‘3‘) 455 plt.plot(nums[3],label=‘4‘) 456 plt.plot(nums[4],label=‘5‘) 457 plt.plot(nums[5],label=‘6‘) 458 plt.plot(nums[6],label=‘7‘) 459 plt.legend(loc=‘best‘) 460 ax=plt.gca() 461 ax.xaxis.set_major_locator(MultipleLocator(1)) 462 ax.yaxis.set_major_locator(MultipleLocator(1)) 463 self.canvas_position=FigureCanvasTkAgg(self.figure_position,self.tab_position_frame) 464 self.canvas_position.draw() 465 self.canvas_position.get_tk_widget().pack(side=tk.TOP,fill=tk.BOTH,expand=1) 466 467 468 ‘‘‘外部调用‘‘‘ 469 #运行 470 def run(self): 471 self.root.mainloop() 472 473 if __name__ == "__main__": 474 w=window() 475 w.run()
以上是关于python简易的大乐透数据获取及初步分析的主要内容,如果未能解决你的问题,请参考以下文章