본문 바로가기
VBA

[VBA] 로또 번호를 가져오기( feat. 동행복권)

by 일등미노왕국 2022. 6. 18.

https://www.youtube.com/watch?v=Y0RKhjixSeo&t=35s 

[윤자동채널]의 다잡님께서 로또관련 분석하는 혜자스런 방법으로 영상을 올려주셨다..

썸네일만 보았을 때는 1탄에 이어 2탄에서는 어마어마한 퍼포먼스가 발생하는 코드를 올려주실 것 같다는 생각이 든다...언능 올려주세요 현기증 날거 같단 말이예요~~~

 

오늘 올려주신 영상을 토대로 구문을 만들어 보았다.

코드 진행은 이렇다. 한번 크롤링해서 이전 당첨번호를 가져왔다면, 앞으로는 새로운 회차의 번호만 차곡차곡 담으면 될것이다. 다잡님의 코드가 1회차부터 현재까지의 코드를 가져오는 코드이기에 본인은 오늘까지 업데이트한 당첨번호를 몇주가 지나서 업데이트 되지 않은 번호들만 더 추가하는 코드를 진행해 보려고 한다. 

 

코드의 베이스가 [윤자동채널]의 다잡님 코드이기에 본인의 코드를 진행하기전 반드시 다잡님 영상을 보고 진행하기를 바란다.

 

 

 

동행복권 홈페이지에 왼쪽에 보면 1019회 당첨결과라고 최신회차가 몇회차인지 보여준다. 우린 이곳에서 최신 회차를 가져오게 된다. / 방식은 GET방식이다.

리퀘스트 메소드가 GET 방식이다.

최신회차와 우리가 크롤링한 데이터의 마지막 회차가 같다면 [최신버전]이라는 메세지를 띄우고 종료한다.

당첨결과를 가져오기 위해서 당첨결과 > 회차별 당첨번호로 들어가면....

이런 화면이 나오게 된다. 개발자 화면으로 들어가면 아까 동행복권 홈페이지의 GET방식에서 Post방식으로 바뀐것을 볼 수 있다. 이내용은 다잡님 영상에 있기에 넘어가기로 하겠다.

 

GET 방식이 화면에 뿌려진 내용을 그래도 파싱하는 것이라면 POST 방식은 우리가 원하는 것을 홈페이지에 던지고 그걸 받는 것이다. 우리는 회차정보를 가져오기 위해 회차를 선택 후 조회버튼을 누르면 그 회차정보가  PayLoad에 실려서 홈페이지로 들어가고 그에 대한 Html형식의 반환하게 된다..

 

우린 그 이후의 HTML을 우리가 평소에 했던 GET방식의 크롤링처럼 HTML 문서를 파싱하면 된다.

당첨번호는 ball_645 클래스에 담겨있고 1등 당첨금은 tar 클래스에 담겨져 있기에 파싱하여 innertext를 가져오면 된다.

 

더보기
Option Explicit
Sub Haja_Lotto()

    Dim rngX As Range
    Dim html As Object: Set html = CreateObject("htmlfile")
    Dim xmlHttp As Object: Set xmlHttp = CreateObject("msxml2.xmlhttp")
    Dim Obj As Object, ObjMoney As Object, Obj_lotto As Object
    Dim data$
    Dim BaseUrl$, strUrl$, i&, j&, cnt&, lastest, Start_num&, Lastest_Num&
        
        Application.ScreenUpdating = True                                               '= 진행하는 것을 화면에 보여줌
        
        BaseUrl = "https://www.dhlottery.co.kr/common.do?method=main"                   '= 동행복권 홈페이지 URl
        Set lastest = fn.GetDocumentByURL(BaseUrl)                                      '= 홈페이지 Documnent를 불러옴
        Lastest_Num = Val(lastest.queryselector("#lottoDrwNo").innertext)               '= 홈페이지에서 최근회차 파싱하여
                                                                                        '= 최근회자 번호를 [Lastest_Num] 담아라
        Sheets(1).[b2] = 1: Sheets(1).[d2] = Lastest_Num                                '= [Lotto] 시트의 회차 조회 초기값 설정
        strUrl = "https://dhlottery.co.kr/gameResult.do?method=byWin"                   '= 회차별 당첨내역 페이지 Url
        
        If Sheets(2).[a1].End(4) = Lastest_Num Then MsgBox "최신버전입니다.": Exit Sub
       '= 홈페이지 최근 회차와 [data]시트의 마지막 회차가 같으면 [최신버전이다] 출력
       
        Set rngX = Sheets(2).Cells(Rows.Count, "a").End(3)(2)                           '= 번호를 출력할 영역을 설정
      
        Sheets(2).Activate
        Start_num = Sheets(2).[a1].End(4) + 1                                           '= 마지막 회차의 번호에 +1 을 하여 업데이트 시작값을 설정
        For i = Start_num To Lastest_Num                                                '= 가장 마지막 회차의 번호에서 +1 하여 최근회차까지 순환
        
        data = "drwNo=" & i & "&dwrNoList=" & i                                         '= Payload 값을 data에 담아라
        With xmlHttp                                                                    '= Xmlhttp로 크롤링 시작
            .Open "POST", strUrl, False                                                 '= 방식은 POST 방식
            .setRequestHeader "Content-Type", "application/x-www-form-urlencoded"       '= 리퀘스터 헤더값방식
            .send (data)                                                                '= data값을 Post 방식으로 보내라
            html.body.innerhtml = .responsetext                                         '= 받아온 값을 html의 Dom 형식으로 받아라
        
        End With
           
            Set Obj = html.getelementsbyclassname("ball_645")                           '= 당첨번호 classname
            Set ObjMoney = html.getelementsbyclassname("tar")                           '= 당첨금액 classname
            
                rngX(1, 1) = i                                                          '= 회차번호
                For j = 0 To 5
                    rngX(1, j + 2) = Obj(j).innertext                                   '= 각 당첨번호 출력
                Next j
                    
                    rngX(1, 8) = Obj(6).innertext                                       '= 보너스번호
                    rngX(1, 9) = ObjMoney(0).innertext                                  '= 담첨금액
                                    
                    Set rngX = rngX.Offset(1)                                           '= 다음회차
                    DoEvents
        Next i
        [a1].CurrentRegion.Borders.LineStyle = 1
        MsgBox Start_num & "회차부터 " & Lastest_Num & "회차까지 업데이트 되었습니다."
        
        Sheets(1).Activate
    
End Sub

코드는 다잡님이 2탄까지 공개하면 그때 올리기로 하겠다...

댓글