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

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

홈페이지 » 엑셀 웹 크롤링, 이것만 알면 다 됩니다! | 네이버 부동산

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

엑셀 웹 크롤링 목차 바로가기
영상 강의
큰 화면으로 보기
패치노트
  • 2020.11.17
    단지정보가 조회되지 않는 일부지역 검색 시에는 단지정보 대신 지역 내 가용매물 정보를 바로 조회할 수 있도록 명령문을 수정하였습니다.
    (관련 게시물 : https://www.oppadu.com/question/?uid=8068&mod=document)
  • 2021.01.29
    네이버 부동산 리다이렉트 변경
    네이버 부동산 접속 경로가 302 redirect 되도록 정책이 변경되었습니다.

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


예제파일 다운로드

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

  • [VBA프로젝트] 엑셀 네이버 부동산 & 연관검색어 크롤링
    예제파일
  • [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 26 투표
게시글평점
guest
56 댓글
Inline Feedbacks
모든 댓글 보기
두산베어s
두산베어s
2020년 11월 16일 3:50 오전
게시글평점 :
     

쉽게 잘 설명해주신 것 같은데 제가 무지하다보니.. 부동산 다루는 것 부터는 따라하기가 많이 힘듭니다..ㅜㅜ 영상 계속 반복하면서 하나씩 따라하다보니 완성이 되긴 하였는데, 이걸 실전에 어떻게 응용해야 될지 감이 잘 오지를… 더보기 »

두산베어s
두산베어s
2020년 11월 16일 2:46 오후
답글 남기기  두산베어s

저도 하다가 오타가 났는지 중간에 오류가 몇번 났는데 위에 코드 그대로 복붙해도 잘 동작하더라구요 ㅎㅎ

go****
go****
2020년 11월 18일 9:22 오후
게시글평점 :
     

반복해서 내것으로 만들어야 겠네요...
문제해결을 접근하는 방식이 매우 맘에 듭니다..

일리안25
일리안25
2020년 11월 27일 5:49 오후
게시글평점 :
     

예제파일을 다운받아는데 매크로 실행이 안됩니다. 미리 설정해둬야 하는것들이 있나요?

내일은더행복
내일은더행복
2020년 12월 6일 10:31 오후
답글 남기기  일리안25

사용지지정함수도 함께 받으셨는지 확인해보셔야할거같아요~

선샤인
선샤인
2020년 12월 4일 1:08 오전
게시글평점 :
     

네이버 부동산 크롤링에 사용된 전체 명령문을 사용했는데요가격에 raw데이터 값이 같이 나오는데요

죄송하지만 네이버 부동산 크롤링에 사용된 전체 명령문을 다시 수정해주 실수 있나요?
극초보라 죄송합니다.

내일은더행복
내일은더행복
2020년 12월 6일 10:31 오후
게시글평점 :
     

이런 좋은 강의 들려주셔서 감사합니다
파이썬으로만 웹크롤링 하려 했는데 VBA로도 원하는 결과를 얻을수 있을거 같네요
알려주신 방법 잘 활용해서 실무에 활용해보겠ㅅ브니다 ^^

송인후
송인후
2020년 12월 22일 10:55 오후
게시글평점 :
     

안녕하세요.좋은 강의 감사합니다. 크롤링 강의를 완강을 하고 제가 원하는 데이터를 크롤링하려고 하는데 (예를들어 전국맛집정보, 전국 관광지 정보) 이런걸 크롤링으로 하려면 어떻게 해야하나요?? 실제로 필요한 데이터 크롤링을 위한 수정이 어렵습니다. 도움좀… 더보기 »

nice jeen
nice jeen
2020년 12월 23일 9:34 오전
게시글평점 :
     

코딩에 대하여는 잘 모르지만 하나하나 열심히 따라하고 반복해보겠습니다.^^

이재한
이재한
2021년 1월 5일 4:52 오후
게시글평점 :
     

강의보고 따라했는데
부동산가격 이렇게 나오는데 뭐가 문제일까요?ㅠ
3<EM class=txt_unit>억</EM> 9,000

글래스
글래스
2021년 1월 11일 1:20 오후
게시글평점 :
     

sub 또는 Funtion 이 정의되지 않았다고 뜨는데 왜 그런걸가요? Sub 연관검색어()   ' 변수 설정 Dim URL As String Dim htmlResult As Object '<- GetHTTP 명령문의 결과값 ... >> HTML 문서… 더보기 »

Last edited 10 월 전 by 글래스
김유석
김유석
2021년 1월 20일 2:40 오후
답글 남기기  글래스
꿈아빠
꿈아빠
2021년 1월 21일 1:08 오전
게시글평점 :
     

Splitter가 안 되는 문제 때문에 실행이 되질 않습니다. 소스코드를 계속 바꿔서 테스트 해보니 Splitter 함수가 실행이 되는데, 아래와 같이 입력한 (이 페이지에 올리신 소스 복붙한 것임)것과 네이버에서 불러온 것이 다른지… 더보기 »

꿈아빠
꿈아빠
2021년 1월 26일 4:48 오후
답글 남기기  오빠두엑셀

안녕하세요. 완성파일을 받아서 테스트 하였으나 똑같은 오류가 계속 발생해서 소스코드를 약간 수정해서 해결했습니다. 답변 주셔서 감사합니다.

서월
서월
2021년 1월 31일 1:06 오전
게시글평점 :
     

감사합니다

빵구ss
빵구ss
2021년 2월 8일 1:47 오후
게시글평점 :
     

제가 원하는 Site에서 따라해보고 있는데, 그 Site는 data가 Table 형태로 되어 있습니다. strResult = htmlResult.body.innerHTML 이렇게 추출한 것을 메모장으로 Export 해봤는데 HTML상의 Table Class 까지만 추출이 되고, 그 안의 thead… 더보기 »

khyun****
khyun****
2021년 3월 10일 7:51 오후
게시글평점 :
     

"Http 리디렉션 요청에 실패했습니다" 라고 뜨고
코드 여기에서 멈췄는데요 ㅜㅜ
도움좀 부탁드려요,
objHTTP.send

kz
kz
2021년 3월 24일 5:51 오후
게시글평점 :
     

vba를 직접 짜서 해보려는데, 막히는 부분이 있어서 질문 남깁니다. splitter 함수를 사용할때 (sub 한개에서 splitter 함수를 2번 사용했는데 첫번째 사용한곳에서는 정상적으로 작동되었는데, 두번째 쓴곳에서 오류가 뜹니다) '9' 런타임 오류가 발생하였습니다:… 더보기 »

kz
kz
2021년 3월 27일 10:44 오전
게시글평점 :
     

"cortarNo":"1141011100","cortarName":"홍제동","cityName":"서울시","divisionName":"서대문구","sectorName":"홍제동","cityNo":"1100000000","divisionNo":"1141000000","sectorNo":"1141011100","cortarType":"sec","centerLat":37.5872,"centerLon":126.9468,"cortarZoom":16}

에서

"cortarNo":" 뒷 부분 숫자인 1141011100 숫자만 추출하려면 어떻게 해야할까요

kz
kz
2021년 4월 4일 11:36 오후
게시글평점 :
     

For idx = 4 To UBound(vResult)
  buildingType = buildingType & vResult(idx) & ":"
Next
buildingType = Left(buildingType, Len(buildingType) - 1)

------------------------------------------------------------------------------
위 문구가 어떤 기능을 수행하는지 궁금합니다.

민물장어
민물장어
2021년 4월 6일 8:02 오전
게시글평점 :
     

대단하십니다..혹시 아파트 말고 건물은 안되나요?너무 어려워요 ㅠㅠ
죄송하지만 완성파일좀 부탁드립니다
infobd@naver.com 간곡히 요청드립니다

Last edited 7 월 전 by 민물장어
민물장어
민물장어
2021년 4월 6일 1:36 오후
게시글평점 :
     

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… 더보기 »

민물장어
민물장어
2021년 4월 8일 7:10 오전
답글 남기기  오빠두엑셀

아파트는 APT 건물 GM입니다
 SearchType = "GM"으로 바꿨는데
디버그 objHTTP.send 뜹니다..
 SearchType만 바꾸면 나오는게 아닌가요?
혹시 다른것도 만져야 되나요?
감사합니다

와일로
와일로
2021년 4월 13일 3:42 오후
게시글평점 :
     

항상 좋은 정보 잘 보고있습니다:)
Selenium으로 크롤링을 하다가 너무 막히네요 ㅠ 관련 영상은 언제쯤 업로드 예정이실까요?

