로또 당첨번호가 나와있는 사이트인 동행복권 사이트에서 역대 로또번호를 파이썬을 이용해 크롤링 해보겠습니다.

 

먼저, 필요한 모듈입니다.

import numpy as np
import pandas as pd
import requests
import sys
import bs4
import re
import urllib.request

numpy와 pandas 는 나중에 로또 번호를 분석하기 위한 배열을 만들때 사용할 모듈입니다.

requests와 urllib.request 그리고 bs4는 웹크롤링을 하기 위한 모듈들입니다.

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

동행복권 사이트의 회차별 당첨번호를 확인할 수 있는 페이지의 url입니다.

회차별로 {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 = []
    newreturn = []
    for winnums in soup.findAll('div', attrs={'class': 'nums'}):
        winnum = winnums.findAll('span')
        ret.append(winnum)
    ret = ret[0]
    return ret

동행복권 사이트의 소스코드를 보고 당첨번호가 span에 있는 것을 보고 출력해 보았습니다.

결과를 보면 당첨번호 있는 부분만 배열에 담아 내는 것을 알 수 있습니다.

이제 쓸모 없는 부분을 없애고 숫자만 남겨보도록 하겠습니다.

for i in ret:
        string = str(i)
        onlynum =  re.sub('<.+?>','', string, 0, re.I|re.S)
        newret.append(onlynum)
newret = list(map(int, newret))

ret 안에 있는 값을 하나씩 문자열로 전환한 후 re.sub을 이용해 '<>'이 괄호안에 있는 모든 것들을 지우고 onlynum에 저장합니다. 그리고 onlynum 변수를 newret 배열에 저장했습니다.

 

배열에 있는 당첨번호를 다시 숫자 형태로 바꾸기 위해 map을 활용합니다.

확인을 위해 873회차 당첨번호를 출력해보면,(코드를 약간 수정했습니다.)

아주 오래전 1회차를 조회 해봐도

정상적으로 잘 출력됩니다.

 

전체적인 코드

import numpy as np
import pandas as pd
import requests
import sys
import bs4
import re
import urllib.request
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(873)

+ Recent posts