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

[심화방] VBA_심화_100제 #2 [ 네이버 뉴스 ]

by 일등미노왕국 2022. 12. 26.

셀레니움 크롤링 두번째시간이다. 

이번 시간은 이전 다잡님이 올려주신 것을 셀레니움으로 만들어보는 것을 만들어보려한다.

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

이런 기사나 웹의 글들을 수집하기 위해서는 winHttp나 xmlHttp로 크롤링하는게 맞지만 지금은 셀레니움을 공부하는 차원이기 때문에 연구 목적으로 보길 바란다..

 

구글 개발자 모드에서 태그를 선택후 

보게 되면 Elements가 표시가 되고 옆에 Console 탭이 있는데 거기서 디버깅을 하게 되면 계속 Elements 탭과 Console 창을 왔다 갔다 해야하니 비효율적이다. 그래서 꿀팁을 알려드리면 Elements 탭에서 ESC 키를 누르면 Elements 탭 밑에 바로 콘솔창이 보이게 된다.

자 이곳에 저번시간에 배웠던 콘솔창에 디버깅을 하면 된다.

이것은 기사의 제목을 가져오는 구문이다.

document.querySelectorAll("ul.list_news>li>div>div>a").forEach(ele=>{console.log(ele.text)})

이것은 기사의 링크가 a태그의 href에 담겨 있기에 그것을 가져오는 구문이다.

document.querySelectorAll("ul.list_news>li>div>div>a").forEach(ele=>{console.log(ele.href)})

이것은 썸네일을 가져오는 구문인데 화면에 보면 숫자5가 보일것이다.

document.querySelectorAll("ul.list_news>li>div>a>img").forEach(ele=>{console.log(ele.src)})

이것은 화면에 보일때 사진이 보여지기 때문에 화면 스크롤을 하단까지 내려줘야 비로소 저 썸네일 링크가 열리게 된다.

 If j > 4 And bln = False Then                              
                                                                         
       Sel.Wait 1000
       Sel.ExecuteScript ("window.scrollTo(0, 1200);")


       bln = True                                                
End If

더보기
Sub 크롤링()

    Dim html As Object: Set html = CreateObject("htmlfile")
    Dim Sel As New Selenium.WebDriver
    Dim strurl$
    Dim rngX As Range: Set rngX = [c2]
    Dim keyWord$: keyWord = [a2]
    Dim Nodes As Object
    Dim NodeImg As Object
    Dim Obj As Object
    Dim bln As Boolean
    Dim Pic
    Dim i&, j&
    Dim link$, Hylink$
        
    [c2].CurrentRegion.Offset(1).ClearContents
    
    For Each Pic In ActiveSheet.Shapes                                    '= 썸네일 순환
    
        If Pic.Name <> "Button 1" Then Pic.Delete                         '= 매크로 버튼이 아니면 삭제
                                                                          '= 썸네일 사진만 삭제
    Next Pic

    Application.ScreenUpdating = False
    
    For i = 1 To 10
       
        strurl = "https://search.naver.com/search.naver?where=news&sm=tab_pge&query=" & keyWord & "&start=" & (i - 1) * 10 + 1
        Set Nodes = html.getElementsByTagName("em")

        'Sel.AddArgument "--headless"                                     '= 헤드리스 모드
         Sel.Start "chrome"                                               '= 크롬으로 진행
         Sel.Get strurl
         
         Set Nodes = Sel.FindElementsByCss("ul.list_news>li>div>div>a")   '= 뉴스제목과 링크
        
         Set NodeImg = Sel.FindElementsByCss("ul.list_news>li>div>a>img") '= 썸네일 태그
       
         For Each Obj In Nodes
          
               j = j + 1
               
               If j > 4 And bln = False Then                              '= 썸네일은 화면이 노출이 되야 읽어오기 때문에
                                                                          '= 네번째 기사까지 보여지면
               Sel.Wait 1000
               Sel.ExecuteScript ("window.scrollTo(0, 1200);")
                                                                          '= 자바스크립트로 화면을 밑으로 내려라
               
               bln = True                                                 '= 밑으로 내려갔으면 10개의 기사를 다 가져올때까진
               End If                                                     '= 그래도 유지해야 하기에 Bln사용
               
               link = NodeImg(j).Attribute("src")                         '= 썸네일 img 태그의 속성값이 src를 가져와라
          
               Set Pic = ActiveSheet.Pictures.Insert(link)                '= 링크를 셀에 출력하고
               
               rngX(1, 1) = insert_pic(rngX, Pic)                         '= 셀의 크기에 맞게 사진의 위치와 크기를 변경하는 함수
               rngX(1, 2) = Obj.Text                                      '= 기사 제목
               Hylink = Obj.Attribute("href")
               rngX(1, 3) = Hyper_link(rngX(1, 3), Hylink)                '= 하이퍼링크
               
               Set rngX = rngX.Offset(1)                                  '= 다음 행으로 이동
         
         Next Obj
        
            j = 0                                                         '= 화면의 위치를 이동시키는 j 를 초기화
            bln = False                                                   '= 화면의 위치를 판단할 bln 초기화
            Sel.Wait 1000                                                 '= 1초 딜레이
    Next i
    Application.ScreenUpdating = True
    MsgBox "키워드 뉴스 출력을 완료했습니다"
         
End Sub

Function insert_pic(rngX As Range, Pic As Variant)

    With Pic
        .ShapeRange.LockAspectRatio = msoFalse                            '= 사진의 가로세로 고정비율 해제
        .Top = rngX(1, 1).Top + 1
        .Left = rngX(1, 1).Left + 1
        .Width = rngX(1, 1).Width - 2
        .Height = rngX(1, 1).Height - 2
    End With

End Function

Function Hyper_link(rng As Range, url$)                                  '= 기사의 하이퍼링크 연결
    
    ActiveSheet.Hyperlinks.Add anchor:=rng, Address:=url, ScreenTip:="[웹브라우저 연결]"
    rng.Font.Underline = xlUnderlineStyleNone
    rng.Font.Color = rgbDarkBlue
    rng.Font.Bold = True
    rng.Font.Size = 9

    Hyper_link = rng
End Function

펑션에 있는 코드들은 솔직히 사족이 많다.

그냥 좀더 공부하는 차원으로 썸네일도 넣어보고 하이퍼링크도 넣어본것이다.

코드가 길다가 겁먹지 마시고 하나하나 뜯어보시길 바란다.

메리크리스마스~~

셀레니움#2(네이버뉴스).xlsm
0.05MB

댓글