티스토리 뷰
https://cocoabba.tistory.com/66
이전 2/4 포스팅 이후 포스팅을 진행합니다.
목표 : 네이버 부동산에서 전국 모든 아파트/오피스텔 단지 정보 추출하기
- 항목 : 아파트, 매매가, 전세가, 평형구조, 구조 별 세부 정보
1. 네이버 부동산 단지 정보 살펴보기 (개발자 도구 포함), 결과 양식 확인하기
2. 시/도, 시/군/구, 읍/면/동 정보를 순차적으로 가져오기 (핵심)
3. 선택 아파트 단지 세부 정보 추출하기
4. GUI 버전으로 레이아웃 구성하기
먼저 단지의 기본 정보를 추출하는 코드를 확인합니다.
앞에서 언급했듯이 아파트 단지 선택 시 왼쪽 상단에 보이는 이 정보를 추출하기 위한 코드입니다.
아파트 단지 간략정보
python |
def get_simpleInform_danji(simple_Information): complexTypeName = str(simple_Information["complexTypeName"]) #구분(APT/OP) complexName = str(simple_Information["complexName"]) #단지이름 totalHouseHoldCount = str(simple_Information["totalHouseHoldCount"]) #세대수 totalDongCount = str(simple_Information["totalDongCount"]) #동 수 useApproveYmd = str(simple_Information["useApproveYmd"]) #사용승인일 AreaRange=str(simple_Information["minArea"])+"~"+str(simple_Information[“maxArea"]) #면적 #매매가 PriceRange=str(simple_Information[“minPrice"]) +"~"+ str(simple_Information[“maxPrice"]) #전세가 LeasePriceRange=str(simple_Information[“minLeasePrice"])+"~"+str(simple_Information [“maxLeasePrice"]) ret_val = {"구분(APT/OP)":complexTypeName, "단지이름":complexName, "세대수":totalHouseHoldCount, "동 수":totalDongCount, "사용승인일":useApproveYmd, "면적 범위":AreaRange, "매매가":PriceRange, "전세가":LeasePriceRange} return ret_val danji_name = complexNMs_in[0] complex = complexNos_in[0] #단지 간략정보 print("[결과 추출] {} - {}({})".format(cities_dep3[6], danji_name, complex)) down_url_simple='https://new.land.naver.com/api/complexes/overview/{} ?complexNo={}'.format(complex, complex) r_simple = requests.get(down_url_simple,headers=headers) r_simple.encoding = "utf-8-sig" simple_Information_json=json.loads(r_simple.text) simple_info = get_simpleInform_danji(simple_Information_json) print("[simple_info]", simple_info) |
이 코드는 특정 단지의 간략 정보를 추출하고 출력하는 함수와 그 함수를 호출하는 예제입니다.
다음은 코드의 동작을 단계별로 설명한 것입니다.
- 단지 간략 정보 추출 함수 정의:
> get_simpleInform_danji 함수는 단지 정보를 입력 받아, 여러 가지 속성을 추출하여 반환.
> 각 속성은 입력된 simple_Information 딕셔너리에서 값을 추출하여 문자열로 변환한 후, ret_val 딕셔너리에 저장.
> ret_val 딕셔너리는 단지의 구분, 이름, 세대수, 동 수, 사용승인일, 면적 범위, 매매가, 전세가 등의 정보를 포함.
- 단지 정보 조회 및 출력:
> 첫 번째 단지의 이름과 코드를 가져옵니다. (=”부천옥길자이”)
> 단지 정보를 조회하기 위해 네이버 부동산 API를 호출.
> API 응답을 JSON 형식으로 변환하여 저장.
- get_simpleInform_danji함수를 호출하여 단지 정보 추출.
- 추출된 단지 간략 정보 출력.
실제 코드 수행 결과값은 아래와 같이 출력됩니다.
결과값 |
[결과 추출] 옥길동 - 부천옥길자이(110647) [simple_info] {'구분(APT/OP)': '아파트', '단지이름': '부천옥길자이', '세대수': '566', '동 수': '5', '사용승인일': '20180126', '면적 범위': '110.08~163.58', '매매가': '74000~160000', '전세가': '0~0'} |
이를 통해 브라우저 내 화면에 있는 정보를 그대로 추출할 수 있는 것을 확인할 수 있습니다.
이어서는 단지 선택 시 상세하게 나오는 정보를 추출해보도록 하겠습니다.
아파트 단지 상세 정보
python |
def get_basicInform_danji(info): # 층 주차대수 parkingPossibleCount=str(info["parkingPossibleCount"])+"대(세대당 "+str(info["parkingountByHousehold"])+")" ... managementOfficeTelNo = str(info["managementOfficeTelNo"]) # 관리사무소 ret_val = {"총 주차대수":parkingPossibleCount, "난방":heatMethodTypeCode, "주소(도로)":Address_road, "주소(지번)":Address_jibun, "층 수":Floor, "용적률":batlRatio, "건폐율":btlRatio, "평형대":pyoengNames, "건설사":constructionCompanyName, "관리사무소":managementOfficeTelNo} return ret_val #단지 기본정보 down_url_basic = 'https://new.land.naver.com/api/complexes/{}?sameAddressGroup=false'.format(complex) r_basic = requests.get(down_url_basic,headers=headers) r_basic.encoding = "utf-8-sig" basic_Information_json=json.loads(r_basic.text) basic_info = get_basicInform_danji(basic_Information_json) print("[basic_info]", basic_info) |
이 코드는 특정 단지의 기본 정보를 추출하고 출력하는 함수와 그 함수를 호출하는 예제입니다. 다음은 코드의 동작을 단계별로 설명한 것입니다.
- 단지 기본 정보 추출 함수 정의:
> get_basicInform_danji 함수는 단지 정보를 입력 받아, 여러 가지 속성을 추출하여 반환.
> 각 속성은 입력된 info 딕셔너리에서 값을 추출하여 문자열로 변환한 후, ret_val 딕셔너리에 저장.
> ret_val 딕셔너리는 단지의 총 주차대수, 난방 방식, 주소(도로 및 지번), 층 수, 용적률, 건폐율, 평형대, 건설사, 관리사무소 전화번호 등의 정보 포함.
- 단지 기본 정보 조회 및 출력:
> down_url_basic를 사용하여 단지 정보 URL 생성.
> 응답을 JSON 형식으로 basic_Information_json 저장.
> get_basicInform_danji 를 호출하여 단지 정보 추출.
> 추출된 단지 기본 정보 출력.
요약하면, 이 코드는 단지의 기본 정보를 추출하는 함수를 정의하고, 이를 이용해 특정 단지의 정보를 조회하여 출력합니다. 조회된 정보에는 단지의 총 주차대수, 난방 방식, 주소(도로 및 지번), 층 수, 용적률, 건폐율, 평형대, 건설사, 관리사무소 전화번호 등이 포함됩니다.
이를 통해 브라우저 내 화면에 있는 정보를 그대로 추출할 수 있는 것을 확인할 수 있습니다.
이어서는 단지 선택 후 확인할 수 있는 “단지 내 면적별 정보”에 대해서 조금 더 상세하게 정보를 추출해보도록 하겠습니다. 본 단지에서는 8개의 면적 별 정보가 존재하는 것을 확인할 수 있습니다.
단지 내 면적별 세부 정보
python |
def get_additionalInform_danji(pyeong): Area = str(pyeong["supplyArea"]) + "/"+str(pyeong["exclusiveArea"]) # 공급/전용 ... entranceType = str(pyeong["entranceType"]) # 현관구조 ret_val = {"공급/전용":Area, "방수/욕실수":room_bathcnt, "해당면적 세대수":householdCountByPyeong, "현관구조":entranceType } return ret_val complex = complexNos_in[0] # 단지 기본정보 down_url_basic = 'https://new.land.naver.com/api/complexes/{}?sameAddressGroup=false'.format(complex) r_basic = requests.get(down_url_basic,headers=headers) r_basic.encoding = "utf-8-sig" basic_Information_json=json.loads(r_basic.text) # 보유 평형대 danji_p_list = basic_Information_json['complexPyeongDetailList'] cnt_pyeong = len(danji_p_list) if cnt_pyeong == 0: print("평형 정보가 없습니다.") else : print("[pyeong information]") for p_idx,pyeong in enumerate(danji_p_list) : #단지 정보 additional_info = get_additionalInform_danji(pyeong) print(additional_info) |
이 코드는 특정 단지의 추가 정보를 추출하고 출력하는 함수와 그 함수를 호출하는 예제입니다. 다음은 코드의 동작을 단계별로 설명한 것입니다.
- 추가 정보 추출 함수 정의:
> get_additionalInform_danji 함수는 입력된 평형 정보를 받아, 여러 가지 속성을 추출하여 반환.
> 각 속성은 입력된 pyeong 딕셔너리에서 값을 추출하여 문자열로 변환한 후, ret_val 딕셔너리에 저장.
> ret_val 딕셔너리는 단지의 공급/전용 면적, 방수/욕실수, 해당 면적의 세대수, 현관 구조 등의 정보를 포함.
- 단지 기본 정보 조회 및 평형 정보 추출:
> down_url_basic를 사용하여 단지 정보 URL을 생성.
> requests.get을 사용하여 해당 URL에 GET 요청.
> 응답을 JSON 형식으로 basic_Information_json에 저장.
> basic_Information_json에서 complexPyeongDetailList를 추출하여 단지의 평형 정보를 가져옵니다.
> 평형 리스트 크기가 0인 경우 평형 정보가 없는 경우입니다.
> 평형 정보가 있는 경우 각 평형에 정보를 추출하여 출력합니다.
요약하면, 이 코드는 단지의 추가 정보를 추출하는 함수를 정의하고, 이를 이용해 특정 단지의 평형 정보를 조회하여 출력합니다. 조회된 정보에는 단지의 공급/전용 면적, 방수/욕실수, 해당 면적의 세대수, 현관 구조 등이 포함됩니다. 이 정보는 complexPyeongDetailList에서 추출되며, 각 평형에 대해 별도로 출력됩니다.
이를 통해 브라우저 내 화면에 있는 8개 평형대에 대해서 각각의 상세 정보를 그대로 추출할 수 있는 것을 확인할 수 있습니다.
마지막으로 해당 단지에서 확인할 수 있는 매물 목록을 추출해보도록 하겠습니다.
단지 내 매물 목록
python |
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]) # 단지 코드 입력 complex = complexNos_in[0] down_url = 'https://new.land.naver.com/api/articles/complex/{}?realEstateType={}&page={}&tradeType={}'.format(complex, "APT", 1, "A1") r = requests.get(down_url,data={"sameAddressGroup":"false"},headers=headers) r.encoding = "utf-8-sig" # print("r.text:", r.text) temp=json.loads(r.text) # flag_continue = temp['isMoreData'] # temp=pd.DataFrame(temp['articleList']) print("단지명 : ", complexNMs_in[0]) selected_columns = ['articleNo','tradeTypeName','floorInfo','dealOrWarrantPrc','direction','buildingName','latitude','longitude','realtorName'] temp=pd.DataFrame(temp['articleList']) temp = temp[selected_columns] print(temp) |
이 코드는 네이버 부동산 특정 단지(=“부천옥길자이”)의 매물 정보를 조회하고 출력합니다. 전체적인 동작을 단계별로 요약하면 다음과 같습니다.
- 매물 정보 조회:
> 샘플로 매물 정보를 추출할 단지로 “부천옥길자이” 첫 번째 단지 코드를 사용하여 매물 정보를 조회합니다.
> realEstateType은 아파트(APT), page는 1, tradeType은 매매(A1) 의미
- 매물 정보 출력:
> 조회된 매물 정보 중 선택된 컬럼만 추출하여 데이터프레임으로 변환하고 출력합니다.
> 선택된 컬럼은 articleNo(매물 번호), tradeTypeName(거래 유형), floorInfo(층 정보), dealOrWarrantPrc(거래 가격), direction(방향), buildingName(건물 이름), latitude(위도), longitude(경도), realtorName(공인중개사 이름)입니다.
이 코드는 특정 단지의 매물 정보를 조회하고, 필요한 정보만 추출하여 출력하는 작업을 수행합니다.
이를 통해 브라우저 내 화면에 있는 매물의 정보 중 원하는 정보를 추출할 수 있는 것을 확인할 수 있습니다.
본 과정을 전자책으로 발행하였습니다.
전자책에서는 개발 전체 과정을 디테일하게 다루고 있으며, 특히 Full-소스코드를 포함하고 있습니다.
관심있으신 분들은 아래 링크 확인해주시면 감사드리겠습니다.
'개발 > 파이썬(PYTHON)' 카테고리의 다른 글
[PYTHON] 전국 모든 아파트/오피스텔 단지 목록 가져오기 (2/4) (2) | 2024.06.20 |
---|---|
[PYTHON] 전국 모든 아파트/오피스텔 단지 목록 가져오기 (1/4) (8) | 2023.12.18 |
Django - 에러 해결 방안 __str__ returned non-string (type int) (0) | 2023.06.05 |
[PYTHON] 네이버 중고나라(joonggonara) 물건 크롤링하기-엑셀 추출 (1) | 2023.04.25 |
[PYTHON] 네이버 부동산 상가 매물 크롤링하기(4/4) (27) | 2023.04.05 |
- Total
- Today
- Yesterday
- Excel
- 네이버 주식
- 대항력있는 임차인
- 평형정보
- matplotlib
- pandas
- pyplot
- DICTIONARY
- 크롤링
- 아파트
- PYTHON
- 네이버
- 경제적 자유
- 매물
- eum.go.kr
- REST API
- json
- 단지정보
- Export
- cortarNo
- 부동산
- 네이버쇼핑
- 파이썬
- 개발자도구
- 경매
- 크몽
- 상가
- tkinter
- beautifulsoup
- 네이버 부동산
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |