파이썬 웹 크롤러? 웹 스크래퍼 만들기 - 3

파이썬 크롤러 로또 사이트 크롤링 하기

이 포스팅 글은 "파이썬 웹 크롤러? 웹 스크래퍼 만들기" 연재입니다. 파이썬 크롤러 환경 설정이나 크롤러에서 사용하는 모듈 사용법을 알고 싶으시면 아래 이전 글을 참고해 주세요.

 

- 파이썬 웹 크롤러? 웹 스크래퍼 만들기 - 1

captainbin.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%ED%81%AC%EB%A1%A4%EB%9F%AC-%EB%A7%8C%EB%93%A4%EA%B8%B0

 

- 파이썬 웹 크롤러? 웹 스크래퍼 만들기 - 2

captainbin.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%ED%81%AC%EB%A1%A4%EB%9F%AC-%EB%A7%8C%EB%93%A4%EA%B8%B0-2

 

 

로또 사이트 파이썬 크롤러 제작하기

※ 주의 사항 ※

   본 포스팅의 주제는 로또 사이트 당첨번호를 크롤링 합니다. 로또 번호가 1회차 부터 이 글을 작성하는 시점에 940회 까지 당첨 번호가 있습니다. 한 사람의 입장에서는 1회 부터 940회 까지 페이지를 바꿔 가면서 크롤링 하는 것이 그다지 큰 트래픽이 아닐 수 있습니다. 하지만 서비스 입장에서 한 사람의 순간적인 940회 트래픽은 큰 문제가 될 수 있습니다.  그러므로 로또 사이트를 웹 크롤링 하는 코드를 실제로 작성 한다면 회차당 interval time이 최소 1초로 설정하여 웹 사이트 운영에 무리가 가지 않도록 주의해 주세요.

타겟 사이트 url 분석하기

로또 사이트(www.dhlottery.co.kr/)를 접속하여 화면에 보이는 당첨결과를 클릭합니다.

로또 사이트 메인 화면

 

이후 화면 왼쪽에 보이는 로또의 회차별 당첨결과를 클릭합니다.

로또 회차별 당첨결과

 

회차별 당첨 결과 화면이 보이면 화면에서 회차 바로가기 부분에서 1회 차를 선택하고 조회 버튼을 클릭합니다. 그리고 웹 브라우저의 url 부분을 확인하면 다음과 같은 정보를 확인할 수 있습니다.

로또 사이트 url

이로써 로또 크롤러를 제작하는데 GET방식으로 제작하면 된다는 정보를 확인했습니다. 각 회차별 보이는 정보의 위치는 동일하므로 이번에는 가져와야 하는 html 구조를 살펴보겠습니다.

 

크롬을 사용하시거나 MS에지를 사용하신다면 ctrl + shift + i 단축키를 눌러 개발자 도구를 띄워 줍니다.

크롬에서 로또 사이트 개발자 도구 실행 화면

 

개발자 도구가 수행되었다면 이제 ctrl + shift + c 단축키를 눌러 로또 사이트 화면에서 당첨 번호가 있는 부분에 마우스를 가져가 아래 화면과 같이 보너스 번호까지 파란색이 되도록 마우스 커서를 잘 위치시킵니다. 아래와 같이 파란색이 잘 위치했다면 마우스를 한번 클릭하시면 됩니다. 보너스 번호 앞에 있는 + 부분에 마우스 커서를 가져가니 선택이 잘됩니다. 참고하세요.

 

크롬에서 로또 사이트 당첨번호 요소 선택

제대로 클릭을 하였다면 오른쪽 개발자 도구에서 html 소스 부분에서 조금 전 클릭한 태그 요소 위치를 표시해 줍니다. 즉, html 소스를 처음부터 분석할 필요가 없습니다.

로또 사이트 당첨번호 html 요소 확인

 

이 소스를 보면 어떻게 데이터를 가져와야 하는지 머릿속에 떠오르지 않으신가요? 즉, 클래스가 "nums"라는 div태그 안에 당첨번호와 보너스 번호가 들어 있습니다. 또한 당첨번호와 보너스 번호는 각각 div태그 안에 담겨 있습니다. 그렇다면 파이썬 코드를 작성한다면 "nums" div의 하위 요소들만을 가져와 데이터를 가공해도 됩니다.

 

또한 당첨 번호와 보너스 번호를 구분해야 할 필요성이 있습니다. 고로 처음부터 "num win"과 "num bonus"를 각각 수집하여 데이터를 가공하는 방법도 있습니다.

 

 

기능 구상하기

파이썬으로 로또 사이트를 크롤링하면 이런 기능들이 필요하겠구나 라고 생각하여 여러 가지 기능들을 생각해봤습니다.

 

1. 입력받은 회차만 크롤링 하기

2. 1회 차부터 최근 회차까지 크롤링 하기

3. 크롤링 데이터 db에 적제 하기

4. 적제 한 로또 데이터 파일로 출력하기

5. 로그 데이터 출력하기

6. 수정에 용이하도록 config 설정하기

7. 로또 데이터 그래프 분석하기

8. 번호 추천하기

 

하지만 지금까지 3개의 연재 포스팅 글에 너무나 많은 시간이 소요되었고 포스팅 주제인 파이썬 웹 크롤러 만들기에 위의 기능을 모두 포함하기에 무리가 있어 보입니다. 무엇보다도 수 일동 안 많은 시간을 들여 이 포스팅 글을 작성한다고 컴퓨터 앞에 앉아 점점 무기력 해져가는 제 자신을 보면서 위의 기능은 전부 제외하기로 했습니다.

 

 

코드 작성하기

위의 사유로 인하여 코드는 정말 간단하게 1회 차 로또 번호를 크롤링하는 뼈대만 작성하고 마치겠습니다. 파이썬 3 버전에서 실제로 동작하는 코드로 기본적인 기능에는 충실하므로 더 필요한 기능들은 직접 작성하시면 좋을 것 같습니다.

 

마지막으로 맨 위에 있는 주의 사항을 꼭 다시 한번 상기해 주시기를 부탁드립니다. 비록 강제 사항은 아니지만 프로그래머로써 다른 프로그래머를 배려해 주어야 한다고 생각합니다. 나 하나쯤은 괜찮겠지? 뭐 어때?라는 생각을 갖고 실행에 옮기는 순간 언젠간 당신도 괜찮겠지? 뭐 어때?라고 생각한 사람에게 피해를 볼 수 있습니다.

import requests as req
from bs4 import BeautifulSoup as bs

lotto_url = "https://www.dhlottery.co.kr/gameResult.do"

lotto_get = req.get(lotto_url, params={"method":"byWin", "drwNo":"1"})

spoon = bs(lotto_get.content, 'lxml')

get_win_num = []
get_bo_num = 0

for num in spoon.select('.win span'):
    get_win_num.append(num.text)

for num in spoon.select('.bonus span'):
    get_bo_num = num.text

print("=" * 50)
print(str(get_win_num))
print("-" * 50 ) 
print(str(get_bo_num))
print("=" * 50)

# 결과
==================================================
['10', '23', '29', '33', '37', '40']
--------------------------------------------------
16
==================================================

 

MORE