서울 오락실 주소 수집

배우는杰·2023년 6월 6일
0

GeoCoding

목록 보기
2/2

카카오맵 api를 이용해서 서울 각 자치구별로 "오락실"의 이름, 지번주소, 도로명주소, 위도, 경도를 수집하는 코드를 bard의 도움으로 작성해봤다.

이코드의 문제점은 일단 중복된 점포가 많이 수집된다.
일단 받고서 엑셀에서 중복데이터 제거를 해줘야 한다.
그리고 과연 구별로 모두 수집된 것인지 알수가 없다.
아마 카카오맵api의 45개 제한 때문인거 같은데 뭐가 문제인지 모르겠다.
동별로 더 쪼개서 돌려야 하나 싶다.

https://developers.kakao.com/docs/latest/ko/local/dev-guide#search-by-keyword-request-query-category-group-code

import requests
import pandas as pd
from tqdm import tqdm
import time

districts = ['강남구', '강동구', '강북구', '강서구', '관악구', '광진구', '구로구', '금천구', '노원구', '도봉구', '동대문구', '동작구', '마포구', '서대문구', '서초구', '성동구', '성북구', '송파구', '양천구', '영등포구', '용산구', '은평구', '종로구', '중구', '중랑구']
keyword = "오락실"

def get_places(keyword, region, page, max_page_number=1000):
url = "https://dapi.kakao.com/v2/local/search/keyword.json"
api_key = "본인의 API 신청으로 얻을 수 있는 키를 입력해주세요"
headers = {"Authorization": f"KakaoAK {api_key}"} # Use the key entered here
params = {
"query": f"{region} {keyword}",
"page": page,
"size": 15,
"address_type": "REGION_ADDR",
}
response = requests.get(url, params=params, headers=headers)
data = response.json()
if "documents" in data:
return data["documents"]
return []

def get_coordinates(address):
url = "https://dapi.kakao.com/v2/local/search/address.json"
api_key = "본인의 API 신청으로 얻을 수 있는 키를 입력해주세요"
headers = {"Authorization": f"KakaoAK {api_key}"} # Use the key entered here
params = {
"query": address,
}
response = requests.get(url, params=params, headers=headers)
data = response.json()
if "documents" in data and len(data["documents"]) > 0:
coordinate = data["documents"][0]["address"]
return coordinate["y"], coordinate["x"]
return None, None

if name == "main":
for district in districts:
stores = []
for page_number in tqdm(range(1, 1000), f"Collecting address {district}:"):
docs = get_places(keyword, district, page_number)
if not docs:
break
for d in docs:
store_name = str(d["place_name"])
lot_address = str(d["address_name"])
road_address = str(d["road_address_name"]) if "road_address_name" in d else ""
try:
latitude, longitude = get_coordinates(road_address)
except:
latitude = None
longitude = None
stores.append({"지역": district, "점포명": store_name, "지번주소": lot_address, "도로명주소": road_address, "위도(X)": latitude, "경도(Y)": longitude})
time.sleep(2)

df = pd.DataFrame(stores)

filename = f"{district}{keyword}.xlsx"

df.to_excel(file_name, index=False)

print(f"{len(stores)} data stored for {district}.")

p.s. 수집된 결과 파일을 보니 해당 자치구가 아닌 곳도 수집이 된다. 뭔가 잘못 짜여진거 같은데 원인은 파악하지 못하였다.

profile
코딩배우는 아재

0개의 댓글