일상 다반사/부동산

파이썬으로 네이버 부동산에서 지역 정보 추출하기

크롱이크 2024. 4. 25. 00:21

 

파이썬을 활용하여 네이버 부동산의 api에서 전국의 시도 정보를 가져오고

이를 파일로 저장하는 방법을 공부했다.

 

필요한 라이브러리는 다음과 같다.

requests: 웹 서버에 http 요청을 보내기 위해 사용한다.
json: json 데이터를 파싱하고 처리하기 위해 사용한다.
pandas: 데이터를 효율적으로 관리하고 처리하기 위해 사용한다.

 

작성한 코드는 다음과 같다. 

 

import requests
import json
import pandas as pd


def get_sido_info():
    down_url = 'https://new.land.naver.com/api/regions/list?cortarNo=0000000000'
    response = requests.get(down_url, data={"sameAddressGroup": "false"}, headers={
        "Accept-Encoding": "gzip",
        "Host": "new.land.naver.com",
        "Referer": "https://new.land.naver.com/complexes/102378?ms=37.5018495,127.0438028,16&a=APT&b=A1&e=RETAIL",
        "Sec-Fetch-Dest": "empty",
        "Sec-Fetch-Mode": "cors",
        "Sec-Fetch-Site": "same-origin",
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36"
    })
    response.encoding = "utf-8-sig"
    temp = json.loads(response.text)

    with open('sido.json', 'w', encoding='utf-8') as file:
        json.dump(temp, file, ensure_ascii=False, indent=4)
    return list(pd.DataFrame(temp["regionList"])["cortarNo"])

 

1. api 요청 설정

requests.get() 함수를 사용하여 네이버 부동산 api 로부터 데이터를 요청한다. 이때, 특정 http 헤더들을 설정하여 브라우저에서 요청하는 것처럼 만들어 api 접근을 해야한다.

down_url = 'https://new.land.naver.com/api/regions/list?cortarNo=0000000000'
headers = {
    "Accept-Encoding": "gzip",
    "Host": "new.land.naver.com",
    ...
}
response = requests.get(down_url, data={"sameAddressGroup": "false"}, headers=headers)

 

2. 데이터 처리

받아온 데이터는 UTF-8 인코딩으로 설정한 후, JSON 형태로 파싱한다. pandas를 사용해서 시도 코드만 추출한다.

r.encoding = "utf-8-sig"
temp = json.loads(r.text)
sido_codes = list(pd.DataFrame(temp["regionList"])["cortarNo"])

 

3. 데이터 저장

추출한 데이터를 JSON 파일 형태로 로컬에 저장한다. 실행한 파일과 함께 있는 폴더에 저장된다.

with open('sido.json', 'w', encoding='utf-8') as file:
    json.dump(temp, file, ensure_ascii=False, indent=4)

 

 

결과

{
    "regionList": [
        {
            "cortarNo": "2644000000",
            "centerLat": 35.212035,
            "centerLon": 128.980525,
            "cortarName": "강서구",
            "cortarType": "dvsn"
        },
        {
            "cortarNo": "2641000000",
            "centerLat": 35.243068,
            "centerLon": 129.0921,
            "cortarName": "금정구",
            "cortarType": "dvsn"
        },
        {
            "cortarNo": "2671000000",
            "centerLat": 35.244507,
            "centerLon": 129.222173,
            "cortarName": "기장군",
            "cortarType": "dvsn"
        },
        {
            "cortarNo": "2629000000",
            "centerLat": 35.136649,
            "centerLon": 129.084175,
            "cortarName": "남구",
            "cortarType": "dvsn"
        },
        {
            "cortarNo": "2617000000",
            "centerLat": 35.13904,
            "centerLon": 129.0569,
            "cortarName": "동구",
            "cortarType": "dvsn"
        },
        {
            "cortarNo": "2626000000",
            "centerLat": 35.205001,
            "centerLon": 129.083625,
            "cortarName": "동래구",
            "cortarType": "dvsn"
        },
        {
            "cortarNo": "2623000000",
            "centerLat": 35.162874,
            "centerLon": 129.053137,
            "cortarName": "부산진구",
            "cortarType": "dvsn"
        },
        {
            "cortarNo": "2632000000",
            "centerLat": 35.197185,
            "centerLon": 128.990438,
            "cortarName": "북구",
            "cortarType": "dvsn"
        },
        {
            "cortarNo": "2653000000",
            "centerLat": 35.152624,
            "centerLon": 128.99125,
            "cortarName": "사상구",
            "cortarType": "dvsn"
        },
        {
            "cortarNo": "2638000000",
            "centerLat": 35.104476,
            "centerLon": 128.974763,
            "cortarName": "사하구",
            "cortarType": "dvsn"
        },
        {
            "cortarNo": "2614000000",
            "centerLat": 35.097582,
            "centerLon": 129.023425,
            "cortarName": "서구",
            "cortarType": "dvsn"
        },
        {
            "cortarNo": "2650000000",
            "centerLat": 35.14564,
            "centerLon": 129.113075,
            "cortarName": "수영구",
            "cortarType": "dvsn"
        },
        {
            "cortarNo": "2647000000",
            "centerLat": 35.176235,
            "centerLon": 129.079762,
            "cortarName": "연제구",
            "cortarType": "dvsn"
        },
        {
            "cortarNo": "2620000000",
            "centerLat": 35.091199,
            "centerLon": 129.067875,
            "cortarName": "영도구",
            "cortarType": "dvsn"
        },
        {
            "cortarNo": "2611000000",
            "centerLat": 35.10619,
            "centerLon": 129.032338,
            "cortarName": "중구",
            "cortarType": "dvsn"
        },
        {
            "cortarNo": "2635000000",
            "centerLat": 35.163207,
            "centerLon": 129.1637,
            "cortarName": "해운대구",
            "cortarType": "dvsn"
        }
    ]
}

 

 

 

앞으로 하나씩 차근히 올려야겠다✌️

반응형