1. API 통해 위치 정보 얻기
import urllib.request as request
import json
import datetime
# API 이용하기
# openweathermap.org
api_key: str = 'd1569da48f0b4251e9ec538982a29548'
# 대구 위치 정보 얻기
# https://openweathermap.org/api/geocoding-api
city: str = 'Taegu'
url: str = f'http://api.openweathermap.org/geo/1.0/direct?q={city}&limit=5&appid={api_key}'
print(url)
json_data = request.urlopen(url).read()
dict_data = json.loads(json_data)
lat = dict_data[0]['lat']
lon = dict_data[0]['lon']
print(f'{lat} / {lon}')
# 현재 날씨
# https://openweathermap.org/current
# lang=kr : 한국어 사용
# units=metric : 섭씨온도
url = (f'https://api.openweathermap.org/data/2.5/weather?lat={lat}&' #위도
f'lon={lon}&' #경도
f'appid={api_key}&'
f'lang=kr&'
f'units=metric')
print(url)
json_data = request.urlopen(url).read()
dict_data = json.loads(json_data)
json_data = json.dumps(dict_data, indent=4)
# print(json_data)
print(f'도시 : {dict_data["name"]}')
print(f'현재날씨 : {dict_data["weather"][0]["description"]}')
print(f'최고기온 : {dict_data["main"]["temp_max"]}')
print(f'최저기온 : {dict_data["main"]["temp_min"]}')
print(f'일출시간 : {datetime.datetime.fromtimestamp(dict_data["sys"]["sunrise"])}')
print(f'일몰시간 : {datetime.datetime.fromtimestamp(dict_data["sys"]["sunset"])}')
# 날씨 예보 : 5days / 3 hours
# https://openweathermap.org/forecast5
url: str = (f'https://api.openweathermap.org/data/2.5/forecast?lat={lat}&lon={lon}&appid={api_key}&lang=kr&'
f'units=metric')
print(url)
json_data = request.urlopen(url).read()
dict_data = json.loads(json_data)
json_data = json.dumps(dict_data, indent=4)
print(json_data)
weather_list = dict_data['list'] #json 데이터 중에서 list key에 해당하는 목록 가져오기.
#print(weather_list)
for item in weather_list:
print(f'시간: {datetime.datetime.fromtimestamp(item["dt"])}', end=', ')
print(f'최고기온: {item["main"]["temp_max"]}', end=', ')
print(f'날씨: {item["weather"][0]["main"]}', end=', ')
print(f'날씨: {item["weather"][0]["description"]}')
print()
2. 공공데이터를 JSON 타입으로 받아 필요한 내용 출력하고 CSV 타입으로 저장
# 공공데이터 포탈에서 '대구광역시_맛집' 검색 (키사용이 없음)
# https://www.data.go.kr/data/15057236/openapi.do
# 중구의 맛집 목록을 json 타입으로 받아서 처리
# 1. 음식카테고리 출력
# {'한식', '일식', '세계요리', '중식', '전통차/커피전문점', '특별한 술집', '디저트/베이커리', '양식'}
# 2. 일식의 음식점명, 연락처, 메뉴 출력
# --------------------
# 음식점명: 종로초밥
# 연락처: 053-252-0321
# 메뉴: 광어회 50,000원 <br />모둠회 40,000원 <br />무침회 20,000원<br />
# --------------------
# 음식점명: 삼삼구이초밥
# 연락처: 053-425-3392
# 메뉴: 회덮밥 9,000원 <br />미주구리 30,000원 <br />점심특선 6,000원<br />
# --------------------
import json
import urllib.request as request
url: str = "https://www.daegufood.go.kr/kor/api/tasty.html?mode=json&addr=%EC%A4%91%EA%B5%AC"
json_data = request.urlopen(url).read()
dict_data: dict = json.loads(json_data)
# print(dict_data)
# 문제 1)
food_kind = set() # 중복 값 걸러주는 set 활용
for row in dict_data['data']:
food_kind.add(row['FD_CS'])
print(food_kind)
# 문제 2)
for item in dict_data['data']:
kind = item['FD_CS']
if kind == "일식":
print(f'음식점명: {item["BZ_NM"]}')
print(f'연락처: {item["TLNO"]}')
print(f'메뉴: {item["MNU"]}')
print("-" * 20)
# 3. csv 파일 저장
# 파일명 : daegu_food_jonggu_list.csv
# 인코딩 : utf-8
# 헤더 : '음식 카테고리', '음식점명', '연락처', '메뉴'
import csv
food_list: list[dict] = list()
name_list: list[str] = ['음식 카테고리', '음식점명', '연락처', '메뉴']
# csv 헤더 및 딕셔너리의 key값으로 사용.
for data in dict_data['data']:
if data['FD_CS'] == '일식':
new_data: dict = dict()
new_data[name_list[0]] = data['FD_CS']
new_data[name_list[1]] = row["BZ_NM"]
new_data[name_list[2]] = row["TLNO"]
new_data[name_list[3]] = row["MNU"]
food_list.append(new_data)
file_name = 'daegu_food_jonggu_list.csv'
with open(f'../output_02/{file_name}', 'w', newline='', encoding='UTF-8') as csvfile:
writer = csv.DictWriter(csvfile, name_list)
writer.writeheader()
for data in food_list:
data: dict
writer.writerow(data)
print(f'{file_name} 파일이 생성되었습니다.')
[ 내용 참고 : IT 학원 강의 자료 ]
'Programming Language > Python' 카테고리의 다른 글
[Python] XML 정의 및 xmltodict 라이브러리, 예제 (2) | 2024.03.06 |
---|---|
[Python] JSON API 활용 예제 2 (0) | 2024.03.06 |
[Python] JSON 파일 입출력 | 인코딩(encoding) 및 디코딩(decoding), API (2) | 2024.03.05 |
[Python] CSV 파일 입출력, reader()/writer(), DictReader()/DictWriter() (2) | 2024.03.04 |
[Python] mutable/immutable, % 연산자, 삼항 조건연산자, 지역변수/전역변수 (0) | 2024.03.03 |