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

[심화방] VBA_심화_100제 #5 [ Sk엔카 크롤링 ]

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

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

윤자동 ... 다잡님 채널에서 공개된 엔카 중고차 매물에 관한 셀레니움 과제이다.

다잡님 강의에서 Html 파싱을 위해 분석하는 법까지 공개하였으니 , 참고하여 보시길 바란다. 

 

네이버뉴스에서처럼 이미지를 가져오려면 페이지가 모두 로딩이 되어야 이벤트가 발생하여 가져올 수 있기 때문에 매물정보는 다음페이지가 아닌 한 페이지 매물만 가져오는 코드이다. 너~~무 느려

 

저번에도 공개하였듯이 스크롤을 움직이는 자바스크립트 구문은 이렇다...

Sel.ExecuteScript ("window.scrollTo(0, 2100);")

 

보통 2100이라는 숫자는 화면 높이로서 보통 99999 이렇게 무한에 가까운값을 넣어 한방에 내리는데 sk엔카 페이지는 그렇게 하면 아래부분만 열리기에 천천히 매물수에 따라 열어야 한다. 

 

이번 셀레니움을 준비하면서 본인도 Css 선택자에 대해서 많이 공부하였다. 

css 선택자를 공부하면 태그를 좀더 깔끔하고 이쁘게 가져올 수 있다.

 

details(0) = Obj.FindElementByCss(".inf span.yer").Text
details(1) = Obj.FindElementByCss(".inf span.km").Text
details(2) = Obj.FindElementByCss(".inf span.fue").Text
details(3) = Obj.FindElementByCss(".inf span.loc").Text

 

이 뜻은 Class가 inf 인 태그에서 그 자손태그 중 태그가 span이고 Class가 각각 yre,km,fue,loc인 텍스트를 배열로 담으라는 구문이다. 보통 이를 Copy selector로 가져오면

#sr_normal > tr:nth-child(1) > td.inf > span.detail > span.yer  로 복사되어 이것을 Css선택자로 파싱하여야 한다.

이것은 좀 짧은 편인데 말도 안되게 긴 selector구문이 있으니 시간날 때 틈틈이 공부하길 바란다.

본인도 공부하고 공부하는중이다. 마지 정규식 푸는거 같지 않은가...아..너무 재밌어...

더보기
Sub sk엔카()

    Dim Sel As New Selenium.WebDriver
    Dim strurl$, CarImg$, inf$
    Dim details(3)
    Dim rngAll As Range: Set rngAll = [a2:c21]
    Dim Vtemp, Cnt&: Cnt = 0
    Dim rngX As Range: Set rngX = [a2]
    Dim Nodes As Object, Obj As Object
        
    Haja_Format rngAll                                                 '= 초기화
    Application.ScreenUpdating = False
        strurl = "http://www.encar.com/dc/dc_carsearchlist.do?carType=kor"

        ' Sel.AddArgument "--headless"                                 '= 헤드리스 모드
         Sel.Start "chrome"                                            '= 크롬으로 진행
         Sel.Get strurl
        
         Set Nodes = Sel.FindElementsByCss("#sr_normal>tr")            '= Tbody tr태그
         Sel.ExecuteScript ("window.scrollTo(0, 2100);")               '= 스크롤 제어 Js

         For Each Obj In Nodes                                         '= 순환해라
            
            Cnt = Cnt + 1
            If Cnt >= 10 Then Sel.ExecuteScript ("window.scrollTo(0, 3100);")
            
            inf = Obj.FindElementByCss(".inf .cls").Text               '= 차량 정보
            
            If inf = "" Then GoTo haja                                 '= 텍스트값을 못 가져오면 다음 매물로 이동해라
            CarImg = Obj.FindElementByCss(".img img").Attribute("src") '= 이미지 링크
            ActiveSheet.Shapes.AddPicture CarImg, False, True, rngX.Left, rngX.Top, rngX.Width, rngX.Height + 2
           
            details(0) = Obj.FindElementByCss(".inf span.yer").Text    '= 연식
            details(1) = Obj.FindElementByCss(".inf span.km").Text     '= 주행거리
            details(2) = Obj.FindElementByCss(".inf span.fue").Text    '= 연료구분
            details(3) = Obj.FindElementByCss(".inf span.loc").Text    '= 차량위치
            
            rngX(1, 2) = inf & Chr(10) & details(0) & " | " & details(1) & " | " & details(2) & " | " & details(3)
            rngX(1, 3) = Obj.FindElementByCss(".prc_hs").Text           '= 가격
            
            Set rngX = rngX.Offset(1)
haja:
         Next Obj
    Application.ScreenUpdating = True
    Sel.Close
    MsgBox "Sk엔카 출력을 완료했습니다."
         
End Sub

Function Haja_Format(rngAll As Range)

    Dim sh As Shape
    
    For Each sh In ActiveSheet.Shapes                                '= 매크로 버튼을 제외한 모든 이미지객체를 삭제해라
    
        If sh.Name <> "Button 1" Then sh.Delete
    
    Next sh

    rngAll.WrapText = False                                          '= 셀에 맞춤
    rngAll.ClearContents
    rngAll.HorizontalAlignment = xlCenter
    rngAll.Borders.LineStyle = 1

End Function

sk엔카.xlsm
0.39MB

댓글