VBA Macro/VBA Excel

[엑셀] 웹 페이지 크롤링/스크래퍼 매크로

루아흐뉴마 2017. 10. 21. 02:20
반응형
## 웹 페이지 크롤링(실험)
회사 업무중에 웹 페이지를 크롤링 해야 할 일이 생겨서 찾아보던 중
자바나 다른 언어는 할 줄 모르기 때문에 현재 내가 할 수 있는 가장 쉬운 방식을 찾았다.
구글 스프레드시트 importxml 함수를 통힌 파싱도 쉬워(노가다)보이는데 웹페이지에 따라서 제약이 좀 있는 듯하다.

※ "동일한 형식의 데이터를 보여줄 동일한 웹페이지를 URL 형식으로 모두 인덱싱 할 수 있어야 한다."는 점이 중요해 보인다.
무슨 소리나면, 요새 웹페이지들이 http://도메인 이후 파라미터를 숨겨놓은 데가 많은데,
그래서 페이지 인덱스가 바뀌어도 URL은 그대로라서 URL by URL 방식의 크롤링이 (마치 안되는 것처럼) 보인다.
그런데 거꾸로, 페이지 인덱스만 찾아준다면 아래의 VBA 코드를 이용해서 URL만 살짝씩 바꿔주는 방식으로 원하는 모든 페이지를 긁어올 수 있다.
그래서 http://domain/function.do?pageIndex=XX      이와 같이 URL 도메인, 자바 Function 이후에
pageIndex를 직접 설정해주어 페이지를 임의로 접근할 수 있도록 한다면
의외로 간단해진다. 더욱이 pageIndex 파라미터를 찾는 일은 그렇게 어렵지 않다!
자바를 잘 모르지만 function으로 class name을 갖다 쓰는 것 같다. 구글 요소 검토 페이지에서 페이지 넘버링 링크를 살펴보면 class name은 쉽게 찾을 수 있다.

예) 고용부 직업훈련 포털을 가보면, http://www.hrd.go.kr/hrdp/ti/ptiao/PTIA00100L.do 구직자 훈련과정 리스트가 나오는데
페이지 아무리 넘겨봐도 URL은 그대로다. 여기서 개강일자(startDate), 종료일자(endDate), 페이지인덱스(pageIndex)를 찾아서
파라미터로 넣어주니 클릭할 필요없이 페이지를 인덱싱할 수 있다.
http://www.hrd.go.kr/hrdp/ti/ptiao/PTIAO0100L.do?startDate=20170101&endDate=20171231&pageRow=100&pageIndex=1
(2017년 1월 1일부터 2017년 12월 31일까지 한 페이지에 100개씩 1페이지를 보여주는 웹주소)


기본 코드만 제시하고 다양한 페이지에 시험해볼 예정


엑셀 웹 페이지 크롤링 VBA 코드(기본)
Option Explicit
Sub Weber()
    

    With Sheets("Sheet1").QueryTables.Add(Connection:= _
        "URL;http 형식의 URL 주소", Destination:=Range("$A$1"))
        '예) "URL;http://www.naver.com/" 따옴표 안에 URL;주소 부분을 기입
        .Name = "Name #1"
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = False
        .RefreshOnFileOpen = False
        .BackgroundQuery = True
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .WebSelectionType = xlEntirePage
        .WebFormatting = xlWebFormattingRTF
        .WebPreFormattedTextToColumns = False
        .WebConsecutiveDelimitersAsOne = True
        .WebSingleBlockTextImport = False
        .WebDisableDateRecognition = True
        .WebDisableRedirections = True
        .Refresh BackgroundQuery:=False
    End With

End Sub '일단 상단까지 실행하면 A열에 해당 웹페이지의 내용을 리스팅한다. '이후 리스팅되는 내용의 형식에 따라서 정리하는 코드를 마음대로 짜면 된다. (그렇게 어렵지 않다.)


매크로 실행 동영상




반응형