본문 바로가기
코딩 연습/코딩배우기

로또 당첨번호 회차별 엑셀 저장(파이썬 크롤링)

by good4me 2022. 3. 30.

goodthings4me.tistory.com

로또 당첨번호를 확인하는 웹 페이지(동행복권)에 대한 파이썬 크롤링을 하는 김에 이전 포스팅(동행복권 로또 당첨번호 추출하는 파이썬 크롤링 코딩)에 이어서 이번에는 지정된 범위의 회차별 로또 당첨번호를 csv 파일로 저장하는 코드를 작성해보았다.

 

 

동행복권 로또 당첨번호를 CSV 파일로 저장하기

csv 모듈을 추가한 후 당첨번호를 추출하는 함수 일부를 수정하고, csv 객체에 추출된 당첨번호를 writerow() 메서드를 활용하면 저장이 된다.

 

[크롤링 소스 코드]

import requests
from bs4 import BeautifulSoup
import csv


def lottery_resust(fr, to):
    try:
        int(fr)
        int(to)
    except ValueError as e:
        print(f'오류 발생: {e}')
        return False

    if fr == 0 or fr > to:
        print('_from은 0이 아니거나 to보다 작아야 함')
        return False

    headers = {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36',
    }

    lottery_list = []
    for n in range(fr, to + 1):
        url = 'https://www.dhlottery.co.kr/gameResult.do?method=byWin'
        payload = {'drwNo': n, 'dwrNoList': n}
        req = requests.post(url, headers=headers, data=payload)

        lotto_list = []
        if req.status_code == 200:
            soup = BeautifulSoup(req.text, 'html.parser')
            win_res = soup.find('div', attrs=('class','win_result'))
            # no = win_res.select_one('h4 > strong').text
            # _day = win_res.find('p', class_='desc').text
            # print(f'\n로또 {no} 당첨결과\n{_day}')
            lot_num = [lot.text for lot in win_res.select('div > div.num.win > p > span.ball_645')]
            lot_num.insert(0, n)
            lot_bonus = win_res.select_one('div > div.num.bonus > p > span').text
            lot_num.append(lot_bonus)
            lottery_list.append(lot_num)
        else:
            print('추출 오류입니다!!')

    print(lottery_list)
    
    xls_name = f'lotto_{fr}_{to}.csv'
    with open(xls_name, 'w', newline='') as f:
        csv_obj = csv.writer(f)
        header = ['회차', 'N1', 'N2', 'N3', 'N4', 'N5', 'N6', 'Bonus']
        csv_obj.writerow(header)

        for num in lottery_list:
            csv_obj.writerow(num)


if __name__ == '__main__':
    _from = 1007
    to = 1008
    lottery_resust(_from, to)

- 추출할 회차의 범위를 지정하기 위해 _from, to 인자를 활용했고,

- 만일 _from이 0이거나 to 보다 크면 False 리턴 처리를 했고 또한 _from이나 to가 숫자가 아닌 경우에는 오류(ValueError)가 발생하도록 하여 숫자만 처리되게 하였다.

- 당첨번호를 csv로 저장하기 위한 리스트를 만들고 회차와 당첨번호, 보너스 번호를 그 리스트에 담았고,

- open() 함수로 csv 파일을 생성한 후 리스트를 writerow() 메서드로 저장하였다.

- open() 함수에서 newline=''이 없으면 한 줄 개행이 되기 때문에 추가하였고,

newline 없을 경우 개행됨
newline 없을 경우 개행됨

- 만일 한글이 깨지는 증상이 발생할 경우 encoding='utf-8-sig'를 추가하면 해결된다.

 

good4me.co.kr

 

[실행 결과]

(venv) D:\pythonDev>d:/pythonDev/venv/Scripts/python.exe d:/pythonDev/lottery_excel.py
[[1007, '8', '11', '16', '19', '21', '25', '40'], [1008, '9', '11', '30', '31', '41', '44', '33']]

(venv) D:\pythonDev>

실행결과 엑셀저장
실행결과 엑셀저장

 

 

▶ 관련 포스팅 더보기 https://goodthings4me.tistory.com/701

 

동행복권 로또 당첨번호 추출하는 파이썬 크롤링 코딩

동행복권 로또 당첨번호 추출하는 파이썬 크롤링 코드를 만들어보았다. 네이버 지식인에 올라온 내용인 [vscode 파이썬 코딩 도와주세요. 로또 몇몇회 치고 버튼누르면 그 회 로또번호 나오게끔 (

goodthings4me.tistory.com

 

 

 

 

댓글