python简易的大乐透数据获取及初步分析
该项目从网上爬取并分析彩票数据,为用户查看和初步分析往期数据提供一种简易的工具。
https://github.com/unknowcry/Lottery
# -*- coding: utf-8 -*-
"""
@author UKC_unknowcry
@date 2020-4-12
@desc 彩票数据获取
@filename Lottery_data.py
tips:
数据来自:http://kaijiang.500.com """ import requests
import re
import random
import datetime
import threading
import time
from bs4 import BeautifulSoup
from fake_useragent import UserAgent
from concurrent.futures import ThreadPoolExecutor,as_completed class Lottery:
"""
单一网页数据获取
"""
no=None
url=None
header=None
data=None
data_history=None
new_url=None
__threadlock=None
def __init__(self, no=None):
'''
:param no:期号
'''
if no == None:
self.no=None
else:
self.no=no
self.url=None
self.header=None
self.data=None
self.data_history=None
self.new_url='http://kaijiang.500.com/dlt.shtml'
self.threadlock=threading.Lock() def set_header(self):
"""
随机生成ip,设置X-Forwarded-For
设置用户代理
:return:
"""
if self.header == None:
ua = UserAgent()
ip = '{}.{}.{}.{}'.format(112, random.randint(64, 68), random.randint(0, 255), random.randint(0, 255))
self.header={
"X-Forwarded-For": ip,
"User-Agent":ua.random
}
else:
pass def set_url(self):
"""
:return:
"""
self.url='http://kaijiang.500.com/shtml/dlt/{}.shtml?'.format(self.no) def get_response(self,url):
"""
链接测试
:return: get请求返回的response
"""
response = requests.get(url=url, headers=self.header)
return response def get_html(self,response):
"""
:return: html文档
"""
try:
r=response
r.raise_for_status()
charset=re.search(re.compile(r'charset=(\w+)'),r.text).group()[8:]
r.encoding=charset
return r.text
except Exception as err:
print(err)
return '' def fill_data(self, soup):
"""
:param soup:
:return:
"""
try:
tableinfo=soup.find('table','kj_tablelist02')
response_no=re.findall(re.compile(r'<font class="cfont2"><strong>(\d+)</strong></font>'),str(tableinfo))[0]
if int(response_no) != int(self.no):
raise Exception('期号错误,响应期号{0}不匹配请求期号{1}'.format(response_no,self.no))
else:
date_l=re.findall(re.compile(r'(\d+)年(\d+)月(\d+)日 兑奖截止日期:(\d+)年(\d+)月(\d+)日</span></td>'),str(tableinfo))
date_start=datetime.date(int(date_l[0][0]),int(date_l[0][1]),int(date_l[0][2]))
date_end=datetime.date(int(date_l[0][3]),int(date_l[0][4]),int(date_l[0][5]))
nums=tuple(re.findall(re.compile(r'>(\d\d)<'),str(tableinfo)))
money_l=re.findall(r'<span class="cfont1">(\d+(\.\d+)?)',str(tableinfo))
sale=money_l[0][0]
jackpot=money_l[1][0]
self.data=tuple((response_no,nums,date_start,date_end,sale,jackpot))
except Exception as err:
print(err) def get_newno(self):
"""
:return: bool,最新期号
"""
self.set_header()
response=self.get_response(self.new_url)
if response.status_code != 200:
print('error\n',response.status_code,self.url)
return False,None
else:
soup=BeautifulSoup(self.get_html(response),'html.parser')
tableinfo=soup.find('span','iSelectBox')
newno=re.findall(re.compile(r'(\d\d\d\d\d)</a>'),str(tableinfo))[0]
return True,newno def get_nos(self):
"""
:return: 历史期号
"""
self.set_header()
response=self.get_response(self.new_url)
if response.status_code != 200:
print('error\n',response.status_code,self.url)
else:
soup=BeautifulSoup(self.get_html(response),'html.parser')
tableinfo=soup.find('span','iSelectBox')
nos=re.findall(re.compile(r'(\d\d\d\d\d)</a>'),str(tableinfo))
return nos[1:] def data_single(self,no=None):
"""
:return: bool,no期数据
"""
if no == None:
pass
else:
self.no=no
self.set_header()
self.set_url()
response=self.get_response(self.url)
if response.status_code != 200:
print('error\n',response.status_code,self.url)
return False,None
else:
soup=BeautifulSoup(self.get_html(response),'html.parser')
self.fill_data(soup)
return True,self.data class Lottery_multi:
"""
多网页数据获取
"""
number=None
data=None
__threadlock=None
max_workers=None
nos=None
renos=None
list=None
def __init__(self,number=None,max_workers=8):
"""
:param number: 数量
:param max_workers=5:默认线程数
"""
self.number=number
self.data=set()
self.threadlock=threading.Lock()
self.max_workers=max_workers
self.nos=Lottery().get_nos()
if number != None:
self.nos=self.nos[:number]
self.renos=None
self.list=None def thread_onedata(self,no):
"""
:param no: 期号
:return: 期号,bool
"""
a=Lottery()
data=a.data_single(no)[1]
if data == None:
flag=False
else:
flag=True
self.threadlock.acquire()
self.data.add(data)
self.threadlock.release()
return no,flag def data_multi(self,number=None):
"""
:return: 历史数据
"""
self.data.clear()
nos=self.nos
with ThreadPoolExecutor(max_workers=self.max_workers) as t:
obj_list=[]
for i in nos:
obj=t.submit(self.thread_onedata,i)
obj_list.append(obj)
for future in as_completed(obj_list):
no,flag=future.result()
if flag:
print('thread',no,'done')
else:
print('thread',no,'failed')
self.check()
return self.data def check_no(self,number=None):
"""
:param number: 期数量
:return: 未匹配期号列
"""
nos=self.nos
if number != None:
nos=nos[:number]
for data in self.data:
i=data[0]
nos.remove(i)
self.renos=nos
print('check_no done')
return nos def adddata(self):
with ThreadPoolExecutor(max_workers=self.max_workers) as t:
obj_list=[]
for i in self.renos:
print('thread',i,'restart')
obj=t.submit(self.thread_onedata,i)
obj_list.append(obj)
for future in as_completed(obj_list):
no,flag=future.result()
if flag:
print('thread',no,'done')
else:
print('thread',no,'failed')
print('adddata done') def check(self):
self.check_no(self.number)
if len(self.renos)==0:
print('no done')
return True
else:
print('no',self.renos)
self.adddata()
self.check_no(self.number)
if len(self.renos)==0:
return True
else:
return False def get_list(self):
"""
:return: 数据以顺序列表返回
"""
self.list=list(self.data)
self.list.sort(key=lambda x: x[0],reverse=True)
return self.list if __name__ == "__main__":
time_start=time.time()
l=Lottery_multi(number=10,max_workers=5)
l.data_multi()
data=l.get_list()
data.sort(key=lambda x: x[0],reverse=True)
time_end=time.time()
for i in range(len(data)):
print(i+1,data[i])
print('time',time_end-time_start)
# -*- coding: utf-8 -*-
"""
@auther UKC_unknowcry
@date 2020-4-18
@desc 简单的彩票分析及ui
@filename Lottery_ui.py """ import os
import sys
import datetime
import tkinter as tk
import tkinter.messagebox
import matplotlib
import matplotlib.pyplot as plt
import configparser
from tkinter import ttk
from Lottery_data import Lottery
from Lottery_data import Lottery_multi
from matplotlib.pyplot import MultipleLocator
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg,NavigationToolbar2Tk class window():
"""
界面设计
"""
root=None
menubar=None
filemenu=None
windowmenu=None
statusbar=None
tabbar=None
tab_new=None
tab_history=None
canvas_number=None
canvas_position=None data=None
data_no=0
data_number=0
data_date_start=0
data_date_end=0
data_sale=0
data_jackpot=0
data_query_no=0
data_query_number=0
data_query_date_start=0
data_query_date_end=0
data_query_sale=0
data_query_jackpot=0
data_newno=0 myfont='Arial' def __init__(self):
"""
切换工作目录为文件目录
获取最新数据
加载组件
"""
path=os.path.realpath(__file__)
dirpath=os.path.dirname(path)
os.chdir(dirpath)
self.get_data_new()
self.set_root()
self.set_statusbar()
self.update_statusbar('准备中…')
self.set_menubar()
self.set_notebookbar()
self.update_statusbar() #主窗口
def set_root(self):
self.root=tk.Tk()
self.root.title('超级大乐透')
try:
self.root.iconbitmap('icon.ico')
except:
pass
try:
config=configparser.ConfigParser()
config.read("Lottery_ui.conf")
# with open("Lottery_ui.conf", "r") as conf:
# alignstr=conf.read()
alignstr=config.get('window','geometry')
self.root.geometry(alignstr)
print(alignstr)
except Exception as err:
print(err)
self.reset_root_geometry()
self.root.resizable(width=True,height=True)
self.root.protocol('WM_DELETE_WINDOW',self.quit) '''控件'''
#菜单栏
def set_menubar(self):
self.menubar=tk.Menu(self.root)
self.set_filemenu()
self.set_windowmenu()
self.root.config(menu=self.menubar) #文件项
def set_filemenu(self):
self.filemenu=tk.Menu(self.menubar)
self.save=tk.Menu(self.filemenu)
self.save.add_command(label='按数分析',font=self.myfont,command=self.save_number)
self.save.add_command(label='按位分析',font=self.myfont,command=self.save_position)
self.filemenu.add_cascade(label='图片另存为',font=self.myfont,menu=self.save)
self.filemenu.add_command(label='退出',font=self.myfont,command=self.quit)
self.menubar.add_cascade(label='文件',font=self.myfont,menu=self.filemenu) #窗口项
def set_windowmenu(self):
self.windowmenu=tk.Menu(self.menubar)
self.windowmenu.add_command(label='重置',font=self.myfont,command=self.reset_root_geometry)
self.menubar.add_cascade(label='窗口',font=self.myfont,menu=self.windowmenu) #状态栏
def set_statusbar(self):
self.statusbar=tk.Label(self.root,text='状态',font=self.myfont,bd=1,relief=tk.SUNKEN,anchor=tk.W)
self.statusbar.pack(side=tk.BOTTOM,fill=tk.X) #标签页
def set_notebookbar(self):
self.tab=ttk.Notebook(self.root)
self.set_tab_new()
self.set_tab_history()
self.set_tab_number()
self.set_tab_position()
self.tab.pack(expand=True,fill='both')
self.tab.select(self.tab_new) #标签页-最新数据
def set_tab_new(self):
self.tab_new=tk.Frame(self.tab,bg='blue')
self.tab.add(self.tab_new,text='现在')
self.fill_tab_new() #标签页-历史数据查询
def set_tab_history(self):
self.tab_history=tk.Frame(self.tab,bg='red')
self.tab.add(self.tab_history,text='历史')
self.fill_tab_history() #标签页-按数分析
def set_tab_number(self):
self.tab_number=tk.Frame(self.tab)
self.tab.add(self.tab_number,text='按数分析')
self.fill_tab_number() #标签页-按位分析
def set_tab_position(self):
self.tab_position=tk.Frame(self.tab)
self.tab.add(self.tab_position,text='按位分析')
self.fill_tab_position() #小部件
#填充最新页
def fill_tab_new(self):
self.tab_new_no=tk.Label(self.tab_new,text='第'+str(self.data_no)+'期',bg='orange',font=(self.myfont, 14))
self.tab_new_no.pack(side='top',fill='x')
if type(self.data_number)==tuple:
self.tab_new_number=tk.Label(self.tab_new,text='开奖号码'+'{0}-{1}-{2}-{3}-{4}-{5}-{6}'.format(self.data_tmp_number[0], \
self.data_tmp_number[1],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]),bg='pink',font=(self.myfont, 14))
else:
tkinter.messagebox.showerror('error','数据错误')
self.tab_new_number=tk.Label(self.tab_new,text='开奖号码'+str(self.data_number),bg='pink',font=(self.myfont, 14))
self.tab_new_number.pack(side='top',fill='x')
self.tab_new_date_start=tk.Label(self.tab_new,text='开奖日期'+str(self.data_date_start),bg='pink',font=(self.myfont, 14))
self.tab_new_date_start.pack(side='top',fill='x')
self.tab_new_date_end=tk.Label(self.tab_new,text='兑奖截止'+str(self.data_date_end),bg='pink',font=(self.myfont, 14))
self.tab_new_date_end.pack(side='top',fill='x')
self.tab_new_sale=tk.Label(self.tab_new,text='销售金额'+str(self.data_sale)+'亿',bg='pink',font=(self.myfont, 14))
self.tab_new_sale.pack(side='top',fill='x')
self.tab_new_jackpot=tk.Label(self.tab_new,text='奖池滚存'+str(self.data_jackpot)+'亿',bg='pink',font=(self.myfont, 14))
self.tab_new_jackpot.pack(side='top',fill='x') #填充历史页
def fill_tab_history(self):
self.tab_history_query=tk.Frame(self.tab_history,bg='blue')
self.tab_history_query.pack(side='top',fill='x')
self.tab_history_label=tk.Label(self.tab_history_query,text='输入期号',bd=1,font=self.myfont)
self.tab_history_label.pack(side='left')
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()))
self.tab_history_btn.pack(side='right')
self.tab_history_entry=tk.Entry(self.tab_history_query,bd=3,font=self.myfont)
self.tab_history_entry.pack(side='left',fill='x')
self.tab_history_frame=tk.Frame(self.tab_history,bg='pink')
self.tab_history_frame.pack(side='top',fill='x')
self.tab_history_no=tk.Label(self.tab_history_frame,text='第'+str(self.data_query_no)+'期',bg='orange',font=(self.myfont, 14))
self.tab_history_no.pack(side='top',fill='x')
self.tab_history_number=tk.Label(self.tab_history_frame,text='开奖号码'+str(self.data_query_number),bg='pink',font=(self.myfont, 14))
self.tab_history_number.pack(side='top',fill='x')
self.tab_history_date_start=tk.Label(self.tab_history_frame,text='开奖日期'+str(self.data_query_date_start),bg='pink',font=(self.myfont, 14))
self.tab_history_date_start.pack(side='top',fill='x')
self.tab_history_date_end=tk.Label(self.tab_history_frame,text='兑奖截止'+str(self.data_query_date_end),bg='pink',font=(self.myfont, 14))
self.tab_history_date_end.pack(side='top',fill='x')
self.tab_history_sale=tk.Label(self.tab_history_frame,text='销售金额'+str(self.data_query_sale)+'亿',bg='pink',font=(self.myfont, 14))
self.tab_history_sale.pack(side='top',fill='x')
self.tab_history_jackpot=tk.Label(self.tab_history_frame,text='奖池滚存'+str(self.data_query_jackpot)+'亿',bg='pink',font=(self.myfont, 14))
self.tab_history_jackpot.pack(side='top',fill='x') #填充按数分析
def fill_tab_number(self):
self.tab_number_query=tk.Frame(self.tab_number,bg='blue')
self.tab_number_query.pack(side='top',fill='x')
self.tab_number_label=tk.Label(self.tab_number_query,text='最近',bd=1,font=self.myfont)
self.tab_number_label.pack(side='left')
self.tab_number_btn=tk.Button(self.tab_number_query,text='生成',bd=1,font=self.myfont,command=self.tab_number_search)
self.tab_number_btn.pack(side='right')
self.tab_number_entry=tk.Entry(self.tab_number_query,bd=3,font=self.myfont)
self.tab_number_entry.pack(side='left',fill='x')
self.tab_number_label2=tk.Label(self.tab_number_query,text='期',bd=1,font=self.myfont)
self.tab_number_label2.pack(side='left')
self.tab_number_frame=tk.Frame(self.tab_number,bg='pink')
self.tab_number_frame.pack(side='top',fill='both') #填充按位分析
def fill_tab_position(self):
self.tab_position_query=tk.Frame(self.tab_position,bg='blue')
self.tab_position_query.pack(side='top',fill='x')
self.tab_position_label=tk.Label(self.tab_position_query,text='最近',bd=1,font=self.myfont)
self.tab_position_label.pack(side='left')
self.tab_position_btn=tk.Button(self.tab_position_query,text='生成',bd=1,font=self.myfont,command=self.tab_position_search)
self.tab_position_btn.pack(side='right')
self.tab_position_entry=tk.Entry(self.tab_position_query,bd=3,font=self.myfont)
self.tab_position_entry.pack(side='left',fill='x')
self.tab_position_label=tk.Label(self.tab_position_query,text='期',bd=1,font=self.myfont)
self.tab_position_label.pack(side='left')
self.tab_position_frame=tk.Frame(self.tab_position,bg='pink')
self.tab_position_frame.pack(side='top',fill='both') '''事件''' #重置窗口大小和位置
def reset_root_geometry(self):
width=380
height=300
screenwidth=self.root.winfo_screenwidth()
screenheight=self.root.winfo_screenheight()
alignstr='{}x{}+{}+{}'.format(width,height,int((screenwidth-width)/2),int((screenheight-height)/2))
self.root.geometry(alignstr)
config=configparser.ConfigParser()
config['window']={'geometry':'{}'.format(self.root.geometry())}
with open("Lottery_ui.conf", "w") as conf:
config.write(conf) #查询某期,并重新填充历史页
def tab_history_search(self,no):
self.update_statusbar('查询中…')
if self.get_data_single(no):
self.tab_history_no['text']='第'+'{:0^4}'.format(self.data_tmp_no)+'期'
self.tab_history_number['text']='开奖号码'+'{0}-{1}-{2}-{3}-{4}-{5}-{6}'.format(self.data_tmp_number[0],self.data_tmp_number[1], \
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])
self.tab_history_date_start['text']='开奖日期'+'{}'.format(self.data_tmp_date_start)
self.tab_history_date_end['text']='兑奖截止'+'{}'.format(self.data_tmp_date_end)
self.tab_history_sale['text']='销售金额'+'{}'.format(self.data_tmp_sale)+'亿'
self.tab_history_jackpot['text']='奖池滚存'+'{}'.format(self.data_tmp_jackpot)+'亿'
self.update_statusbar()
else:
tkinter.messagebox.showerror('error','数据错误')
self.update_statusbar('就绪') #生成按数分析的图形
def tab_number_search(self):
self.update_statusbar('生成中…')
self.tab_number_frame.destroy()
self.tab_number_frame=tk.Frame(self.tab_number,bg='pink')
self.tab_number_frame.pack(side='top',fill='both')
no_number=str(self.tab_number_entry.get())
if no_number.isdigit():
nums=self.get_number_rate(int(no_number))
self.draw_number_rate(nums)
self.update_statusbar()
else:
tkinter.messagebox.showerror('error','输入数字')
self.update_statusbar('就绪') #生成按位分析的图形
def tab_position_search(self):
self.update_statusbar('生成中…')
self.tab_position_frame.destroy()
self.tab_position_frame=tk.Frame(self.tab_position,bg='pink')
self.tab_position_frame.pack(side='top',fill='both')
pos=str(self.tab_position_entry.get())
if pos.isdigit():
nums=self.get_number_line(no_number=int(pos))
self.draw_number_line(nums)
self.update_statusbar()
else:
tkinter.messagebox.showerror('error','输入正确的期号')
self.update_statusbar('就绪') #保存按数分析的图形
def save_number(self):
fname = tkinter.filedialog.asksaveasfilename(title=u'保存文件', filetypes=[("PNG", ".png")])
if fname !=None and fname!='':
filename, _ = os.path.splitext(fname)
self.canvas_number.print_png('{}.png'.format(str(filename))) #保存按位分析的图形
def save_position(self):
fname = tkinter.filedialog.asksaveasfilename(title=u'保存文件', filetypes=[("PNG", ".png")])
if fname !=None and fname!='':
filename, _ = os.path.splitext(fname)
self.canvas_position.print_png('{}.png'.format(str(filename))) #退出
def quit(self):
quit=tkinter.messagebox.askokcancel('tip','sure to exit?')
if quit == True:
self.update_statusbar('退出…')
config=configparser.ConfigParser()
config['window']={'geometry':'{}'.format(self.root.geometry())}
with open("Lottery_ui.conf", "w") as conf:
# conf.write(self.root.geometry())
config.write(conf)
self.root.destroy()
sys.exit(0) '''操作'''
#更新状态栏
def update_statusbar(self,text='就绪'):
self.statusbar['text']=str(text)
self.statusbar.update()
print(self.statusbar['text']) #数据
#获取最新数据
def get_data_new(self):
"""
:return: bool
"""
flag=self.get_data_newno()
if flag:
flag=self.get_data_single(no=self.data_newno)
if flag:
self.data_no=self.data_tmp_no
self.data_number=self.data_tmp_number
self.data_date_start=self.data_tmp_date_start
self.data_date_end=self.data_tmp_date_end
self.data_sale=self.data_tmp_sale
self.data_jackpot=self.data_tmp_jackpot
return True
else:
return False
else:
return False #获取指定某期数据
def get_data_single(self,no):
"""
:param no: 期号
:return: bool
"""
flag,lot=Lottery().data_single(no)
if flag==False:
return False
self.data_tmp_no=lot[0]
self.data_tmp_number=lot[1]
self.data_tmp_date_start=lot[2]
self.data_tmp_date_end=lot[3]
self.data_tmp_sale=lot[4]
self.data_tmp_jackpot=lot[5]
if self.data_tmp_number!=None:
return True
else:
return False #获取最新期号
def get_data_newno(self):
"""
:return: bool
"""
flag,newno=Lottery().get_newno()
if flag==False:
return False
else:
self.data_newno=int(newno)
return True #获取多期数据
def get_data_multi(self,number):
"""
:param number: 期数量
:return: 开奖号码
"""
lotm=Lottery_multi(number,max_workers=7)
lotm.data_multi()
datas=lotm.get_list()
numbers=[]
for data in datas:
numbers.append(data[1])
for number in numbers:
print(number)
return numbers #按频次分析号码
def get_number_rate(self, no_number):
"""
:param no_number: 期数量
:return: 按顺序的号码频次
"""
nums=[]
for _ in range(35):
nums.append(0)
numbers=self.get_data_multi(no_number)
for number in numbers:
for i in number:
nums[int(i)-1]=nums[int(i)-1]+1
print(nums)
return nums #按各个位置的号码分析
def get_number_line(self,no_number):
"""
:param no_number: 期数量
:return: 各个位置的号码变化
"""
nums=[[],[],[],[],[],[],[]]
numbers=self.get_data_multi(no_number)
for i in range(len(numbers)):
for j in range(7):
nums[j].append(int(numbers[i][j]))
print(nums)
return nums #图形
#生成频次图
def draw_number_rate(self,nums):
"""
:param nums: 数据列表
"""
self.figure_number=plt.figure()
plt.barh(range(35),nums,height=0.8,color='steelblue',alpha=0.8)
plt.yticks(range(35),list(range(1,36)))
for x,y in enumerate(nums):
plt.text(y,x,'{}'.format(y))
# plt.show()
self.canvas_number=FigureCanvasTkAgg(self.figure_number,self.tab_number_frame)
self.canvas_number.draw()
self.canvas_number.get_tk_widget().pack(side=tk.TOP,fill=tk.BOTH,expand=1) #生成折线图
def draw_number_line(self,nums):
"""
:param nums: 数据列表
"""
self.figure_position=plt.figure()
plt.plot(nums[0],label='')
plt.plot(nums[1],label='')
plt.plot(nums[2],label='')
plt.plot(nums[3],label='')
plt.plot(nums[4],label='')
plt.plot(nums[5],label='')
plt.plot(nums[6],label='')
plt.legend(loc='best')
ax=plt.gca()
ax.xaxis.set_major_locator(MultipleLocator(1))
ax.yaxis.set_major_locator(MultipleLocator(1))
self.canvas_position=FigureCanvasTkAgg(self.figure_position,self.tab_position_frame)
self.canvas_position.draw()
self.canvas_position.get_tk_widget().pack(side=tk.TOP,fill=tk.BOTH,expand=1) '''外部调用'''
#运行
def run(self):
self.root.mainloop() if __name__ == "__main__":
w=window()
w.run()
python简易的大乐透数据获取及初步分析的更多相关文章
- python模拟双色球大乐透生成算法
每天练习一段python代码,健康生活一辈子.晚上下班没事,打开电脑继续编写python代码!今天分享的一个是大家熟悉的双色球彩票的游戏,根据这个进行写的一个python算法,代码精简,肯定有bug, ...
- python 获取大乐透中奖结果
实现思路: 1.通过urllib库爬取http://zx.500.com/dlt/页面,并过滤出信息 2.将自己的买的彩票的号与开奖号进行匹配,查询是否中奖 3.将中奖结果发生到自己邮箱 caipia ...
- python—模拟生成双色球号和大乐透号
下边这个脚本,比较适合初级学习基本python语法用.但是,不精炼建议可参考https://www.cnblogs.com/Formulate0303/p/14031748.html的写法. 大乐透玩 ...
- Python生成随机验证码,大乐透号码
实例笔记之生成随机号码 扩展知识 - yield(生成器) 随机生成验证码 示例代码: import random # 导入标准模块中的random if __name__ == '__main__' ...
- Python实现双色球和大乐透摇奖
实现代码: # code by kadycui # 模块引用 import random def select(): print('\n') print('请选择彩票种类') print('双色球输入 ...
- 08 python学习笔记-随机生成大乐透号码(八)
1 #产生大乐透号码 2 #前区 1-32,5 后区 1-12,2 3 #1.前区从1-32中级取5个,后区再从1-12里面取2个 4 #01 02 03 04 5 def dlt(): #生成随机大 ...
- python 写一个生成大乐透号码的程序
""" 写一个生成大乐透号码的程序 生成随机号码:大乐透分前区号码和后区号码, 前区号码是从01-35中无重复地取5个号码, 后区号码是从01-12中无重复地取2个号码, ...
- 大乐透 Java随机码
package suijishu; import java.util.Random; // TODO Auto-generated method stub public class Xuanqi { ...
- c语言实现双色球和大乐透
头文件: #include<stdio.h> #include <stdlib.h> #include<string.h> #include <time.h& ...
随机推荐
- [BJDCTF 2nd]old-hack
进入首页: 首页告诉了我们是thinkphp5的漏洞. 知道了是哪个版本的话就搜一搜喽:最后发现是thinkphp5.0.23的命令执行 payload_1:查看根目录文件,发现flag位置 http ...
- C# 录音和播放录音-NAudio
在使用C#进行录音和播放录音功能上,使用NAudio是个不错的选择. NAudio是个开源,相对功能比较全面的类库,它包含录音.播放录音.格式转换.混音调整等操作,具体可以去Github上看看介绍和源 ...
- Building Applications with Force.com and VisualForce (DEV401) (二三):Visualforce Componets (Tags) Library Part III
Dev401-024:Visualforce Pages: Visualforce Componets (Tags) Library Part IIIStatic Resources1.Static ...
- 走近源码:Redis如何清除过期key
"叮--",美好的周六就这么被一阵钉钉消息吵醒了. 业务组的同学告诉我说很多用户的帐号今天被强制下线.我们的帐号系统正常的逻辑是用户登录一次后,token的有效期可以维持一天的时间 ...
- 让vscode支持WePY框架 *.wpy
WePY框架的.wpy 文件在微信开发者工具中无法打开,这里使用vscode 打开,并安装vetur 和vetur-wepy 插件即可
- coding++:Arrays.asList() - java.lang.UnsupportedOperationException异常处理
这个异常遇到了才知道坑这么大,坑爹的方法. private String[] otherUserFromArray = new String[]{“3”, “4”, “发放”}; List<St ...
- coding++:win10家庭版升级专业版方案
win10家庭版升级专业版密钥: VK7JG-NPHTM-C97JM-9MPGT-3V66T 4N7JM-CV98F-WY9XX-9D8CF-369TT FMPND-XFTD4-67FJC-HDR8C ...
- Nginx 实现API 网关
1,网关 网关(Gateway)就是一个网络连接到另一个网络的“关口”. 在Nginx 配置负载均衡之后,可以进入到网关,在网关决定进入到哪个真实的web 服务器. 2,将Ngnix 配置 API 网 ...
- iOS 真机查看沙盒目录
iExplorer 的方法试的时候设备都无法检测到,建议放弃 启用iTunes文件共享,才能够看沙盒内的文件,只需要在plist文件中添加如下信息: <key>UIFileSharingE ...
- markdown 插入图片太大?怎么设定图片大小?
你一定在插入图片的时候,遇到图片太大,影响观感的问题. Markdown中,图片大小的设定方式有两种 第一种: ![](https://img2018.cnblogs.com/blog/1735896 ...