티스토리 뷰

반응형

https://cocoabba.tistory.com/63#comment9750537

 

[PYTHON] 전국 모든 아파트/오피스텔 단지 목록 가져오기 (1/4)

그 간 여러번의 포스팅을 통해서 네이버 부동산에 대한 정보를 들여다 볼 수 있었다. https://cocoabba.tistory.com/56 [PYTHON] 네이버 부동산 상가 매물 크롤링하기(1/4) 앞선 포스팅에 이어 약 1년이 지난

cocoabba.tistory.com

 

이전 1/4 포스팅 이후 오랜만에 포스팅을 진행합니다.

목표 : 네이버 부동산에서 전국 모든 아파트/오피스텔 단지 정보 추출하기
   - 항목 : 아파트, 매매가, 전세가, 평형구조, 구조 별 세부 정보


1. 네이버 부동산 단지 정보 살펴보기  (개발자 도구 포함), 결과 양식 확인하기
2. 시/도, 시/군/구, 읍/면/동 정보를 순차적으로 가져오기 (핵심)
3. 선택 아파트 단지 세부 정보 추출하기
4. GUI 버전으로 레이아웃 구성하기

 

              i. /도 선택 시 python 코드화

python
 
# HTTP 요청 헤더 설정
headers = {
}
 
def get_sidolist():
    # /도 결정을 위한 URL 설정
    url = 'https://new.land.naver.com/api/regions/list?cortarNo=0000000000'
   
    # HTTP GET 요청 보내기
    # data={"sameAddressGroup":"false"}: GET 요청의 쿼리 : “동일매물 묶기”:체크해제 옵션
    r = requests.get(url, data={"sameAddressGroup": "false"}, headers=headers)
   
     # HTTP 응답 데이터의 인코딩 설정
    r.encoding = "utf-8-sig"
    # HTTP 응답 데이터를 JSON 형태로 파싱
    temp = json.loads(r.text)
   
    # 'regionList' 키를 가진 리스트에서 'cortarNo' 'cortarName' 추출
    nms = list(pd.DataFrame(temp["regionList"])["cortarNo"])  # 도시 코드 추출
    cities = list(pd.DataFrame(temp["regionList"])["cortarName"])  # 도시명 추출
   
    # 도시 코드와 도시명을 dictionary 타입으로 묶기
    temp_dicts = dict(zip(nms, cities))
     # 생성된 dictionary 반환
    return temp_dicts
 
# get_sidolist 함수 호출 및 결과 출력
print(get_sidolist())

 

이 코드는 다음과 같이 동작합니다:

 

 - requests, json, pandas 라이브러리를 import합니다.

 - HTTP 요청에 필요한 헤더 정보를 headers 변수에 설정합니다.

 - get_sidolist 함수를 정의합니다.

   > /도 결정을 위한 URL 설정 합니다.

   >  HTTP GET 요청을 보내고 응답을 받습니다.

   >  받은 응답 데이터를 JSON 형태로 파싱합니다.

   >  파싱된 JSON 데이터에서 regionList cortarNocortarName을 추출합니다.

   >  추출된 데이터를 dictionary 타입으로 묶고 반환합니다.

 - get_sidolist 함수를 호출하여 결과를 출력합니다.

 

이렇게 /의 목록을 가져오는 코드와 각 라인별로 의미를 살펴보았습니다. 앞서 보았듯 동일한 방법으로 //”, “//의 정보도 가져올 수 있습니다.

 동일한 코드를 제외하고, 추가되는 부분만 코드를 표현해보겠습니다.

python
[동일 코드]
import requests  # 라이브러리 추가영역

headers = { … } # HTTP 요청 헤더 설정
data = { … } # HTTP 요청 쿼리 데이터 설정

def get_sidolist(): {  ..  }# /도 결정을 위한 URL 설정
 
#//, //동 추출 함수 정의
def get_sigungulist (param):
    url = 'https://new.land.naver.com/api/regions/list?cortarNo={}'.format(param)
    r = requests.get(url,data=data,headers=headers)
    r.encoding = "utf-8-sig"
    temp=json.loads(r.text)
 
    #//, //동 추출
    nms_dep2=list(pd.DataFrame(temp["regionList"])["cortarNo"])
    #도시명 추출
    cities_dep2 = list(pd.DataFrame(temp["regionList"])["cortarName"])
 
