오빠두엑셀 `2026 무료 챌린지` 오픈! 완주하고 수료증 받아가세요! 5년 연속 IT분야 베스트셀러! 「 진짜쓰는 실무엑셀 」로 2026년 공부 끝내기 엑셀이 막히셨나요? Q&A 게시판에서 바로 해결하세요.
메뉴
VBA 프로젝트 강의

[네이버부동산크롤링] 엑셀 웹 크롤링, 완벽정리!

오빠두엑셀 by 오빠두엑셀
  • 학습시간 2시간 1분
  • 난이도 전문가
  • 작성일 2020.11.11

HTTP 요청을 활용한 웹 크롤링의 기초부터 네이버 부동산 정보를 크롤링하는 실전예제까지 총정리!

이 강의에서는 엑셀 VBA에서 HTTP 요청을 활용해 웹 페이지의 데이터를 시트로 자동으로 가져오는 방법을 다룹니다. 크롬 개발자 도구로 요청 URL과 JSON 응답 구조를 분석하는 절차부터, 네이버 연관검색어와 부동산 매물 정보를 한 번의 명령문으로 추출해 보고서 작업에 즉시 활용할 수 있도록 만드는 실전 예제까지 단계별로 정리합니다.

[네이버부동산크롤링] 엑셀 웹 크롤링, 완벽정리!
DOWNLOADS

실습자료를 준비했어요

수업에서 사용한 예제 파일과 보충 자료를 한 곳에 정리했습니다!👇

