# coding: utf-8
import requests
import openpyxl
from openpyxl import load_workbook
from bs4 import BeautifulSoup
import lxml
import re
import datetime
path = r"C:\Users\Administrator\Desktop\误删\python\爬虫"
filename = path + "/" + "3d_data.xlsx"
# 加载工作薄
wb = load_workbook(filename)
# 选择工作表
# ws = wb['test']
# sheet_names 返回工作薄中的sheet列表
sheet_names = wb.sheetnames
# 选择工作表
ws = wb[sheet_names[0]]
# 获取中奖号码
def get_jian_num():
#清空excel后插入
ws.delete_rows(1, ws.max_row)
wb.save(filename)
#1页20个号码,100页
range_page = 10
for n in range(1,range_page):
urlpage = "https://www.ssqzj.com/kaijiang/3dmingxi_" + str(n) + ".html"
response = requests.get(urlpage)
# 奖号
soup = BeautifulSoup(response.text, 'html.parser')
jian_num = soup.find_all("div", attrs={"class":"haoma"})
#print(jian_num)
# 总期数
len_num = ( range_page - 1 ) * 20
print(len_num)
# excel插入奖号
for i in jian_num:
#print(i)
# \d+匹配1次或者多次数字
jian_list = re.findall(r"\d+", str(i))
#print(jian_list)
if len(jian_list) == 0:
jian_list = ['0','0','0']
jian_list_int = [int(jian_list[0]), int(jian_list[1]), int(jian_list[2]) ]
#print(jian_list_int)
#print(sorted(jian_list_int))
ws.cell(len_num, 2).value = jian_list_int[0]
ws.cell(len_num, 3).value = jian_list_int[1]
ws.cell(len_num, 4).value = jian_list_int[2]
# 插入奇数还是偶数
ws.cell(len_num, 5).value = value_ji_ou(jian_list_int[0])
ws.cell(len_num, 6).value = value_ji_ou(jian_list_int[1])
ws.cell(len_num, 7).value = value_ji_ou(jian_list_int[2])
# 插入和值
sum_num = 0
for i in jian_list_int:
sum_num += i
ws.cell(len_num, 8).value = sum_num
# 插入跨度
# 列表排序 小--->大
kuadu_num_list = sorted(jian_list_int)
kuadu_num = kuadu_num_list[2] - kuadu_num_list[0]
ws.cell(len_num, 9).value = kuadu_num
# 插入012路
ws.cell(len_num, 10).value = if_0_or_1_or_2(jian_list_int[0])
ws.cell(len_num, 11).value = if_0_or_1_or_2(jian_list_int[1])
ws.cell(len_num, 12).value = if_0_or_1_or_2(jian_list_int[2])
if len_num >= 0:
len_num = len_num - 1
#ws.append(jian_list)
wb.save(filename)
#print("len_num:", len_num)
# excel插入日期
soup_date = BeautifulSoup(response.text, 'html.parser')
date_num = soup_date.find_all("td")
date_num_du = re.findall("\d+-\d+-\d+",str(date_num))
print(date_num_du)
len_date_num = ( range_page - 1 ) * 20
for i in range(0,20):
ws.cell(len_date_num, 1).value = date_num_du[i]
#print(len_date_num)
if len_date_num > 0:
len_date_num = len_date_num - 1
#print(len_date_num)
wb.save(filename)
range_page = range_page - 1
#print("range_page:", range_page)
def value_ji_ou(num):
if ( num % 2 ) == 0:
return "偶"
print("偶")
else:
return "奇"
def date_delete(date_num):
# 格式化日期
date_num = datetime.datetime.strptime(str(date_num), '%Y-%m-%d')
print(date_num)
date_delete_1 = (date_num + datetime.timedelta(days=-1)).strftime("%Y-%m-%d")
print(date_delete)
return date_delete
# 获取元素的值
def get_value(row, column):
values = ws.cell(row, column).value
return values
# 获取最新一期奖号
def get_new():
new_list = []
for i in range(max_column + 1):
if i > 0:
new_num = get_value(max_row, i)
new_list.append(new_num)
return new_list
# 数据加载到字典 key=日期,value=奖号list
def get_list_dict():
num_dict = {}
num_list = []
for n in range(max_row):
for c in range(max_column + 1):
if n > 0 and c > 1:
num = get_value(n, c)
num_list.append(num)
if n > 0:
num_dict[get_value(n, 1)] = num_list
num_list = []
#print(num_dict)
return num_dict
# 判断012路
def if_0_or_1_or_2(num):
if num == 0 or num == 3 or num == 6 or num == 9:
return 0
if num == 2 or num == 5 or num == 8:
return 2
if num == 1 or num == 4 or num == 7:
return 1
def his_num_0_1_2():
num_00 = num_01 = num_02 = 0
for i in his_list_num:
num_1 = get_value(i, 10)
num_2 = get_value(i, 11)
num_3 = get_value(i, 12)
for i in num_1,num_2,num_3:
if if_0_or_1_or_2(i) == 0:
num_00 += 1
if if_0_or_1_or_2(i) == 1:
num_01 += 1
if if_0_or_1_or_2(i) == 2:
num_02 += 1
print("0路:", num_00, " 1路:" ,num_01, " 2路:", num_02)
# 判断大小 0-4 5-9
def if_lager_5_or_small(num):
if num < 5:
return "xiao"
else:
return "da"
# 获取最新一期与历史奇偶相似的数据
def new_like_old_ji_ou(row):
if get_value(row, 5) == get_new()[4] and get_value(row, 6) == get_new()[5] and get_value(row, 7) == get_new()[6]:
return row
def old_like_ji_ou_dict():
his_list_dict = {}
for n in range(1, max_row):
if new_like_old_ji_ou(n) == n:
his_old = get_value(n, 1)
his_list_dict[n] = his_old
# hist_list key = 行号, value=日期
#print(his_list)
his_next_list = []
his_next_list_zu6 = []
his_next_list_zu3 = []
for key in his_list_dict:
his_next_zu3_or_zu6 = if_zu3_or_zu6(get_value(key + 1, 2), get_value(key + 1, 3), get_value(key + 1, 4))
if his_next_zu3_or_zu6 == "zu_3":
his_next_list_zu3.append(key + 1)
else:
his_next_list_zu6.append(key + 1)
# 打印所有历史相似期数
#print("相似行数: ", key, get_value(key, 1), get_list_dict()[get_value(key , 1)], "下期行数: " , key + 1 , get_value(key + 1, 1) ,get_list_dict()[get_value(key + 1, 1)])
his_next_list.append(key + 1)
print("往期相似下一期期数: ", len(his_next_list), " ", his_next_list)
# zu_3
if len(his_next_list_zu3) > 0:
print("-----相似历史下期zu_3: ", len(his_next_list_zu3), his_next_list_zu3)
for key in his_next_list_zu3:
print("相似行数: ", key, get_value(key - 1, 1), get_list_dict()[get_value(key - 1, 1)], "下期行数: " , key , get_value(key, 1) ,get_list_dict()[get_value(key, 1)])
# zu_6
if len(his_next_list_zu6) > 0:
print("-----相似历史下期zu_6: ", len(his_next_list_zu6), his_next_list_zu6)
for key in his_next_list_zu6:
print("相似行数: ", key, get_value(key - 1, 1), get_list_dict()[get_value(key - 1, 1)], "下期行数: " , key , get_value(key, 1) ,get_list_dict()[get_value(key, 1)])
return his_next_list,his_next_list_zu3,his_next_list_zu6
# 历史相似下一期 和值跨度
def his_sum_value():
his_sum = 0
his_kuadu = 0
his_len = len(his_list_num)
for n in his_list_num:
#print("---", n, his_sum , get_value(n, 8))
his_sum += get_value(n, 8)
his_kuadu += get_value(n, 9)
his_sum_averaged = his_sum / his_len
his_kuadu_averaged = his_kuadu / his_len
print("平均跨度: ", his_kuadu_averaged, " 和值平均值: ", his_sum_averaged)
# 历史相似下一期 小大个数
def his_small_lager():
his_small_num = 0
his_lager_num = 0
# 小大各类型个数
num_xxx = num_xxd = num_xdx = 0
num_dxx = num_dxd = num_ddd = 0
for n in his_list_num:
if if_lager_5_or_small(get_value(n, 2)) == "xiao":
his_small_num += 1
else:
his_lager_num += 1
if if_lager_5_or_small(get_value(n, 3)) == "xiao":
his_small_num += 1
else:
his_lager_num += 1
if if_lager_5_or_small(get_value(n, 4)) == "xiao":
his_small_num += 1
else:
his_lager_num += 1
# 小大各类型个数
num_1 = get_value(n, 2)
num_2 = get_value(n, 3)
num_3 = get_value(n, 4)
#print("xiaoxiaoxxxxx-------",if_lager_5_or_small(num_1), if_lager_5_or_small(num_2), if_lager_5_or_small(num_3))
if if_lager_5_or_small(num_1) == "xiao" and if_lager_5_or_small(num_2) == "xiao" and if_lager_5_or_small(num_3) == "xiao":
num_xxx += 1
if if_lager_5_or_small(num_1) == "xiao" and if_lager_5_or_small(num_2) == "xiao" and if_lager_5_or_small(num_3) == "da":
num_xxd += 1
#print("xxd----", num_xxd)
if if_lager_5_or_small(num_1) == "xiao" and if_lager_5_or_small(num_2) == "da" and if_lager_5_or_small(num_3) == "xiao":
num_xdx += 1
if if_lager_5_or_small(num_1) == "da" and if_lager_5_or_small(num_2) == "xiao" and if_lager_5_or_small(num_3) == "xiao":
num_dxx += 1
if if_lager_5_or_small(num_1) == "da" and if_lager_5_or_small(num_2) == "xiao" and if_lager_5_or_small(num_3) == "da":
num_dxd += 1
if if_lager_5_or_small(num_1) == "da" and if_lager_5_or_small(num_2) == "da" and if_lager_5_or_small(num_3) == "da":
num_ddd += 1
print("小于5个数 ", his_small_num, " 大于5个数 ", his_lager_num)
print("小小小:", num_xxx, " 小小大:", num_xxd, " 小大小:", num_xdx, " 大小小:", num_dxx, " 大小大:", num_dxd, " 大大大:", num_ddd)
# 历史相似下一期 0-9个数
def his_sum_0_9():
num_00 = num_01 = num_02 = num_03 = num_04 = num_05 = num_06 = num_07 = num_08 = num_09 = 0
for n in his_list_num:
num_1 = get_value(n, 2)
num_2 = get_value(n, 3)
num_3 = get_value(n, 4)
# 0-9 出现个数
for num in str(num_1),str(num_2),str(num_3):
if num == "0":
num_00 += 1
elif num == "1":
num_01 += 1
elif num == "2":
num_02 += 1
elif num == "3":
num_03 += 1
elif num == "4":
num_04 += 1
elif num == "5":
num_05 += 1
elif num == "6":
num_06 += 1
elif num == "7":
num_07 += 1
elif num == "8":
num_08 += 1
else:
if num == "9":
num_09 += 1
num_key = {}
num_key["00"] = num_00
num_key["01"] = num_01
num_key["02"] = num_02
num_key["03"] = num_03
num_key["04"] = num_04
num_key["05"] = num_05
num_key["06"] = num_06
num_key["07"] = num_07
num_key["08"] = num_08
num_key["09"] = num_09
print(sorted(num_key.items(), key= lambda kv:(kv[1], kv[0])))
#print("0:", num_00, " 1:", num_01, " 2:", num_02, " 3:", num_03, " 4:", num_04, " 5:", num_05, " 6:", num_06, " 7:", num_07, " 8:", num_08, " 9:", num_09)
# 历史相似下一期 奇偶
def his_ji_or_ou():
ji_num = 0
ou_num = 0
# 预测百个十奇偶
ji_ji_ji = ji_ji_ou = ji_ou_ou = ji_ou_ji = 0
ou_ji_ji = ou_ji_ou = ou_ou_ou = ou_ou_ji = 0
for n in his_list_num:
num_1 = get_value(n, 5)
num_2 = get_value(n, 6)
num_3 = get_value(n, 7)
for num in num_1,num_2,num_3:
if num == "奇":
ji_num += 1
else:
ou_num += 1
if num_1 == "奇" and num_2 == "奇" and num_3 == "奇":
ji_ji_ji += 1
if num_1 == "奇" and num_2 == "奇" and num_3 == "偶":
ji_ji_ou += 1
if num_1 == "奇" and num_2 == "偶" and num_3 == "偶":
ji_ou_ou += 1
if num_1 == "奇" and num_2 == "偶" and num_3 == "奇":
ji_ou_ji += 1
if num_1 == "偶" and num_2 == "奇" and num_3 == "奇":
ou_ji_ji += 1
if num_1 == "偶" and num_2 == "奇" and num_3 == "偶":
ou_ji_ou += 1
if num_1 == "偶" and num_2 == "偶" and num_3 == "偶":
ou_ou_ou += 1
if num_1 == "偶" and num_2 == "偶" and num_3 == "奇":
ou_ou_ji += 1
print("奇数: ", ji_num, " 偶数: ", ou_num)
print("-----选多的--")
print("奇奇奇:", ji_ji_ji, " 奇奇偶:", ji_ji_ou, " 奇偶偶:", ji_ou_ou, " 奇偶奇:", ji_ou_ji, " 偶奇奇:", ou_ji_ji, " 偶奇偶:", ou_ji_ou, " 偶偶偶:", ou_ou_ou, " 偶偶奇:", ou_ou_ji)
# 最近5期
def get_new_5_dict():
num_5_dict = {}
num_5_list = []
for n in range(max_row - 4, max_row):
for c in range(1, max_column + 1):
num = get_value(n, c)
num_5_list.append(num)
num_5_dict[get_value(n, 1)] = num_5_list
num_5_list = []
#print(num_5_dict)
return num_5_dict
# 判断组三组六
def if_zu3_or_zu6(num_1, num_2, num_3):
if num_1 == num_2 or num_1 == num_3 or num_2 == num_3:
return "zu_3"
else:
return "zu_6"
if __name__ == '__main__':
get_jian_num()
# ws.max_row 最大行数 ws.max_column 最大列数
max_row = ws.max_row
max_column = ws.max_column
#print(max_row, max_column)
print("-------------最新一期------------")
print(get_new())
#get_list_dict()
his_list_num,his_list_num_zu3,his_list_num_zu6 = old_like_ji_ou_dict()
#print("----",his_list_num)
#for i in his_list_num,his_list_num_zu3,his_list_num_zu6:
his_list_num_5 = his_list_num[-5:]
for i in his_list_num_zu3,his_list_num_zu6:
print("-------------------------", len(i), i, "-------------------------------")
his_list_num = i
print("----补小的----")
his_small_lager()
his_sum_0_9()
#his_num_0_1_2()
his_sum_value()
his_ji_or_ou()
print("-------------------------- all_5", his_list_num_5)
his_list_num = his_list_num_5
his_sum_value()
#his_num_0_1_2()
备注:
excel中最后一列需要插入试机号