일상 다반사/부동산
파이썬으로 네이버 부동산에서 지역 정보 추출하기
크롱이크
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"
}
]
}
앞으로 하나씩 차근히 올려야겠다✌️
반응형