return nms_dep2, cities_dep2

 

실제 이 과정까지 동일하게 따라와보면 알겠지만, 사실 개발자 도구에서도 보았듯이 //값을 요청하는 URL //값을 요청하는 URL은 서로 같은 요청을 하고 있습니다.

다만, 달라지는 부분은 cortarNo=” 영역에서 /에 해당하는 코드를 전달할 경우는 결과로 //목록에 대한 응답을 받게되며, “//에 해당하는 코드를 전달하는 경우는 결과로 //목록에 대한 응답을 받게 됩니다.

출력값 검증을 위한 테스트 코드
# 출력값 검증을 위한 테스트 코드
nms, cities = get_sidolist ()
print("/도 코드 ={}, / = {}".format(nms[1], cities[1]))
 
print("\n##경기도 조회 : {}".format(nms[1]))  
 
# get_sigungulist() 함수 호출을 통한 시//구 코드 요청 : “경기도
nms_dep2, cities_dep2 = get_sigungulist(nms[1])
for idx, param in enumerate(nms_dep2):
    print("{} : //구 코드 ={}, //구 명 = {}".format(idx, nms_dep2[idx], cities_dep2[idx]))
 
print("\n##부천시 소사구 조회 : {}".format(nms_dep2[12]))
 
# get_sigungulist() 함수 호출을 통한 읍//동 코드 요청 : “부천시 소사구
nms_dep3, cities_dep3 = get_sigungulist(nms_dep2[12])
for idx, param in enumerate(nms_dep3):
    print("{} : //동 코드 ={}, //동 명 = {}".format(idx, nms_dep3[idx], cities_dep3[idx]))

 

이 코드는 특정 지역의 코드와 이름을 확인하고 출력하는 것입니다. 코드는 세 단계로 나뉘어 있으며, 각 단계는 특정 행정 구역에 대한 정보를 요청하고 출력합니다. 아래는 각 단계의 동작을 설명합니다.

 

 - /도 정보 조회:

   >  get_sidolist() 함수를 호출하여 시/도 코드와 이름을 가져옵니다.

   >  nms는 시/도 코드 리스트이고, cities는 시/도 이름 리스트입니다.

   >  두 번째 시/도 코드를 출력합니다 (nms[1]). (=”경기도”)

   >  nms[1] cities[1] 값을 출력합니다.

 

 - 경기도의 시//구 정보 조회:

   >  get_sigungulist(nms[1]) 함수를 호출하여 경기도의 시//구 코드와 이름을 가져옵니다.

   >  nms_dep2는 시//구 코드 리스트이고, cities_dep2는 시//구 이름 리스트입니다.

   >  각 시//구의 코드와 이름을 출력합니다.

 

 - 부천시 소사구의 읍//동 정보 조회:

   >  get_sigungulist(nms_dep2[12]) 함수를 호출하여 부천시 소사구의 읍//동 코드와 이름을 가져옵니다. (=“부천시 소사구”)

   >  nms_dep3는 읍//동 코드 리스트이고, cities_dep3는 읍//동 이름 리스트입니다.

   >  각 읍//동의 코드와 이름을 출력합니다.

 

요약하면, 이 코드는 시/, //, //동의 코드와 이름을 단계적으로 조회하고 출력하는 테스트 코드입니다. get_sidolist() 함수는 시/도 정보를, get_sigungulist() 함수는 주어진 코드에 해당하는 시//구나 읍//동 정보를 반환합니다.

 

             ii. 출력한 특정 동 내의 단지 목록 추출

 

우리는 위 단계에서 옥길동의 동 코드까지 확인할 수 있었습니다. 해당 동 선택하여 단지 목록 추출을 해보겠습니다.

python
[동일 코드]
import requests  # 라이브러리 추가영역

headers = { … } # HTTP 요청 헤더 설정
data = { … } # HTTP 요청 쿼리 데이터 설정
def get_sidolist(): {  ..  }# /도 결정을 위한 URL 설정
#/, //, //동 추출 함수 정의
def get_sidolist ():    ….
def get_sigungulist (param):    ….
 
#단지 목록 추출 함수 정의
def get_danjilist (dong_code):
    down_url = 'https://new.land.naver.com/api/regions/complexes?cortarNo={} &realEstateType=APT&order='.format(dong_code)
    r = requests.get(down_url,data={"sameAddressGroup":"false"},headers=headers)
    r.encoding = "utf-8-sig"
    temp=json.loads(r.text)
 
    if len(pd.DataFrame(temp["complexList"])) < 1:
        print ("목록없음")
        return 0
    else:
        #//구 추출
        complexNos_in=list(pd.DataFrame(temp["complexList"])["complexNo"])
        #도시명 추출
        complexNMs_in = list(pd.DataFrame(temp["complexList"])["complexName"])
        return complexNos_in, complexNMs_in

 

아래의 URL 요청 시, 응답값은 JSON 타입으로 반환이 되며, 응답 내 ["complexList"] 속성 정보 유무를 통해 단지 목록이 존재하는지를 체크합니다. 해당 속성의 정보가 있다면, 단지코드(=complexNo)와 단지명(=complexName)을 추출할 수 있습니다.

 

URL : new.land.naver.com/api/regions/complexes?cortarNo={dong_code}&realEstateType=APT%3AOPST&order=

아래 결과 추출을 위한 코드 및 결과 값을 보실 수 있습니다.

출력값 검증을 위한 테스트 코드
nms, cities = get_sidolist ()
nms_dep2, cities_dep2 = get_sigungulist(nms[1])
nms_dep3, cities_dep3 = get_sigungulist(nms_dep2[12])
complexNos_in, complexNMs_in = get_danjilist(nms_dep3[6])
 
#단지 목록 출력
for idx, param in enumerate(complexNos_in):
    print("{} : 단지 코드 ={}, 단지명 = {}".format(idx, complexNos_in[idx], complexNMs_in[idx]))

 

이 코드는 특정 동(=옥길동) 내 위치하는 아파트 단지 코드와 단지 이름을 확인하고 출력하는 코드 입니다.

 

 - 옥길동의 단지 정보 조회: 

   >  get_danjilist(nms_dep3[6]) 함수를 호출하여 옥길동의 단지 코드와 이름을 가져옵니다.

   >  complexNos_in는 단지 코드 리스트이고, complexNMs_in는 단지 이름 리스트입니다.

   >  각 단지의 코드와 이름을 출력합니다.

  

지금까지의 단계를 요약하면, 브라우저 내 요청이 어떤 데이터를 응답하고, 어떻게 데이터에 접근하는지를 개발자 도구를 통해 확인했습니다. 데이터에 접근하기 위해 시/, //, //, 단지 선택의 과정을 거쳤습니다. 앞에서 살펴본 전체 과정을 파이썬 코드로 구현하는 방법도 확인했습니다.

 

이어지는 다음 포스팅에서는 아파트 단지를 선택했을 때, 해당 단지의 세부 정보를 어떻게 추출하는지 파이썬 코드로 살펴보겠습니다.

 

https://cocoabba.tistory.com/67

 

[PYTHON] 전국 모든 아파트/오피스텔 단지 목록 가져오기 (3/4)

https://cocoabba.tistory.com/66 [PYTHON] 전국 모든 아파트/오피스텔 단지 목록 가져오기 (2/4)https://cocoabba.tistory.com/63#comment9750537 [PYTHON] 전국 모든 아파트/오피스텔 단지 목록 가져오기 (1/4)그 간 여러번

cocoabba.tistory.com

 


본 과정을 전자책으로 발행하였습니다.

전자책에서는 개발 전체 과정을 디테일하게 다루고 있으며, 특히 Full-소스코드를 포함하고 있습니다.

 

관심있으신 분들은 아래 링크 확인해주시면 감사드리겠습니다.

https://kmong.com/self-marketing/582782/YUlipmOiWe

 

부동산 주거용 매물 추출 프로그램 작성소스코드 제공 - 크몽

꿈꾸는보안인 전문가의 전자책 서비스를 만나보세요. <p>1. 독자 : 부동산에 관심있는 모든 사람들(부동산중개사 포함)</p...

kmong.com

 

반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/03   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
글 보관함