지난번에 만든 로또 번호를 웹에서 크롤링 해오는 함수에 이어서

원하는 회차 구간에 있는 모든 당첨번호를 크롤링 하는 함수를 만들었습니다.

그리고 딕셔너리를 이용해서 회차 별로 당첨번호를 구분 짓는 것도 해보았습니다.

 

def range_search_number(start, end):
    found = []
    dic = {}
    i = 0
    
    for i in range(spg,epg+1):
        foundinpg = one_lotto_number(i)
        j = str(i)
        dic[j+'회차'] = foundinpg
        if foundinpg is None:
            break
        found.append(foundinpg)
        
    return found, dic
range_search_number(1,10)

이런식으로 잘 출력이 되는것을 확인할 수 있습니다.

이걸 활용해서 최근 100회 동안 나온 당첨번호들의 빈도수를 살펴보겠습니다.

먼저, 간단하게 번호별로 빈도수를 세는 함수를 만들어봤습니다.

def count_number(start, end):
    newlist = []
    newdic = {}
    found = range_search_number(start, end)
    newlist = sum(found, [])
    for i in range(1,46):
        j = str(i)
        newdic[j+'번'] = newlist.count(i)
    return newdic
count_number(1, 10)

{'1번': 0, '2번': 4, '3번': 1, '4번': 1, '5번': 0, '6번': 1, '7번': 0, '8번': 1, '9번': 4, '10번': 1, '11번': 1, '12번': 0, '13번': 1, '14번': 3, '15번': 1, '16번': 5, '17번': 1, '18번': 0, '19번': 2, '20번': 0, '21번': 2, '22번': 0, '23번': 1, '24번': 1, '25번': 4, '26번': 2, '27번': 3, '28번': 0, '29번': 2, '30번': 3, '31번': 2, '32번': 1, '33번': 2, '34번': 2, '35번': 0, '36번': 1, '37번': 2, '38번': 0, '39번': 2, '40번': 5, '41번': 2, '42번': 5, '43번': 0, '44번': 1, '45번': 0}

 

1회부터 10회까지 잘 출력 되는듯 합니다. 

이제 우리가 원했던 최근 100회 775회에서 874회까지의 로또 번호를 출력해보겠습니다.

 

{'1번': 9, '2번': 16, '3번': 15, '4번': 11, '5번': 13, '6번': 18, '7번': 9, '8번': 10, '9번': 15, '10번': 19, '11번': 16, '12번': 26, '13번': 20, '14번': 14, '15번': 16, '16번': 18, '17번': 17, '18번': 19, '19번': 20, '20번': 9, '21번': 17, '22번': 11, '23번': 7, '24번': 17, '25번': 17, '26번': 16, '27번': 12, '28번': 17, '29번': 15, '30번': 19, '31번': 16, '32번': 16, '33번': 19, '34번': 16, '35번': 13, '36번': 17, '37번': 7, '38번': 25, '39번': 21, '40번': 13, '41번': 12, '42번': 19, '43번': 22, '44번': 9, '45번': 17}

 

좀 더 직관적으로 보기 위해 그래프로도 만들어보겠습니다.

 

가로부분의 숫자가 겹쳐 나오는거 같아서 늘려보려고 했는데 잘 안되네요ㅜㅜ 이부분은 좀 더 찾아봐야할거 같습니다.

 

일단 많이 나온 숫자를 10개 고르자면

'12번': 26

'13번': 20

'18번': 19

'19번': 20

'30번': 19

'33번': 19

'38번': 25

'39번': 21

'42번': 19

'43번': 22

이정도가 되겠네요. 다음에는 로또분석을 분석하는 알고리즘으로 다음 당첨번호를 예측해보는 알고리즘을 짜보겠습니다.

 

전체적인 코드

import numpy as np
import pandas as pd
import requests
import sys
import urllib.request
import bs4
import re
from matplotlib import pyplot as plt

search_url = "https://dhlottery.co.kr/gameResult.do?method=byWin&drwNo={page}"

def one_lotto_number(page):
    response = urllib.request.urlopen(search_url.format(page=page))
    lotto_data = response.read()
    
    soup = bs4.BeautifulSoup(lotto_data)
    ret = []
    newret = []
    for winnums in soup.findAll('div', attrs={'class': 'nums'}):
        winnum = winnums.findAll('span')
        ret.append(winnum)
    ret = ret[0]
    for i in ret:
        string = str(i)
        onlynum =  re.sub('<.+?>','', string, 0, re.I|re.S)
        newret.append(onlynum)
    newret = list(map(int, newret))
    return newret
one_lotto_number(874)

def range_search_number(start, end):
    found = []
    dic = {}
    i = 0
    
    for i in range(start,end+1):
        foundinpg = one_lotto_number(i)
        j = str(i)
        dic[j+'회차'] = foundinpg
        if foundinpg is None:
            break
        found.append(foundinpg)
        
    return found
range_search_number(1,10)

def count_number(start, end):
    newlist = []
    newdic = {}
    found = range_search_number(start, end)
    newlist = sum(found, [])
    for i in range(1,46):
        j = str(i)
        newdic[j+'번'] = newlist.count(i)
    x = list(newdic.keys())
    y = list(newdic.values())
    
    plt.plot(x, y)
    plt.xlabel('number')
    plt.ylabel('Number of Times')
    plt.title('Lotto')
    plt.figure(figsize=(12, 40))
    
    return newdic, plt.show()
count_number(775, 874)

+ Recent posts