본문 바로가기
VBA/엑사남_심화방

[심화방] VBA_심화_100제 #10 [ 네이버부동산]

by 일등미노왕국 2023. 2. 6.

셀레니움을 통한 네이버 부동산 크롤링에 대해서 알아보도록 하자

우선 네이버 부동산 기준 한 아파트 기준으로 페이지당 20개만 노출이 된다. 

따라서 더 많은 정보를 얻기 위해서는 페이지 수를 달리하면서 크롤링을 이어나가야 한다.

우린 학습을 하기 위해서 크롤링을 하는 것이 때문에 그 대상이 되는 네이버의 피해가 최소한으로 될 수 있도록 무리를 주지 않은 정도로만 연구하여야 한다. 

 

 

따라서 이번 시간은 네이버 부동산의 단지정보 크롤링을 최대 20개만 가져오는 코드를 진행하려고 한다.

 

코드 진행은 이렇다.

1. 네이버부동산(셀레니움)시트에서 지역과 아파트를 더블 클릭하면

2. 이벤트가 발생하여 네이버부동산 모듈에 아파트아이디와 아파트의 위/경도를 전달한다.

Sub 네이버부동산(Mid&, Lat#, lon#)

해당 스킬은 다잡님이 본인의 유튜브에서 소개하신 적이 있으니 잘 이해가 안 가거나 궁금하신 분들은 영상을 참조하기 바란다.

https://www.youtube.com/watch?v=nhGGcD7CiBk 

 

네이버부동산에서 지역을 검색하면 주소창처럼 위경도 표시와 배율(16) , 물건의 종료와 거래방식을 표기하는 주소가 생성이 된다. 네이버 부동산 주소의 분석방법은 오빠두를 검색 해보길 바란다.

https://www.youtube.com/watch?v=fl0BIk1e9Z0&t=4031s 

 

글로는 힘들어도 영상으로는 더 쉽게 이해가 가기에 가벼운 마음으로 정독해 보길 바란다.

 

매물들은 Id값이 [ articleListArea ] 인 값에 담겨있다.

 Set Nodes = Sel.FindElementByCss("#articleListArea")
        
     For Each Node In Nodes.FindElementsByCss(".item")

그래서 Nodes 에 아파트 단지 정보를 담고 자식태그인 div 태그들은 For each 구문으로 순화하면서 값을 도출해 나가면 된다.

For Each Node In Nodes.FindElementsByCss(".item")
            
        Vtemp = Split(Node.Text, Chr(10))

        On Error GoTo err:

            rngX(1, 1) = Split(Vtemp(0), " ")(0)                         
            rngX(1, 2) = Split(Vtemp(0), " ")(1)                        
            rngX(1, 3) = Split(Vtemp(2), ",")(1)                           
            rngX(1, 4) = Split(Vtemp(2), ",")(0)                           
            rngX(1, 5) = Node.FindElementByCss(".price_line>.type").Text  
            rngX(1, 6) = Node.FindElementByCss(".price_line>.price").Text  
            rngX(1, 7) = Split(Vtemp(2), ",")(2)                            
            rngX(1, 8) = Vtemp(3)                                         

        On Error GoTo 0

        Set rngX = rngX.Offset(1)
haja:
Next Node

Vtemp 안에 각 Node.text값을 줄 바꿈으로 Split 하여 적당하게 각 셀에 넣는 것이 가장 쉬운 방법이지만

이처럼 우리가 생각하는것처럼 이쁘게 한번에 떨어지지 않기 때문에 약간의 조합과 분리를 하여 결과를 도출해 내야 한다.

더보기
Sub 네이버부동산(Mid&, Lat#, lon#)

    Dim Sel As New Selenium.WebDriver
    Dim rngX As Range: Set rngX = [t3]
    Dim Nodes As Object, Node As Object
    Dim Vtemp
    
    Dim strUrl$, Str$
        
         strUrl = "https://new.land.naver.com/complexes/" & Mid & "?ms=" & Lat & "," & lon & ",16&a=APT&b=A1:B1:B2:B3&e=RETAIL"

         Sel.AddArgument "--headless"
         Sel.Start "chrome"
         Sel.Get strUrl
      
         Set Nodes = Sel.FindElementByCss("#articleListArea")
        
            For Each Node In Nodes.FindElementsByCss(".item")
            
                Vtemp = Split(Node.Text, Chr(10))
                
                On Error GoTo err:
            
                    rngX(1, 1) = Split(Vtemp(0), " ")(0)                            '= 아파트명
                    rngX(1, 2) = Split(Vtemp(0), " ")(1)                            '= 동
                    rngX(1, 3) = Split(Vtemp(2), ",")(1)                            '= 층
                    rngX(1, 4) = Split(Vtemp(2), ",")(0)                            '= 평형
                    rngX(1, 5) = Node.FindElementByCss(".price_line>.type").Text   '= 거래방식
                    rngX(1, 6) = Node.FindElementByCss(".price_line>.price").Text  '= 조건
                    rngX(1, 7) = Split(Vtemp(2), ",")(2)                            '= 방향
                    rngX(1, 8) = Vtemp(3)                                           '= 정보
            
                On Error GoTo 0

                Set rngX = rngX.Offset(1)
haja:
            Next Node
 
    Sel.Close
    MsgBox "모든 출력을 완료했습니다."
    
    Exit Sub
    
err:
     rngX(1, 1).Resize(1, 8).ClearContents
     err.Clear
     GoTo haja
   
End Sub

이번에는 파일을 첨부하진 않겠다. 위 코드가 제대로 돌아가기 위해서는 아파트 단지코드와 아파트 단지의 위경도가 필요하다 테스트를 위해서는 본인들의 동네의 위 경로들 차례로 넣어서 실습해 보길 바란다.

 

2023.02.04 같은 크루인 다잡님의 [셀레니움 자동화] 원데이 클래스가 있었다. 정말 좋은 시간이었고, 기회가 된다면 더 많은 분들이 원데이 클래스에 참여하여 본인과 같은 감동을 느끼기를 바란다. 다잡님 원데이 클래스 강의에 네이버부동산이 있어서 혹여나 방해가 될 수 있어 금일 코드를 올린다.

올해는 예전처럼 많이 것들이 정상화되리라 본다. 빠른 시일 내에 엑사남님의 원데이 클래스던 정모던 이 글을 읽는 여러분들과 얼굴을 맞대어 VBA라는 이 재밌는 장난감 같은 녀석에 대해서 이야기하며 좋은 시간을 보내고 싶다.

 

마지막으로 WinHttp로 단지의 전체 데이터를 가져오는 것을 끝으로 글을 마치려고 한다. 그럼 빠빠이~~

 

아.. 맞다.. 나의 뮤즈 준빠!!!
사랑합니다.

 

댓글