VBA 셀레니움 활용한 동적페이지 크롤링 오류

VBA
작성자
안알랴줌
작성일
2022-03-22 00:57
조회
408
엑셀버전 : 엑셀2010 이전

운영체제 : 윈도우10

안녕하세요

첨부드린 엑셀 처럼 A열에 있는

키워드로 네이버 쇼핑 검색 결과를 트래킹 하는

엑셀시트인데

동적페이지에 대응하도록 스크롤 관련 명령어(아래)를 추가하니

For i = 1 To 100
cd.ExecuteScript ("window.scrollTo(0, 99999);")
cd.Wait (500)

상품가격(i) = TextToInt(ele.Text) 이 부분에서

'9'런타임  오류가 발생 합니다. (아래첨자 사용이 잘못되었습니다. 라고 나옵니다)

어떻게 수정 하면 좋을까요 ㅜ

(+ 동적 스크롤 명령어 추가후 크롤링 속도가 많이 느려 졌는데

줄이는 법도 있을까요?)

*크롤링test-v1 파일은 수정 전 정상 작동 하던 파일 입니다.

 

 

 

=-=-=-= VBA 스크립트 내용 =-=-=

' 배열 시작 인덱스 1로 고정
Option Base 1
' 크롤링 시작
Sub 시작()

Dim cd As Selenium.WebDriver
Dim ele As Selenium.WebElement
Dim tRng As Range, oRng As Range
Dim srcTxt As String
Dim 평균가격 As Double, i As Integer, j As Integer
Dim 상품가격() As Double

Call 초기화(ActiveSheet)

Set cd = New WebDriver
' 크롬 브라우저 백그라운드로 동작
cd.AddArgument ("headless")
cd.Start "chrome"

' 상품명
Set oRng = Range(Range("A1").Offset(1, 0), Range("A1048570").End(xlUp))

For Each tRng In oRng
평균가격 = 0
i = 0

srcTxt = tRng.Value
' cd.Wait (500)

cd.Get "http://surffing.net/getSearchAPI.do?keyword=+" + srcTxt

nTotalCnt = 0

For Each ele In cd.FindElementsByClass("center")

If ele Is Nothing Then
Exit For
Else
' 월간PC검색량
pc = ele.FindElementByXPath("/html/body/div[2]/table/tbody/tr[3]/td[2]").Text
' 월간MOBILE검색량
mobile = ele.FindElementByXPath("/html/body/div[2]/table/tbody/tr[3]/td[3]").Text

tRng.Offset(0, 1) = pc
tRng.Offset(0, 2) = mobile

Exit For
End If
Next ele

cd.Get "https://search.shopping.naver.com/search/all?query=+" + srcTxt + "+&frm=NVSHATC"

 

' 동적 로딩 대응
' 필요한 정보가 모두 로딩될 때 까지 스크롤을 임의로 내린다
For i = 1 To 100
cd.ExecuteScript ("window.scrollTo(0, 99999);")
cd.Wait (500)

 

Next

' 총상품수
For Each ele In cd.FindElementsByClass("subFilter_num__2x0jq")
tRng.Offset(0, 4) = ele.Text
Exit For
Next

' 상품별가격 동적배열
ReDim 상품가격(cd.FindElementsByClass("price_num__2WUXn").Count)

For Each ele In cd.FindElementsByClass("price_num__2WUXn")
i = i + 1
평균가격 = 평균가격 + TextToInt(ele.Text)
상품가격(i) = TextToInt(ele.Text)
Next ele
tRng.Offset(0, 5) = Format(평균가격 / i, "#,###")

' 상품별가격
For j = 1 To i
' 제목열 작성
If tRng.Row = 2 Then
tRng.Offset(-1, 5 + j) = "상품" & j
End If
tRng.Offset(0, 5 + j) = Format(상품가격(j), "#,###")
Next j

Next

MsgBox "크롤링 완료"

cd.Close
Set cd = Nothing

End Sub
' 서식 초기화
Sub 초기화(ByRef actSht As Worksheet)