패치노트
  • 2022.08.25
    네이버 연관검색어 쿼리의 응답 구조가 변경되어, 기존 Splitter 함수를 아래와 같이 수정해야 올바른 결과를 반환합니다.

    strResult = Splitter(strResult, "items"" : [" & Chr(10) & "[", "]" & Chr(10))
  • 2020.11.17
    단지정보가 조회되지 않는 일부 지역을 검색할 경우, 단지정보 대신 해당 지역의 가용 매물 정보를 바로 조회하도록 명령문을 수정했습니다.
    (관련 게시물 : https://www.oppadu.com/question/?uid=8068&mod=document)
  • 2021.01.29

    네이버 부동산 리다이렉트 변경

    네이버 부동산의 위·경도 값을 받아오기 위한 기본 접속 URL이 302 redirect 처리되도록 네이버 정책이 변경되었습니다. (getRedirectURL 함수를 사용하였습니다.)
    이번 패치를 마지막으로 네이버 부동산 웹 크롤링 코드의 업데이트는 종료됩니다.
    네이버 정책 변경에 따라 페이지 구조가 자주 바뀌어 명령문을 매번 수정하기에는 어려움이 큰 점 양해 부탁드립니다.
    이번 강의에서 핵심으로 다룬 HTTP 요청을 통한 파싱 방법만 잘 응용하시면, 어떠한 상황에서도 손쉽게 웹 정보를 가져오실 수 있습니다.
    이번 강의가 여러분의 업무 자동화에 큰 도움이 되시길 바랍니다. 감사합니다.

.

라이브 강의 전체 영상도 함께 확인해 보세요!

위캔두 회원이 되시면 매주 오빠두엑셀에서 진행하는 라이브 강의 풀영상을 확인하실 수 있습니다.


웹 크롤링이란 무엇인가요?

웹 크롤링(Crawl) 또는 스크레이핑(Scrape)이란 특정 웹페이지의 데이터를 추출하는 행위를 의미합니다. 우리가 일반적으로 행하는 데이터 추출 작업은 엄밀히 말해 스크레이핑이 보다 정확한 용어이지만, 이번 강의에서는 편의를 위해 '크롤링'으로 통칭하여 사용하겠습니다.

웹 크롤링의 절차는 세부적으로는 여러 단계로 나뉘지만, 크게 보면 다음 2가지 단계로 이루어집니다.

(사용자) ->[1. URL 전송] -> (서버) ->[2. 페이지 응답] -> (사용자)

웹 크롤링으로 받아오는 데이터는 일반적으로 HTML 문서(<div>, <a> 등이 사용된 웹페이지 문서) 또는 JSON 형식으로 반환됩니다. 서버에서 데이터를 받아오는 과정 자체는 크롤링 방식과 무관하게 동일합니다.

서버 요청 동일

다만, 사용자가 서버로 요청을 보내는 방식에는 차이가 있습니다. VBA뿐 아니라 다른 프로그래밍 언어에서도 마찬가지로 서버에 URL 요청을 전송하는 방식은 크게 2가지로 구분됩니다.

  1. HTTP/XML 요청을 사용하는 방법 (편의상 'HTTP 요청'으로 칭하겠습니다.)
  2. 브라우저를 사용하는 방법

엑셀은 기본적으로 인터넷 익스플로러를 제어할 수 있는 'Microsoft Internet Controls' 라이브러리를 제공하였으나, 2020년 11월 말 이후 주요 기능 업데이트가 중단되었고 이듬해부터는 모든 기능 업데이트가 종료될 예정이어서 실무에서는 더 이상 사용할 수 없는 상황입니다.

따라서 현재 VBA를 통한 웹 크롤링은 HTTP 요청을 사용하는 방식과 셀레니움(Selenium) 라이브러리를 사용하는 방식 두 가지로 압축되었습니다. (이외에도 GitHub에서 제공되는 별도 라이브러리를 사용할 수 있습니다.)

웹 크롤링 방식

항목 HTTP 요청 브라우저 요청 (셀레니움 Basic)
호환성 엑셀 2010 이후 모든 버전에서 사용 가능 엑셀 외 별도 라이브러리 설치 필요
난이도 중간 중간 ~ 어려움
범용성 대부분의 페이지에서 사용 가능 로그인·공인인증서 접속 등 모든 상황에서 크롤링 가능
속도 빠름 보통

일반적으로 사용자가 필요로 하는 웹 크롤링(예: 특정 페이지의 데이터 추출)은 HTTP 요청만으로도 거의 모든 페이지를 처리할 수 있으며, 브라우저를 사용하는 방식에 비해 처리 속도가 월등히 빠르다는 장점이 있습니다.

다만 로그인 이후 페이지나 공인인증서 인증 이후 페이지처럼 특정 작업을 거쳐야만 접근할 수 있는 페이지는 반드시 브라우저를 통해 접속해야 합니다. 인터넷 익스플로러 사용이 중단된 현재로서는 셀레니움(Selenium Basic)과 크롬 브라우저를 활용한 방법으로 크롤링을 진행해야 하며, 셀레니움을 활용한 크롤링 예제는 향후 별도 강의에서 자세히 다룰 예정입니다.

URL 주소만으로 웹 크롤링을 할 수 없는 경우

웹 크롤링을 진행하다 보면 URL 주소만으로는 데이터를 가져올 수 없는 상황이 종종 발생합니다. 특히 하나의 페이지 안에서 다양한 종류의 DB를 다루는 경우가 대부분 이에 해당하는데요. 아래 예제를 통해 두 경우를 비교해 보겠습니다.

URL 주소로 데이터를 크롤링할 수 있는 경우
  1. 네이버 홈페이지에 접속합니다. (https://www.naver.com)

    네이버 크롤링 접속

  2. 검색할 단어를 입력한 뒤 [검색] 버튼을 클릭하면 검색결과 페이지로 이동하면서 상단의 URL 주소도 함께 변경됩니다.

    네이버 크롤링 쿼리 분석

  3. URL 주소의 쿼리문을 적절히 분석하면 URL만으로 손쉽게 데이터를 크롤링할 수 있습니다.
    https://search.naver.com/search.naver?where=nexearch&sm=top_hty&fbm=0&ie=utf8&query=%EC%97%91%EC%85%80

    https://search.naver.com/search.naver?query=엑셀
URL 주소로 데이터를 크롤링할 수 없는 경우
  1. 네이버 홈페이지에 접속합니다. (https://www.naver.com)

    네이버 접속

  2. 검색할 단어의 일부 글자만 입력합니다.

    연관검색어 검색

  3. 검색어 아래로 연관검색어 목록이 표시되면서 페이지 구조가 바뀌지만, 상단의 URL 주소는 그대로 유지됩니다. 이런 경우에는 URL 주소만으로 크롤링이 불가능하며, 페이지 안에서 실행된 자바스크립트 명령문이 반환하는 또 다른 URL을 분석해 데이터를 가져와야 합니다. 브라우저의 개발자 도구를 활용하면 페이지 구조를 손쉽게 분석할 수 있습니다.

    네트워크 분석

웹 크롤링으로 반환되는 2가지 대표 형식, HTML vs JSON

웹 크롤링으로 반환되는 데이터는 크게 HTML 형식과 JSON 형식으로 구분됩니다.

HTML 형식은

<div>, <a> 등 태그가 사용된 일반 HTML 문서이며, HTML 문서 라이브러리에서 제공하는 GetElementsByClassName이나 GetElementByID 등의 함수를 활용해 손쉽게 원하는 데이터만 추출할 수 있습니다.

JSON 형식

JavaScript에서 객체(=표)를 만들 때 사용되는 표현식으로, 사람과 기계 모두 이해하기 쉬운 언어입니다. 최근에는 XML을 대체하여 대부분의 페이지에서 데이터 전송 방식으로 사용되고 있습니다.

쉽게 말해 HTML은 페이지의 모든 정보(서식, 글꼴, 부가 자료까지 포함)를 반환하고, JSON은 원하는 특정 데이터(예: '엑셀' 연관검색어, 특정 지역의 단지 목록)만 반환할 때 사용됩니다.

두 데이터 형식의 차이점을 요약하면 아래와 같습니다.

항목 HTML JSON
단어 HyperText Markup Language JavaScript Object Notation
형식 다양한 태그·구성요소가 포함됨
(예: div, a, h1, h2, p, 그 외 서식 등)
데이터와 구분기호(대괄호·중괄호)만 포함
데이터 추출 HTML 문서 라이브러리의 GetElement 계열 함수로 손쉽게 추출 가능 별도의 함수 또는 파싱 프로그램 필요
(ParseJSON 함수 확인하러 가기)
사용 목적 웹 페이지 데이터를 사용자가 보기 좋게 꾸며 출력하기 위함 데이터 전달 자체만을 위함

네이버 연관검색어 크롤링

이번 강의에서는 네이버 연관검색어를 가져오는 방법과 부동산 매물 정보를 크롤링하는 방법을 살펴봅니다. 이번 강의에서 사용되는 매크로는 Windows OS 엑셀에서만 사용 가능합니다.

Mac에서는 HTTP 요청 라이브러리가 제공되지 않으므로 이번 강의의 내용으로는 진행이 불가능합니다.

브라우저의 개발자 도구는 모든 브라우저에서 제공되지만, 이번 강의에서는 크롬을 기준으로 진행합니다.

네이버 연관검색어 크롤링에 사용된 전체 명령문
Sub 연관검색어()
 
' 변수 설정
Dim URL As String
Dim htmlResult As Object  '<- GetHTTP 명령문의 결과값 ... >> HTML 문서
Dim strResult As String     '<-htmlResult 에서 받아온 HTML 문자열
Dim strSearch As String   '<- 검색단어
Dim v As Variant
Dim i As Long
 
strSearch = Sheet2.Range("C2").Value
URL = "https://mac.search.naver.com/mobile/ac?q=" & strSearch & "&frm=nv&st=100"
 
Set htmlResult = GetHttp(URL)
strResult = htmlResult.body.innerHTML
 
strResult = Splitter(strResult, "items"" : [ [", "] ] }")
 
v = Split(strResult, ",")
 
For i = LBound(v) To UBound(v)
    v(i) = Replace(Replace(v(i), "[""", ""), """]", "")
Next
 
ArrayToRng Sheet2.Range("A1"), v
 
End Sub
네이버 연관검색어 크롤링 단계별 살펴보기
  1. 네이버 홈페이지에 접속한 뒤, 크롬 창이 활성화된 상태에서 키보드 F12키를 눌러 개발자 도구를 실행합니다.

    개발자도구 실행

  2. 개발자 도구의 [Network] 탭으로 이동합니다.

    네트워크 도구 이동

  3. 검색창에 원하는 단어를 입력하면 개발자 도구에 새로운 URL이 표시됩니다.

    네이버 연관검색어 검색

  4. 해당 URL을 선택한 뒤 [Response] 탭으로 이동하면 URL이 반환하는 JSON 데이터를 확인할 수 있습니다.

    Response 크롤링

  5. [Headers]로 이동한 뒤 Request URL 주소를 확인합니다. 해당 주소를 복사해 메모장에 붙여 넣습니다.

    Request URL 확인

  6. URL 주소에서 불필요한 쿼리를 제거하고 다음과 같이 정리합니다.
    https://ac.search.naver.com/nx/ac?q=키워드&st=100
  7. 해당 URL이 반환한 JSON 데이터에서 필요한 결과값만 추출할 수 있도록, Splitter 사용자 정의 함수를 활용해 연관검색어 결과만 리턴합니다.
    ' 변수 설정
    Dim URL As String
    Dim htmlResult As Object  '<- GetHTTP 명령문의 결과값 ... >> HTML 문서
    Dim strResult As String     '<-htmlResult 에서 받아온 HTML 문자열
    Dim strSearch As String   '<- 검색단어
    Dim v As Variant
    Dim i As Long
     
    strSearch = Sheet2.Range("C2").Value
    URL = "https://mac.search.naver.com/mobile/ac?q=" & strSearch & "&frm=nv&st=100"
     
    Set htmlResult = GetHttp(URL)
    strResult = htmlResult.body.innerHTML
     
    strResult = Splitter(strResult, "items"" : [ [", "] ] }")
  8. 리턴된 배열을 시트 위에 출력하여 명령문 작성을 마무리합니다.
    v = Split(strResult, ",")
     
    For i = LBound(v) To UBound(v)
        v(i) = Replace(Replace(v(i), "[""", ""), """]", "")
    Next
     
    ArrayToRng Sheet2.Range("A1"), v

네이버 부동산 매물 정보 크롤링

크롬 개발자 도구의 Network 요청과 각 페이지에서 반환되는 데이터를 적절히 분석하면 대부분의 웹 페이지 정보를 크롤링할 수 있습니다. 네이버 부동산 매물 정보 크롤링은 모든 내용을 텍스트로 정리하기에는 분량이 길어지는 관계로, 각 단계별 명령문을 간단히 요약하여 설명드립니다. 자세한 내용은 영상 강의를 참고해 주세요.

해당 명령문에는 사용자 지정 함수가 사용되었습니다.
따라서 모듈 안에 사용자 지정 함수를 반드시 추가해야만 명령문이 정상적으로 동작합니다.

네이버 부동산 크롤링에 사용된 전체 명령문
Sub NaverLandCrawl(city As String, isImage As Boolean)
 
'##########################################################
' 변수 설정
Dim htmlResult As Object
Dim strResult As String
Dim URL As String
 
'##########################################################
'1. 네이버 부동산 메인 페이지 -> 지역 검색
'                             -> 가용 매물 목록을 받아오기 위한 위/경도, 그 외 변수 추출
'[            https://meyerweb.com/eric/tools/dencoder/                ]  '-> URL 디코딩/인코딩
'[            http://json.parser.online.fr/                                             ]  '-> JSON 파서
 
URL = "https://m.land.naver.com/search/result/" & city
 
'--------------------------------------------
' 2021.01.29 수정
' 네이버 부동산 접속경로가 302 redirect 되면서 html 파싱 방법이 변경되었습니다.
' 따라서 redirect 된 URL에서 값을 받아 오도록 명령문을 수정하였는데요.
' 지난번 네이버 로그인 강의 이후에도 동일한 상황이 있었는데요. 이번에도 강의 업로드 이후 네이버에서 관련 정책을 바꾸는 관계로 2차 수정을 하였습니다.
' 크롤링이라는 것은 어느 인터넷 정보제공자라도 원치 않는 작업일 것입니다.
' 이번 2차 수정을 마지막으로 네이버 부동산 웹크롤링 코드는 수정을 종료하려고 합니다.
' 감사합니다.
 
'---------------------------------------
'Set htmlResult = GetHttp(URL)
'strResult = htmlResult.body.innerHTML
'strResult = Splitter(strResult, "filter: {", "},")
 
Dim vResult As Variant
Dim idx As Long
strResult = GetRedirectURL(URL)
strResult = Splitter(strResult, "/map/", "?")
strResult = Replace(strResult, "/*/", ":")
 
vResult = Split(strResult, ":")
 
'----------------------------------------
' 매물유형 예) 아파트: APT, 빌라 : VL, 오피스텔: OPST, ...적절히 수정
' 건물유형 A1, B1, ... 적절히 수정가능
'----------------------------------------
 
'---------------- 해당 지역(메인) 위/경도 + 그 외 변수 생성
Dim lat As String: lat = vResult(0)
Dim lon As String: lon = vResult(1)
Dim z As String: z = vResult(2)
Dim cortarNo As String: cortarNo = vResult(3)
Dim searchType As String: searchType = "APT"
Dim buildingType As String
For idx = 4 To UBound(vResult)
    buildingType = buildingType & vResult(idx) & ":"
Next
buildingType = Left(buildingType, Len(buildingType) - 1)
 
'------------------------------------------------------------------------------------------------
 
'#########################################################
' 2. 네이버 부동산 지도 페이지 -> 받아온 위/경도, 그 외 변수로 검색
'                                                -> 해당 지역 가용매물 목록의 상세 위/경도 추출
 
Debug.Print "2"
URL = "https://m.land.naver.com/cluster/clusterList?view=actl&cortarNo=" & cortarNo & "&rletTpCd=" & searchType & "&tradTpCd=" & buildingType & _
            "&z=" & z & "&lat=" & lat & "&lon=" & lon & "&addon=COMPLEX&bAddon=COMPLEX&isOnlyIsale=false"
 
Set htmlResult = Nothing
Set htmlResult = GetHttp(URL)
strResult = htmlResult.body.innerHTML
 
Dim forceCOMPLEX As Boolean
If InStr(1, strResult, "COMPLEX") > 0 Then strResult = Splitter(strResult, "COMPLEX"): forceCOMPLEX = True
Dim v As Variant
v = ParseJSON(strResult, "lgeo,lat,lon,count")
 
'##########################################################
' 3. 네이버 부동산 매물페이지  -> 상세 위 경도로 매물 정보 검색
'                                                -> 각 매물별 상세정보 추출
' 매물페이지는 페이지당 20개씩만 출력.. 그래서 추가 작업 필요!
' Set htmlResult = Nothing
' Set htmlResult = GetHttp(URL)
'                strResult = htmlResult.body.innerHTML
'                vReturn = ParseJSON(strResult, "hscpNm,hscpNo,scpTypeCd,hscpTypeNm,totDongCnt,totHsehCnt,genHsehCnt,useAprvYmd,repImgUrl,dealCnt,leaseCnt,rentCnt," & _
                                             "strmRentCnt,totalAtclCnt,minSpc,maxSpc,dealPrcMin,dealPrcMax,leasePrcMin,leasePrcMax,isalePrcMin,isalePrcMax,isaleNotifSeq,isaleScheLabel,isaleScheLabelPre", city, "<em class="txt_unit">,</em>")
 
Dim i As Long: Dim iPage As Long: Dim j As Long
Dim vReturn As Variant
Dim x As Long: x = GetLastRow(Sheet1) + 1
Dim initR As Long
initR = x
 
For i = LBound(v, 1) To UBound(v, 1)
    If v(i, 1) <> "" Then
        iPage = Application.WorksheetFunction.RoundUp(v(i, 4) / 20, 0)
        For j = 1 To iPage
        If forceCOMPLEX = False Then
            URL = "https://m.land.naver.com/cluster/ajax/articleList?itemId=" & v(i, 1) & "&lgeo=" & v(i, 1) & _
                            "&rletTpCd=" & searchType & "&tradTpCd=" & buildingType & "&z=" & z & "&lat=" & v(i, 2) & "&lon=" & v(i, 3) & "&cortarNo=" & cortarNo & _
                            "&isOnlyIsale=false&sort=readRank&page=" & j
            Debug.Print URL
            Set htmlResult = Nothing
            Set htmlResult = GetHttp(URL)
            strResult = htmlResult.body.innerHTML
            If InStr(1, strResult, "atclNo") > 0 Then
                vReturn = ParseJSON(strResult, "atclNm,atclNo,tradTpCd,rletTpNm,totDongCnt_tmp,totHsehCnt_tmp,genHsehCnt_tmp,atclCfmYmd,repImgUrl,tradTpNm,flrInfo,atclTetrDesc," & _
                                "strmRentCnt_tmp,totalAtclCnt_tmp,spc1,spc2,sameAddrMinPrc,sameAddrMaxPrc,minMviFee,maxMviFee,cpid,cpNm,rltrNm,isaleScheLabel_tmp,isaleScheLabelPre_tmp", city, "<em class="">,</em>")
                ArrayToRng Sheet1.Cells(x, 4), vReturn
                x = x + UBound(vReturn, 1)
            End If
        Else
            URL = "https://m.land.naver.com/cluster/ajax/complexList?itemId=" & v(i, 1) & "&lgeo=" & v(i, 1) & _
                    "&rletTpCd=" & searchType & "&tradTpCd=" & buildingType & "&z=" & z & "&lat=" & v(i, 2) & "&lon=" & v(i, 3) & "&cortarNo=" & cortarNo & "&isOnlyIsale=false&sort=readRank&page=" & j
            Set htmlResult = Nothing
            Set htmlResult = GetHttp(URL)
            strResult = htmlResult.body.innerHTML
            If InStr(1, strResult, "hscpNo") > 0 Then
                vReturn = ParseJSON(strResult, "hscpNm,hscpNo,scpTypeCd,hscpTypeNm,totDongCnt,totHsehCnt,genHsehCnt,useAprvYmd,repImgUrl,dealCnt,leaseCnt,rentCnt," & _
                                "strmRentCnt,totalAtclCnt,minSpc,maxSpc,dealPrcMin,dealPrcMax,leasePrcMin,leasePrcMax,isalePrcMin,isalePrcMax,isaleNotifSeq,isaleScheLabel,isaleScheLabelPre", city, "<em class="">,</em>")
                ArrayToRng Sheet1.Cells(x, 4), vReturn
                x = x + UBound(vReturn, 1)
            End If
        End If
        Next
    End If
Next
 
'#########################################################
' 4. 대표 이미지 삽입
If isImage = True Then
    Dim shpImg As Shape: Dim shpRng As Range
    For j = initR To Sheet1.Cells(Sheet1.Rows.Count, 4).End(xlUp).Row + 1
        Set shpRng = Sheet1.Cells(j, 13)
        If shpRng.Value <> "" Then
            shpRng.EntireRow.RowHeight = 80
            InsertWebImage shpRng, "https://landthumb-phinf.pstatic.net" & shpRng.Value
        Else
            shpRng.EntireRow.RowHeight = 18
        End If
    Next
End If
 
End Sub
네이버 부동산 정보 크롤링 단계별 살펴보기
  1. 네이버 부동산 매물 정보 크롤링에 사용할 기본 변수를 선언합니다.
    '##########################################################
    ' 변수 설정
    Dim htmlResult As Object
    Dim strResult As String
    Dim URL As String
  2. 네이버 부동산 메인 페이지에서 지역 정보를 검색해 반환되는 해당 지역의 고유값을 추출합니다.
    '##########################################################
    '1. 네이버 부동산 메인 페이지 -> 지역 검색
    '                             -> 가용 매물 목록을 받아오기 위한 위/경도, 그 외 변수 추출
    '[            https://meyerweb.com/eric/tools/dencoder/                ]  '-> URL 디코딩/인코딩
    '[            http://json.parser.online.fr/                                             ]  '-> JSON 파서
     
    URL = "https://m.land.naver.com/search/result/" & city
     
    Set htmlResult = GetHttp(URL)
    strResult = htmlResult.body.innerHTML
     
    strResult = Splitter(strResult, "filter: {", "},")
     
    '----------------------------------------
    ' 매물유형 예) 아파트: APT, 빌라 : VL, 오피스텔: OPST, ...적절히 수정
    ' 건물유형 A1, B1, ... 적절히 수정가능
    '----------------------------------------
     
    '---------------- 해당 지역(메인) 위/경도 + 그 외 변수 생성
    Dim lat As String: lat = Splitter(strResult, "lat: '", "',")
    Dim lon As String: lon = Splitter(strResult, "lon: '", "',")
    Dim z As String: z = Splitter(strResult, "z: '", "',")
    Dim cortarNo As String: cortarNo = Splitter(strResult, "cortarNo: '", "',")
    Dim searchType As String: searchType = "APT"
    Dim buildingType As String: buildingType = "A1:B1:B2"
    '------------------------------------------------------------------------------------------------
  3. 해당 지역의 고유값을 인수로 사용해 지역 내 가용 단지 정보를 받아옵니다.
    '#########################################################
    ' 2. 네이버 부동산 지도 페이지 -> 받아온 위/경도, 그 외 변수로 검색
    '                                                -> 해당 지역 가용매물 목록의 상세 위/경도 추출
     
    URL = "https://m.land.naver.com/cluster/clusterList?cortarNo=" & cortarNo & "&rletTpCd=" & searchType & "&tradTpCd=" & buildingType & _
                "&z=" & z & "&lat=" & lat & "&lon=" & lon & "&addon=COMPLEX&bAddon=COMPLEX&isOnlyIsale=false"
     
    Set htmlResult = Nothing
    Set htmlResult = GetHttp(URL)
    strResult = htmlResult.body.innerHTML
     
    Dim v As Variant
    v = ParseJSON(strResult, "lgeo,lat,lon,count")
  4. 각 단지 안의 가용 매물 정보를 추출합니다.
    '##########################################################
    ' 3. 네이버 부동산 매물페이지  -> 상세 위 경도로 매물 정보 검색
    '                                                -> 각 매물별 상세정보 추출
    ' 매물페이지는 페이지당 20개씩만 출력.. 그래서 추가 작업 필요!
    ' Set htmlResult = Nothing
    ' Set htmlResult = GetHttp(URL)
    '                strResult = htmlResult.body.innerHTML
    '                vReturn = ParseJSON(strResult, "hscpNm,hscpNo,scpTypeCd,hscpTypeNm,totDongCnt,totHsehCnt,genHsehCnt,useAprvYmd,repImgUrl,dealCnt,leaseCnt,rentCnt," & _
                                                 "strmRentCnt,totalAtclCnt,minSpc,maxSpc,dealPrcMin,dealPrcMax,leasePrcMin,leasePrcMax,isalePrcMin,isalePrcMax,isaleNotifSeq,isaleScheLabel,isaleScheLabelPre", city, "<em class="txt_unit">,</em>")
     
    Dim i As Long: Dim iPage As Long: Dim j As Long
    Dim vReturn As Variant
    Dim x As Long: x = GetLastRow(Sheet1) + 1
    Dim initR As Long
    initR = x
     
    For i = LBound(v, 1) To UBound(v, 1)
        iPage = Application.WorksheetFunction.RoundUp(v(i, 4) / 20, 0)
        For j = 1 To iPage
        URL = "https://m.land.naver.com/cluster/ajax/complexList?itemId=" & v(i, 1) & "&lgeo=" & v(i, 1) & _
                    "&rletTpCd=" & searchType & "&tradTpCd=" & bulidingtype & "&z=" & z & "&lat=" & v(i, 2) & "&lon=" & v(i, 3) & "&cortarNo=" & cortartno & _
                    "&isOnlyIsale=false&sort=readRank&page=" & j
        Set htmlResult = Nothing
        Set htmlResult = GetHttp(URL)
        strResult = htmlResult.body.innerHTML
        vReturn = ParseJSON(strResult, "hscpNm,hscpNo,scpTypeCd,hscpTypeNm,totDongCnt,totHsehCnt,genHsehCnt,useAprvYmd,repImgUrl,dealCnt,leaseCnt,rentCnt," & _
                            "strmRentCnt,totalAtclCnt,minSpc,maxSpc,dealPrcMin,dealPrcMax,leasePrcMin,leasePrcMax,isalePrcMin,isalePrcMax,isaleNotifSeq,isaleScheLabel,isaleScheLabelPre", city, "<em class="txt_unit">,</em>")
        ArrayToRng Sheet1.Cells(x, 4), vReturn
        x = x + UBound(vReturn, 1)
        Next
    Next
  5. 매물 정보의 이미지 주소를 활용해 각 단지별 대표 이미지를 시트 위에 삽입합니다.
    '#########################################################
    ' 4. 대표 이미지 삽입
    If isImage = True Then
        Dim shpImg As Shape: Dim shpRng As Range
        For j = initR To Sheet1.Cells(Sheet1.Rows.Count, 4).End(xlUp).Row + 1
            Set shpRng = Sheet1.Cells(j, 13)
            If shpRng.Value <> "" Then
                shpRng.EntireRow.RowHeight = 80
                InsertWebImage shpRng, "https://landthumb-phinf.pstatic.net" & shpRng.Value
            Else
                shpRng.EntireRow.RowHeight = 18
            End If
        Next
    End If
  6. 네이버 부동산 엑셀 웹 크롤링 명령문과 초기화 명령문을 작성한 뒤, 시트 위 동작 버튼을 추가하여 부동산 크롤링 프로그램 작성을 마무리합니다.
    Sub 네이버부동산크롤링()
     
    Application.ScreenUpdating = False
    Application.EnableEvents = False
     
        NaverLandCrawl Sheet1.Range("D5").Value, Sheet1.Range("E5").Value
     
    Application.ScreenUpdating = True
    Application.EnableEvents = True
     
    End Sub
     
    Sub 초기화()
     
    Dim Shp As Shape
     
    For Each Shp In Sheet1.Shapes
        If Left(Shp.Name, 3) <> "btn" Then Shp.Delete
    Next
     
    With Sheet1
        .Range(.Cells(9, 4), .Cells(GetLastRow(Sheet1), 29)).ClearContents
        .Range(.Cells(9, 4), .Cells(GetLastRow(Sheet1), 29)).RowHeight = 18
    End With
     
    End Sub
댓글 108
5 (58개 평가)
두산베어s
두산베어s 2020.11.16 03:50
쉽게 잘 설명해주신 것 같은데 제가 무지하다보니.. 부동산 다루는 것 부터는 따라하기가 많이 힘듭니다..ㅜㅜ
영상 계속 반복하면서 하나씩 따라하다보니 완성이 되긴 하였는데, 이걸 실전에 어떻게 응용해야 될지 감이 잘 오지를 않지만 좋은 내용 공유해주셔서 너무나 감사드립니다.
두산베어s
두산베어s 2020.11.16 14:46
저도 하다가 오타가 났는지 중간에 오류가 몇번 났는데 위에 코드 그대로 복붙해도 잘 동작하더라구요 ㅎㅎ
go****
go**** 2020.11.18 21:22
반복해서 내것으로 만들어야 겠네요...
문제해결을 접근하는 방식이 매우 맘에 듭니다..
일리안25
일리안25 2020.11.27 17:49
예제파일을 다운받아는데 매크로 실행이 안됩니다. 미리 설정해둬야 하는것들이 있나요?
오빠두엑셀
오빠두엑셀 작성자 2020.11.29 04:46
안녕하세요.
예제파일은 매크로가 포함되지 않은 연습용 파일입니다.
예제파일을 다운받은 뒤, 강의 순서에 따라 포스트에 적어드린 명령문을 복사/붙여넣기 하여 파일을 완성해주세요.
감사합니다.
내일은더행복
내일은더행복 2020.12.06 22:31
사용지지정함수도 함께 받으셨는지 확인해보셔야할거같아요~
선샤인
선샤인 2020.12.04 01:08
네이버 부동산 크롤링에 사용된 전체 명령문을 사용했는데요가격에 raw데이터 값이 같이 나오는데요

죄송하지만 네이버 부동산 크롤링에 사용된 전체 명령문을 다시 수정해주 실수 있나요?
극초보라 죄송합니다.
내일은더행복
내일은더행복 2020.12.06 22:31
이런 좋은 강의 들려주셔서 감사합니다
파이썬으로만 웹크롤링 하려 했는데 VBA로도 원하는 결과를 얻을수 있을거 같네요
알려주신 방법 잘 활용해서 실무에 활용해보겠ㅅ브니다 ^^
송인후
송인후 2020.12.22 22:55
안녕하세요.좋은 강의 감사합니다.
크롤링 강의를 완강을 하고 제가 원하는 데이터를 크롤링하려고 하는데
(예를들어 전국맛집정보, 전국 관광지 정보) 이런걸 크롤링으로 하려면 어떻게 해야하나요??
실제로 필요한 데이터 크롤링을 위한 수정이 어렵습니다.
도움좀 부탁드립니다
오빠두엑셀
오빠두엑셀 작성자 2020.12.24 13:21
이번 강의와 아래 강의도 같이 참고하면 도움이 되실 듯 합니다.
https://www.oppadu.com/%ec%97%91%ec%85%80-vba-%ec%9b%b9-%ed%81%ac%eb%a1%a4%eb%a7%81-%ea%b0%95%ec%9d%98-%eb%84%a4%ec%9d%b4%eb%b2%84-%eb%89%b4%ec%8a%a4-%ec%8a%a4%ed%81%ac%eb%9e%a9/
nice jeen
nice jeen 2020.12.23 09:34
코딩에 대하여는 잘 모르지만 하나하나 열심히 따라하고 반복해보겠습니다.^^
이재한
이재한 2021.01.05 16:52
강의보고 따라했는데
부동산가격 이렇게 나오는데 뭐가 문제일까요?ㅠ
3<EM class=txt_unit>억</EM> 9,000
오빠두엑셀
오빠두엑셀 작성자 2021.01.07 05:23
ParseJSON 의 마지막 인수로,
"<em class="txt_unit">,</em>"
를 추가해주세요.
명령문의 아래 부분을 확인해보시길 바랍니다.
    vReturn = ParseJSON(strResult, "hscpNm,hscpNo,scpTypeCd,hscpTypeNm,totDongCnt,totHsehCnt,genHsehCnt,useAprvYmd,repImgUrl,dealCnt,leaseCnt,rentCnt," & _
"strmRentCnt,totalAtclCnt,minSpc,maxSpc,dealPrcMin,dealPrcMax,leasePrcMin,leasePrcMax,isalePrcMin,isalePrcMax,isaleNotifSeq,isaleScheLabel,isaleScheLabelPre", city, "<em class="txt_unit">,</em>")
글래스
글래스 2021.01.11 13:20
sub 또는 Funtion 이 정의되지 않았다고 뜨는데 왜 그런걸가요?


Sub 연관검색어()
 
' 변수 설정
Dim URL As String
Dim htmlResult As Object '<- GetHTTP 명령문의 결과값 ... >> HTML 문서
Dim strResult As String   '<-htmlResult 에서 받아온 HTML 문자열
Dim strSearch As String  '<- 검색단어
Dim v As Variant
Dim i As Long
 
strSearch = Sheet2.Range("C2").Value
URL = "https://mac.search.naver.com/mobile/ac?q=" & strSearch & "&frm=nv&st=100"
 
Set htmlResult = GetHttp(URL)
strResult = htmlResult.body.innerHTML
 
strResult = Splitter(strResult, "items"" : [ [", "] ] }")
 
v = Split(strResult, ",")
 
For i = LBound(v) To UBound(v)
  v(i) = Replace(Replace(v(i), "[""", ""), """]", "")
Next
 
ArrayToRng Sheet2.Range("A1"), v

End Sub


그대로 복사해서 넣었습니다 ㅠ
시트 2 도 만들었구요
김유석
김유석 2021.01.20 14:40
https://www.oppadu.com/%ec%97%91%ec%85%80-%ed%81%ac%eb%a1%a4%eb%a7%81-%ed%95%a8%ec%88%98/
꿈아빠
꿈아빠 2021.01.21 01:08
Splitter가 안 되는 문제 때문에 실행이 되질 않습니다.

소스코드를 계속 바꿔서 테스트 해보니 Splitter 함수가 실행이 되는데,
아래와 같이 입력한 (이 페이지에 올리신 소스 복붙한 것임)것과 네이버에서 불러온 것이 다른지 잘라내기를 하지 않고 넘어가버리네요.
strResult = Splitter(strResult, "items"" : [ [", "] ] }")

3시간 째 잡고 있는데 해결이 안 됩니다.
도와주세요.

원래 네이버에서 불러온 코드에는 줄바꿈이 되어 있는데 그것 때문이 아닌가 추정만 하고 있습니다.
오빠두엑셀
오빠두엑셀 작성자 2021.01.26 16:45
안녕하세요.
홈페이지에서 제공해드리는 완성파일로도 테스트해보셨나요?^^ Splitter의 마지막 인수로 띄어쓰기가 누락되어서 그런 듯 합니다.
한번 완성파일과 비교해보세요.
꿈아빠
꿈아빠 2021.01.26 16:48
안녕하세요. 완성파일을 받아서 테스트 하였으나 똑같은 오류가 계속 발생해서 소스코드를 약간 수정해서 해결했습니다. 답변 주셔서 감사합니다.
스카이 승
스카이 승 2022.03.06 15:00
어떻게 수정해서 해결하셨는지 여쭤봐도 될까요 꿈아빠님??