부동산전문가
부동산전문가
2021년 4월 18일 7:33 오후
게시글평점 :
     

강의 잘 들으면서 열심히 따라하고는 있습니다! 다만 진도가 잘 안나가네요! 너무 늦게 시작한것 같습니다! 네이버에서 크롤링에서 apt는 가져 오는데 다른 매물, 즉, 상업요,업무요,토지는 크롤링이 아죕니다! Dim lat As String: lat… 더보기 »

Last edited 7 월 전 by 부동산전문가
ownb****
ownb****
2021년 4월 23일 11:47 오후
게시글평점 :
     

우리 오빠 최고!

JJssTV
JJssTV
2021년 5월 9일 5:48 오전
게시글평점 :
     

안녕하세요 오빠두님 영상 너무나 잘보았으나 한가지 질문이 있습니다 .
"평수별"로 "매매가"와 "전세가"를 보고싶은데 어떻게 해야하나요?

로즈골드
로즈골드
2021년 6월 3일 7:19 오전
게시글평점 :
     

안녕하세요 🙂 유튜브 잘 보고 있어요. 혹시 연관검색어 말고, 엑셀에서 검색어를 입력하면 검색량과 네이버쇼핑 상품수를 자동으로 나오게 하는 방법을 알고 싶으면 어떤 강의를 수강해야 할까요? 매번 셀러마스터 사이트 들어가서 칠려고… 더보기 »

