엑셀 웹 크롤링, 완벽정리! | 네이버 부동산 & 연관검색어 크롤링

HTTP 요청을 활용한 웹 크롤링의 기초부터 네이버 부동산 정보를 크롤링하는 실전예제까지 단계별로 알아봅니다.

# VBA

작성자 :
오빠두엑셀
최종 수정일 : 2022. 11. 02. 03:55
URL 복사
메모 남기기 : (108)

엑셀 웹 크롤링, 이것만 알면 다 된다!! | 네이버 실전 크롤링

엑셀 웹 크롤링 목차 바로가기
영상 강의

큰 화면으로 보기
패치노트
  • 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

    네이버 부동산 리다이렉트 변경
    네이버 부동산 접속 경로가 302 redirect 되도록 정책이 변경되었습니다.

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


예제파일 다운로드

오빠두엑셀의 강의 예제파일은 여러분을 위해 자유롭게 제공하고 있습니다.

  • [VBA프로젝트] 엑셀 네이버 부동산 & 연관검색어 크롤링
    예제파일
  • [VBA프로젝트] 엑셀 네이버 부동산 & 연관검색어 크롤링
    완성파일

.

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

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


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

웹 크롤링(Crawl) 또는 스크레이핑(Scrape) 이란 특정 웹페이지의 데이터를 추출해내는 행위을 이야기 합니다. 우리가 일반적으로 행하는 '데이터를 추출해내는 행위'는 스크레이핑이라고 하는 것이 보다 올바른 단어 선택입니다. (*이번 강의에서는 편의를 위해 '크롤링'으로 통칭하여 사용하겠습니다.)

웹 크롤링의 절차를 세부적으로 본다면 여러 단계로 나눌 수 있겠지만, 웹 크롤링은 크게 2가지 절차로 이루어집니다.

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

여기서 웹 크롤링으로 받아오는 데이터는 일반적으로 HTML문서(<div>, <a>.. 등이 사용된 웹페이지 문서) 또는 JSON 형태의 데이터로 반환되는데요. 서버에서 데이터를 받아오는 과정은 크롤링 방식에 상관없이 모두 동일하게 진행됩니다.

서버 요청 동일
서버에서 데이터를 받아오는 방식은 모두 동일합니다.

다만, 사용자가 서버에 요청을 보내는 과정에 있어서 여러 방식으로 나뉘는데, VBA 뿐만아니라 다른 프로그래밍에서도 마찬가지로 서버에 URL 요청을 보내는 방식에는 딱 2가지 방식이 사용됩니다.

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

엑셀은 기본적으로 인터넷 익스플로러 브라우저를 컨트롤 할 수 있는 'Microsoft Internet Controls' 라이브러리를 제공하였으나 2020년 11월 말 이후 부터는 중요 기능의 업데이트 중단, 그리고 내년부터는 모든 기능 업데이트가 중단될 예정이어서 실제 업무에서는 사용이 불가능하게 되었습니다.

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

웹 크롤링 방식

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

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

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

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

웹 크롤링을 하게 되면 URL 주소 만으로 데이터를 가져 올 수 없는 상황이 종종 발생합니다. 특히 많은 종류의 DB를 하나의 페이지 안에서 다루는 대부분의 경우가 이런 상황에 속하는데요. 간단하게 아래 예제를 살펴보겠습니다.

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

    네이버 크롤링 접속
    네이버 홈페이지에 접속합니다.
  2. 검색할 단어를 입력한 뒤 [검색]버튼을 클릭하면 검색결과 페이지로 이동하며, 상단의 URL 주소도 동시에 변경됩니다.

    네이버 크롤링 쿼리 분석
    검색 결과 페이지로 이동하면서 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. 검색할 단어의 일부 글자만 입력합니다.

    연관검색어 검색
    검색 단어 일부를 입력하면 URL 주소는 그대로 유지되며 페이지 정보만 변경됩니다.
  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 문서 라이브러리를 사용할 경우 GetElementbyxx 함수를 통해 손쉽게 추출 가능 별도의 함수 또는 파싱 프로그램 필요
(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. 개발자 도구의 네트워크 탭으로 이동합니다.

    네트워크 도구 이동
    개발자도구의 네트워크 탭으로 이동합니다.
  3. 검색창에 원하는 단어를 입력하면 개발도구에 새로운 URL이 출력됩니다.

    네이버 연관검색어 검색
    검색어를 입력하면 새로운 URL이 출력됩니다.
  4. 해당 URL을 선택한 뒤, Response 탭으로 이동하면 URL에서 반환되는 JSON 데이터를 확인할 수 있습니다.

    Response 크롤링
    URL의 Response로 이동하여 반환되는 결과값을 확인합니다.
  5. Headers로 이동한 뒤, RequestURL 주소를 확인합니다. 해당 주소를 복사한 뒤 메모장에 붙여넣기 합니다.

    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
5 52 투표
게시글평점
108 댓글
Inline Feedbacks
모든 댓글 보기
108
0
여러분의 생각을 댓글로 남겨주세요.x