크롤링 웹사이트 위치
로또 번호는 동행로또 홈페이지에서 얻을 수 있습니다.
https://www.dhlottery.co.kr/common.do?method=getLottoNumber&drwNo="회차번호"
위 주소로 들어가면 json 형태의 데이터를 얻을 수 있는데, 파이썬에서는 dict 형태로 저장할 것 입니다.
모듈 불러오기
pandas, requests, tqdm 세가지 모듈을 이용하였습니다.
- pandas 를 이용하여 dict 형태로 저장한 데이터를 dataframe 형태로 변환하였습니다. dataframe 형태로 변환한 이유는 우리가 보기 쉽게 하기 위함이며, csv로 내보내기(to_csv) 기능을 할 것이기 때문입니다.
- requests 모듈을 이용하여 매 회차에 대한 데이터를 가지고 왔습니다.
- tqdm 모듈은 for 문과 함께 작동하는데, 얼마나 진행되고 있는지 시각화하는 진행바를 보여주는 유용한 모듈입니다.
import pandas as pd
import requests
from tqdm import tqdm
크롤링 함수
시작회차와 종료회차 를 argument로 받은 후, requests 모듈을 활용하여 시작회차부터 종료회차까지의 정보를 받아옵니다.
- startRound : 시작 회차
- endRound : 종료 회차
회차별 로또번호 정보는 lotto_dict 에 dict 형태로 저장하고, pandas를 이용하여 dataframe 형태로 변환시켜 줍니다.
최종적으로 로또번호 정보는 dict 형태와 dataframe 두가지 형태로 반환(return)시켜 줬습니다.
def getLottoWinInfo(startRound, endRound):
drwtNo1 = []
drwtNo2 = []
drwtNo3 = []
drwtNo4 = []
drwtNo5 = []
drwtNo6 = []
bnusNo = []
totSellamnt = []
drwNoDate = []
firstAccumamnt = []
firstPrzwnerCo = []
firstWinamnt = []
roundNo = []
for i in tqdm(range(startRound, endRound+1, 1)):
# i = 1
req_url = "https://www.dhlottery.co.kr/common.do?method=getLottoNumber&drwNo=" + str(i)
req_lotto = requests.get(req_url)
lottoNo = req_lotto.json()
drwtNo1.append(lottoNo['drwtNo1'])
drwtNo2.append(lottoNo['drwtNo2'])
drwtNo3.append(lottoNo['drwtNo3'])
drwtNo4.append(lottoNo['drwtNo4'])
drwtNo5.append(lottoNo['drwtNo5'])
drwtNo6.append(lottoNo['drwtNo6'])
bnusNo.append(lottoNo['bnusNo'])
roundNo.append(i)
totSellamnt.append(lottoNo['totSellamnt'])
drwNoDate.append(lottoNo['drwNoDate'])
firstAccumamnt.append(lottoNo['firstAccumamnt'])
firstPrzwnerCo.append(lottoNo['firstPrzwnerCo'])
firstWinamnt.append(lottoNo['firstWinamnt'])
lotto_dict = {"추첨일":drwNoDate, "회차":roundNo,
"Num1":drwtNo1, "Num2":drwtNo2,
"Num3":drwtNo3, "Num4":drwtNo4, "Num5":drwtNo5,
"Num6":drwtNo6, "bnsNum":bnusNo,
"총판매금액":totSellamnt,
"총1등당첨금":firstAccumamnt,
"1등당첨인원":firstPrzwnerCo,
"1등수령액":firstWinamnt}
lotto_df = pd.DataFrame(lotto_dict)
return lotto_dict, lotto_df
로또 정보 가져오기
예제 코드를 돌려봅니다. 930회부터 933회까지 총 4회분을 가져옵니다.
startRound = 930
endRound = 933
lotto_dict, lotto_df = getLottoWinInfo(startRound, endRound)
100%|████████████████████████████████████████████████████████████████████████████████████| 4/4 [00:00<00:00, 5.49it/s]
Output
최종적인 결과는 dict과 dataframe 2가지 형태입니다.
lotto_dict
{'추첨일': ['2020-09-26', '2020-10-03', '2020-10-10', '2020-10-17'],
'회차': [930, 931, 932, 933],
'Num1': [8, 14, 1, 23],
'Num2': [21, 15, 6, 27],
'Num3': [25, 23, 15, 29],
'Num4': [38, 25, 36, 31],
'Num5': [39, 35, 37, 36],
'Num6': [44, 43, 38, 45],
'bnsNum': [28, 32, 5, 37],
'총판매금액': [94518415000, 95695802000, 96049289000, 93484851000],
'총1등당첨금': [22659350632, 23656864504, 23730160881, 23422376632],
'1등당첨인원': [8, 8, 7, 8],
'1등수령액': [2832418829, 2957108063, 3390022983, 2927797079]}
lotto_df
lotto_df.to_csv(str(startRound) + '-' + str(endRound) + '_lotto_number.csv', index = False, encoding = 'utf-8-sig')
전체 코드
# -*- coding: utf-8 -*-
#%% 모듈
import pandas as pd
import requests
from tqdm import tqdm
#%% 함수
def getLottoWinInfo(startRound, endRound):
drwtNo1 = []
drwtNo2 = []
drwtNo3 = []
drwtNo4 = []
drwtNo5 = []
drwtNo6 = []
bnusNo = []
totSellamnt = []
drwNoDate = []
firstAccumamnt = []
firstPrzwnerCo = []
firstWinamnt = []
roundNo = []
for i in tqdm(range(startRound, endRound+1, 1)):
# i = 1
req_url = "https://www.dhlottery.co.kr/common.do?method=getLottoNumber&drwNo=" + str(i)
req_lotto = requests.get(req_url)
lottoNo = req_lotto.json()
drwtNo1.append(lottoNo['drwtNo1'])
drwtNo2.append(lottoNo['drwtNo2'])
drwtNo3.append(lottoNo['drwtNo3'])
drwtNo4.append(lottoNo['drwtNo4'])
drwtNo5.append(lottoNo['drwtNo5'])
drwtNo6.append(lottoNo['drwtNo6'])
bnusNo.append(lottoNo['bnusNo'])
roundNo.append(i)
totSellamnt.append(lottoNo['totSellamnt'])
drwNoDate.append(lottoNo['drwNoDate'])
firstAccumamnt.append(lottoNo['firstAccumamnt'])
firstPrzwnerCo.append(lottoNo['firstPrzwnerCo'])
firstWinamnt.append(lottoNo['firstWinamnt'])
lotto_dict = {"추첨일":drwNoDate, "회차":roundNo,
"Num1":drwtNo1, "Num2":drwtNo2,
"Num3":drwtNo3, "Num4":drwtNo4, "Num5":drwtNo5,
"Num6":drwtNo6, "bnsNum":bnusNo,
"총판매금액":totSellamnt,
"총1등당첨금":firstAccumamnt,
"1등당첨인원":firstPrzwnerCo,
"1등수령액":firstWinamnt}
lotto_df = pd.DataFrame(lotto_dict)
return lotto_dict, lotto_df
#%% 로또 회차정보 불러오기
startRound = 930
endRound = 933
lotto_dict, lotto_df = getLottoWinInfo(startRound, endRound)
#%% CSV 파일로 저장
lotto_df.to_csv(str(startRound) + '-' + str(endRound) + '_lotto_number.csv', index = False, encoding = 'utf-8-sig')