티스토리 뷰

반응형

https://cocoabba.tistory.com/66

 

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

https://cocoabba.tistory.com/63#comment9750537 [PYTHON] 전국 모든 아파트/오피스텔 단지 목록 가져오기 (1/4)그 간 여러번의 포스팅을 통해서 네이버 부동산에 대한 정보를 들여다 볼 수 있었다. https://cocoabba.

cocoabba.tistory.com

 

이전 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-소스코드를 포함하고 있습니다.

 

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

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

반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
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
글 보관함