[PYTHON] 전국 모든 아파트/오피스텔 단지 목록 가져오기 (2/4)
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의 cortarNo와 cortarName을 추출합니다.
> 추출된 데이터를 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