하나의 위치 정보 추출하기
from dotenv import load_dotenv
import os
import requests
load_dotenv()
GOOGLE_API_ID = os.getenv('GOOGLE_API_ID')
# API 요청 URL 생성
base_url = "https://maps.googleapis.com/maps/api/geocode/json"
address = "강원도 고성군 현내면 통일전망대로 20"
params = {
"address": address,
"key": GOOGLE_API_ID,
"language": "ko" # 응답을 한국어로 설정
}
# API 호출
response = requests.get(base_url, params=params)
# 응답 처리
if response.status_code == 200:
data = response.json()
if data["status"] == "OK":
# 첫 번째 결과 가져오기
result = data["results"][0]
formatted_address = result["formatted_address"]
location = result["geometry"]["location"]
print("주소:", formatted_address)
print("위도:", location["lat"])
print("경도:", location["lng"])
else:
print(f"Geocoding 실패: {data['status']}")
else:
print(f"API 요청 실패: {response.status_code}")
주소: 대한민국 강원특별자치도 고성군 현내면 통일전망대로
위도: 38.572332
경도: 128.3890568
서울 부근 박물관의 위치 정보 추출하기
import os
import requests
import json
from urllib.parse import urlencode
from dotenv import load_dotenv
# .env 파일 로드 (API Key 보안 관리)
load_dotenv()
# Google API Key 설정
GOOGLE_API_KEY = os.getenv("GOOGLE_API_KEY")
# Google Places API URL
# nearbysearch로 특정 위치와 반경 내의 박물관 정보를 가져옵니다
PLACES_API_URL = "https://maps.googleapis.com/maps/api/place/nearbysearch/json"
def get_museums(location, radius=50000):
"""
Google Places API를 사용해 특정 위치에서 반경 내의 박물관 정보를 가져옵니다.
:param location: 중심 위치 (위도, 경도) 문자열 (예: "37.5665,126.9780")
:param radius: 검색 반경 (미터 단위)
:return: 박물관 정보 리스트
"""
params = {
"key": GOOGLE_API_KEY,
"location": location,
"radius": radius,
"keyword": "박물관", # '박물관' 키워드로 검색
"language": "ko" # 결과를 한국어로 반환
}
response = requests.get(PLACES_API_URL, params=params)
if response.status_code == 200:
data = response.json()
if "results" in data:
return data["results"] # 박물관 정보 리스트 반환
else:
print("결과가 없습니다.")
return []
else:
print(f"API 요청 실패: {response.status_code}")
return []
def save_to_geojson(museums, filename="museums.geojson"):
"""
박물관 데이터를 GeoJSON 형식으로 저장합니다.
:param museums: 박물관 정보 리스트
:param filename: 저장할 파일 이름
"""
features = []
for museum in museums:
name = museum.get("name")
location = museum.get("geometry", {}).get("location", {})
lat = location.get("lat")
lng = location.get("lng")
if lat is not None and lng is not None:
features.append({
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [lng, lat],
},
"properties": {
"name": name,
"address": museum.get("vicinity"),
"rating": museum.get("rating"),
},
})
geojson_data = {
"type": "FeatureCollection",
"features": features,
}
with open(filename, "w", encoding="utf-8") as f:
json.dump(geojson_data, f, ensure_ascii=False, indent=4)
def main():
# 서울 중심 좌표 (위도, 경도)
seoul_location = "37.5665,126.9780"
# 반경 50km 내의 박물관 정보 가져오기
museums = get_museums(seoul_location, radius=50000)
if not museums:
print("박물관 정보를 가져오지 못했습니다.")
return
print(f"{len(museums)}개의 박물관 정보를 가져왔습니다.")
# GeoJSON 파일로 저장
save_to_geojson(museums)
print("GeoJSON 파일이 생성되었습니다: museums.geojson")
if __name__ == "__main__":
main()
전국 박물관의 위치 정보 추출하기
import os
import requests
import json
import pandas as pd
from urllib.parse import urlencode
from dotenv import load_dotenv
# .env 파일 로드 (API Key 보안 관리)
load_dotenv()
# Google API Key 설정
GOOGLE_API_KEY = os.getenv("GOOGLE_API_KEY")
# Google Places API URL
PLACES_API_URL = "https://maps.googleapis.com/maps/api/place/nearbysearch/json"
def get_museums(location, radius=50000, keyword="박물관"):
"""
Google Places API를 사용해 특정 위치에서 반경 내의 박물관 정보를 가져옵니다.
:param location: 중심 위치 (위도, 경도) 문자열 (예: "37.5665,126.9780")
:param radius: 검색 반경 (미터 단위)
:param keyword: 검색 키워드 (예: '박물관')
:return: 박물관 정보 리스트
"""
params = {
"key": GOOGLE_API_KEY,
"location": location,
"radius": radius,
"keyword": keyword,
"language": "ko" # 결과를 한국어로 반환
}
all_results = []
next_page_token = None
while True:
if next_page_token:
params["pagetoken"] = next_page_token
response = requests.get(PLACES_API_URL, params=params)
if response.status_code == 200:
data = response.json()
if "results" in data:
all_results.extend(data["results"])
# 다음 페이지 토큰이 있는 경우 계속 요청
next_page_token = data.get("next_page_token")
if not next_page_token:
break
# 다음 페이지 요청을 위해 대기 (API 제한)
import time
time.sleep(2)
else:
print(f"API 요청 실패: {response.status_code}")
break
return all_results
def save_to_json(data, filename="museums.json"):
"""
데이터를 JSON 파일로 저장합니다.
:param data: 저장할 데이터
:param filename: 저장할 파일 이름
"""
with open(filename, "w", encoding="utf-8") as f:
json.dump(data, f, ensure_ascii=False, indent=4)
def load_from_json(filename="museums.json"):
"""
JSON 파일에서 데이터를 로드합니다.
:param filename: 로드할 파일 이름
:return: 로드된 데이터
"""
with open(filename, "r", encoding="utf-8") as f:
return json.load(f)
def convert_to_dataframe(museums):
"""
박물관 데이터를 데이터프레임으로 변환합니다.
:param museums: 박물관 정보 리스트
:return: pandas DataFrame
"""
data = []
for museum in museums:
name = museum.get("name")
address = museum.get("vicinity")
rating = museum.get("rating")
location = museum.get("geometry", {}).get("location", {})
lat = location.get("lat")
lng = location.get("lng")
data.append({
"Name": name,
"Address": address,
"Rating": rating,
"Latitude": lat,
"Longitude": lng,
})
return pd.DataFrame(data)
def main():
# 주요 도시 중심 좌표 설정 (서울, 부산, 대구, 대전 등)
locations = [
"37.5665,126.9780", # 서울
"35.1796,129.0756", # 부산
"35.8714,128.6014", # 대구
"36.3504,127.3845", # 대전
"37.4563,126.7052", # 인천
"35.1595,126.8526", # 광주
"33.4996,126.5312" # 제주도
]
all_museums = []
for location in locations:
print(f"Fetching museums near {location}...")
museums = get_museums(location)
all_museums.extend(museums)
print(f"총 {len(all_museums)}개의 박물관 정보를 가져왔습니다.")
# JSON 파일로 저장
save_to_json(all_museums)
# 데이터프레임으로 변환 및 출력
df = convert_to_dataframe(all_museums)
print(df.head()) # 데이터프레임의 상위 5개 행 출력
# CSV 파일로 저장 (선택 사항)
df.to_csv("museums.csv", index=False, encoding="utf-8-sig")
if __name__ == "__main__":
main()
'[업무 지식] > Crawling' 카테고리의 다른 글
[ETL] Weather, MySQL 클래스를 객체화 (0) | 2025.01.02 |
---|---|
[geocode] GeoJSON의 내용을 출력하는 HTML (0) | 2025.01.02 |
[selenium] 네이버페이 주문 이력 추출하기 (0) | 2025.01.02 |
[Selenuim] 구글 검색하기 (0) | 2025.01.02 |
[MySQL] 연결 및 테이블 조작 (0) | 2025.01.01 |