' 상품1 ~ ahctsht.columns열 (제목)
Range(Cells(1, 7), Cells(1, actSht.Columns.Count)).Clear
' B:C열 (데이터)
Range(Cells(2, 2), Cells(actSht.UsedRange.Rows.Count, 3)).Clear
' E~actsht.columns열 (데이터)
Range(Cells(2, 5), Cells(actSht.UsedRange.Rows.Count, actSht.UsedRange.Columns.Count)).Clear

End Sub
' 텍스트가격 숫자로 변경
Function TextToInt(ByVal 가격 As String) As Double

Dim 반환값 As Variant

반환값 = Split(가격, "원")
반환값(0) = Replace(반환값(0), ",", "")

TextToInt = Val(반환값(0))

End Function

전체 5

  • 2022-03-22 02:44

    @안알랴줌 님 상품가격을 동적배열로 넣으시려는 것 같은데 변수 타입이 잘 못 선언 되었습니다.

    Dim 상품가격() As Double 대신 Dim 상품가격() As Variant 이렇게 하셔야 할 것 같습니다.


    • 2022-03-22 09:04

      @나는나 님 답변 감사합니다 ! 우선 그부분은 수정 하였는데, 질문드린것과 같은 부분에서 아래 첨자가 잘못 되었다는 런타임 오류가 발생 하여서 ㅜㅜ 혹시 또 수정이 필요한 부분 이 있을까요 ?

      런타임오류.png


      • 2022-03-22 12:09
        채택된 답변

        @안알랴줌 님 동적 로딩을 위해 scrollTo를 사용하시면서 i = 1 To 100 로 하셨잖아요. 그런데 그 아래 스크립트에서 상품가격(i) 이렇게 배열에 담으시려면 이때 i 값은 101이 됩니다. Class "price_num__2WUXn"의 갯수가 40개인 배열(그릇)에 101번 배열 값을 입력하라고 하셔서 에러가 발생한 것 같습니다. i = 0으로 초기화하는 구문을 For문 위에 추가하셔야 할 것 같습니다.

        그리고 동적 로딩 방법을 알못 블로그에서 참고하신 것 같습니다. 거기에서는 nTotalCnt를 0에서 시작해서 순환문이 돌 때마다 수집한 엘리먼트의 갯수와 비교해서 동일해지면 For 순환문을 탈출하는 if문을 넣었기 때문에 굳이 100번까지 반복하지 않고 빠져나오게 됩니다. nTotalCnt = 0은 남겨두고 순환문에서는 지우셨기 때문에 동적 로딩이 다 끝났어도 불필요하게 1분 가량을 그냥 기다리고 있어야 합니다. "price_num__2WUXn" 갯수와 nTotalCnt를 비교해서 if문을 넣으시면 스크롤하는 대기 시간이 많이 단축될 것 같습니다.

        사족1 - cd.AddArgument ("headless") 이 구문을 주석처리해서 크롬 브라우저가 작동하는 걸 눈으로 직접 보면서 코드 수정을 하시고 다 완성되면 주석 해제하시면 좋을 것 같습니다.

        사족2 - '총상품수' 구하는 구문은 엘리먼트가 한 개뿐이라 굳이 For 순환문을 사용하지 않으셔도 될 것 같습니다.


        • 2022-03-22 12:31
              ' 동적 로딩 대응
              ' 필요한 정보가 모두 로딩될 때 까지 스크롤을 임의로 내린다
              For i = 1 To 100
                  cd.ExecuteScript ("window.scrollTo(0, 99999);")
                  cd.Wait (500)
                  
                 If ntotalcnt = cd.FindElementsByClass("price_num__2WUXn").Count Then
                      Exit For
                  Else
                      ntotalcnt = cd.FindElementsByClass("price_num__2WUXn").Count
                  End If
              Next
          
          '''''''''
          
              ' 상품별가격 동적배열
              ReDim 상품가격(cd.FindElementsByClass("price_num__2WUXn").Count)
              
              i = 0
              For Each ele In cd.FindElementsByClass("price_num__2WUXn")
                  i = i + 1
                  평균가격 = 평균가격 + TextToInt(ele.Text)
                  상품가격(i) = TextToInt(ele.Text)
              Next ele
              tRng.Offset(0, 5) = Format(평균가격 / i, "#,###")

          이왕 테스트하느라 입력해봤으니 코드도 추가합니다.

           


          • 2022-03-22 12:45

            @나는나 님 감사합니다! 덕분에 해결 되었습니다 ㅜ 아무래도 아직 공부가 저는 많이 필요 한거 같네요!!


전체 6,889
번호 카테고리 제목 작성자 작성일 추천 조회
알림
📌 -- VBA 기초-활용 4주 완성, 특별 스터디 모집을 시작합니다! (모집 마감) -- 📌 (98)
오빠두엑셀 | 2022.06.23 | 추천 143 | 조회 17648
오빠두엑셀 2022.06.23 143 17648
공지사항 함수/공식
⭐ [더 나은 커뮤니티 문화를 위한 Q&A 글 작성 규칙] ⭐ (79)
오빠두엑셀 | 2021.10.28 | 추천 97 | 조회 5341
오빠두엑셀 2021.10.28 97 5341
39009 함수/공식
New index,match 함수 중에서 동일한 값이 나올때 첨부파일 (2) 답변완료
최사무엘 | 17:33 | 추천 0 | 조회 6
최사무엘 17:33 0 6
39007 함수/공식
New VLOOKUP 조건에 맞는 것을 계속해서 나열하고 싶을 때 첨부파일 (1)
야자키겐스케 | 16:43 | 추천 0 | 조회 15
야자키겐스케 16:43 0 15
39003 함수/공식
New 셀에서 영어만 추출하기 엑셀파일첨부파일 (2) 답변완료
킹셀 | 16:15 | 추천 0 | 조회 17
킹셀 16:15 0 17
38996 VBA
New 현재 열넓이 확인후 20 더하는 방법 (1)
033cola | 13:56 | 추천 0 | 조회 26
033cola 13:56 0 26
38990 함수/공식
New 중복값중에 하나만 더하기 엑셀파일첨부파일 (2) 답변완료
DS | 13:08 | 추천 0 | 조회 21
DS 13:08 0 21
38987 함수/공식
New 행 열이 모두 숫자입니다. 첨부파일 (1)
DOUKCHEON 이재형 | 11:53 | 추천 0 | 조회 24
DOUKCHEON 이재형 11:53 0 24
38983 함수/공식
New 카드번호별로 시트를 만들 수 있는 방법을 알고 싶습니다! - 관련 엑셀첨부 엑셀파일첨부파일 (2)
showtime**** | 10:14 | 추천 0 | 조회 26
showtime**** 10:14 0 26
38982 파워쿼리/피벗
New 파워쿼리에서 영문과 숫자만 순서대로 추출 (4)
아코니 | 10:10 | 추천 0 | 조회 32
아코니 10:10 0 32
38981 구글시트
New COUNTIF 함수와 SUBTOTAL 엑셀파일첨부파일
거꾸로문 | 10:02 | 추천 0 | 조회 15
거꾸로문 10:02 0 15
38979 문서서식
New 서로 다른 엑셀 파일 비교 첨부파일 (2)
notice | 09:18 | 추천 0 | 조회 23
notice 09:18 0 23
38976 함수/공식
New BOM 오류 확인 방법 문의 첨부파일 (4)
터브가이황 | 07:55 | 추천 0 | 조회 26
터브가이황 07:55 0 26
38973 VBA
New 점수가 6점이상만 시트2에 표기하는 VBA 또는 매크로 표기하는 방법 문의 합니다. 엑셀파일첨부파일 (3)
파란맥 | 00:37 | 추천 0 | 조회 27
파란맥 00:37 0 27
38972 함수/공식
New 함수표현식을 Ctrl + x 사용하여 가져올때, Sheet 참조 제거하는법 (3)
JH | 00:33 | 추천 0 | 조회 30
JH 00:33 0 30
38970 VBA
New VBA 1주차 공부하면서 응용해보다가 (2) 답변완료
daniel | 00:21 | 추천 0 | 조회 31
daniel 00:21 0 31
38959 기능/도구
New 데이터 분할 방법 엑셀파일첨부파일 (1)
dfgkdflglkdf | 2022.07.04 | 추천 0 | 조회 23
dfgkdflglkdf 2022.07.04 0 23
38948 문서서식
New 액셀 카카오톡 문자보내기 자동화 양식 그림 카톡 보내기 오류 해결 방법 문의 드립니다! 첨부파일
ROLLUP | 2022.07.04 | 추천 0 | 조회 25
ROLLUP 2022.07.04 0 25
38942 문서서식
New 안녕하세요 엑셀 날짜변환에 대해서 질문드립니다. (3)
겸둥이k | 2022.07.04 | 추천 0 | 조회 38
겸둥이k 2022.07.04 0 38
38940 함수/공식
New IF함수 순자적으로 조건 적용되도록 만들고 싶어요 엑셀파일첨부파일 (3)
마운틴 | 2022.07.04 | 추천 0 | 조회 42
마운틴 2022.07.04 0 42
38939 VBA
New 특정조건일경우 값 입력 (4) 답변완료
천하무적 | 2022.07.04 | 추천 0 | 조회 32
천하무적 2022.07.04 0 32
38932 VBA
New 재고관리 프로그램 중 등록시 '13런타임 오류'나는데 모르겠어요 첨부파일 (1)
파랑지니 | 2022.07.04 | 추천 0 | 조회 27
파랑지니 2022.07.04 0 27
38909 파워쿼리/피벗
New 파워쿼리 작성 엑셀파일 (2) 답변완료
당신을축복하는올빼미 | 2022.07.04 | 추천 0 | 조회 43
당신을축복하는올빼미 2022.07.04 0 43
38907 함수/공식
New INDEX + MATCH 함수 에러 문제관련 (1)
brain hoon | 2022.07.04 | 추천 -2 | 조회 35
brain hoon 2022.07.04 -2 35
38905 VBA
New [1주차]VBA 미션... 다들 해보셧나요? 도움 좀..ㅠ 첨부파일 (3)
배성철 | 2022.07.04 | 추천 0 | 조회 34
배성철 2022.07.04 0 34
38899 함수/공식
New 어떤 함수를 써야 될지 (4)
정상진 | 2022.07.04 | 추천 0 | 조회 43
정상진 2022.07.04 0 43
38895 대시보드
New 데이터 입력시 자동으로 보고서 작성 첨부파일 (2)
bmmania | 2022.07.04 | 추천 0 | 조회 38
bmmania 2022.07.04 0 38
38889 함수/공식
New 중복 데이터 에서 2개 이상 조건을 만족하는 고유 항목 개수 세기 (1)
곱칭 | 2022.07.04 | 추천 -2 | 조회 34
곱칭 2022.07.04 -2 34
38868 VBA
New 행복한 한 주 시작 하시길 바랍니다. 도와주세요(고급필터 애러) 엑셀파일첨부파일 (2)
파란맥 | 2022.07.04 | 추천 0 | 조회 29
파란맥 2022.07.04 0 29
38839 VBA
New 1주차 VBA 강의 질문입니다 첨부파일 (1)
WWW | 2022.07.03 | 추천 0 | 조회 37
WWW 2022.07.03 0 37
38828 VBA
New VBA 스터디 1주차 두번째 미션 실패 ㅠㅠ 도와주세요 첨부파일 (1)
YJ | 2022.07.03 | 추천 0 | 조회 27
YJ 2022.07.03 0 27
38811 구글시트
New COUNTA 함수 엑셀파일 (10) 답변완료
거꾸로문 | 2022.07.03 | 추천 0 | 조회 62
거꾸로문 2022.07.03 0 62