만시니
만시니
2021년 6월 6일 4:01 오후
게시글평점 :
     

다운로드 예제파일 중 "완성파일" 다운 받아 동영상 보며 실행하는데... Sheet2의 "Sub 연간검색어()"에서 F5 실행하면 "Function Splitter"의 vaArr = Split(v, Cutter)(1)에서 ['9' 런타임 오류 발생 아래첨자 사용이 잘못되었습니다.] 메세지가 뜹니다. 뭣이… 더보기 »

먼지친구
먼지친구
2021년 9월 9일 4:39 오후
답글 남기기  오빠두엑셀

"items"" : ["만 쓰면 오류가 없는데,
"items"" : [ [" 까지 쓰면 오류가 발생하네요.ㅡㅡa

니코해키
니코해키
2021년 9월 10일 2:02 오후
답글 남기기  먼지친구

"items"" : ["만 쓰면 오류가 없는데,
"items"" : [ [" 까지 쓰면 오류가 발생하네요.
저도 동일한 문제입니다.
어떻게 해결해야할지 구글링해도 답이 없네요..;;;

stree****
stree****
2021년 6월 27일 7:46 오후
게시글평점 :
     

쿠팡 같은 쇼핑몰의 가격을 크롤링 하고자 하는데
"You don't have permission to access"
라는 오류 메시지가 뜰때는 어떻게 해야 할까요..??

EDKim
EDKim
2021년 6월 30일 5:13 오후
게시글평점 :
     

로그인 상태에서는 댓글 등록이 안되나봐요 완성파일 시트2가 작동을 안하네요 ''; vaArr = Split(v, Cutter)(1) 노란줄 쳐지는데 흠.... 모르겠어요 그리고 응용해서 네이버 쇼핑쪽에서 연관 검색어 가능한지 해봤는데 이 역시 안되네요 ㅠㅠ… 더보기 »

Last edited 4 월 전 by 공부해요
peer****
peer****
2021년 7월 27일 2:01 오후
게시글평점 :
     

예제파일 다운로드가 안되느데.. 확인 가능할까요.?

고병관
고병관
2021년 8월 2일 10:34 오후
게시글평점 :
     

안녕하세요 너무 좋은강의 감사합니다.
혹시 웹크롤링이 인트라넷에도 동일하게 적용이 될까요???
크롬 브라우저를 사용하고 있긴 하다만.. 사내 인트라넷에도 적용이 될수 있다면 정말 폭발적인 데이터를 만들 수 있을것 같아서 여쭈어 봅니다.

김주아
김주아
2021년 8월 11일 11:43 오전
게시글평점 :
     

감사합니다

열공
열공
2021년 10월 6일 1:13 오후
게시글평점 :
     

NaverLand 모듈의 searchType = "APT"를 searchType ="JWJT:DDDGG:HOJT"로 바꿔도 아파트만 나오네요??? 이유가 뭘까요?(전원주택, 단독/다가구, 한옥주택)

kslime
kslime
2021년 11월 17일 9:15 오전
게시글평점 :
     

엑셀과 관련한 소중한 지식을 공유해 주심에 늘 감사드립니다. 웹크롤링 강의를 듣고 예제를 활용하여 코딩을 해보았으나, 웹크롤링한 텍스트의 한글이 깨지는 현상이 발생합니다. 한글 인코딩문제인 것 같아, 며칠동안 해결방법을 찾아보았으나 해결하지 못하고… 더보기 »

Last edited 11 일 전 by kslime
kslime
kslime
2021년 11월 23일 6:38 오후
답글 남기기  오빠두엑셀

답변 감사드립니다.
다만, 말씀하신대로 수정해 보았으나, "ParamArray의 인수에는 이름을 붙일 수 없다"는 에러 메세지가 나오네요... ㅠ.ㅠ
일단 알려주신 팁을 근거로 해결해 보도록 노력해 보겠습니다~.

MOM
MOM
2021년 11월 23일 4:03 오전
게시글평점 :
     

설명은 쉽지만 따라 할수가 없네요. 완성 폼을 구매 제작 요청 가능한가요?

56
0
여러분의 생각을 댓글로 남겨주세요.x