파이썬 로또 번호 크롤링(Lotto Number Crawling)

2020. 11. 17. 01:39카테고리 없음

크롤링 웹사이트 위치

로또 번호는 동행로또 홈페이지에서 얻을 수 있습니다.

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')