728x90
반응형
1. 기능 설명
- 공공데이터 포털 > 한국환경공단_에어코리아에서 전국 날씨 정보를 API로 받는다.
- API url주소를 파이썬의 request 모듈을 사용해 jason 형태로 저장한다.
- json 형태의 items들을 MongoDB Collection에 추가해 DBMS에 저장한다.
- pymongo 모듈을 사용해서 MonoDB에 있는 정보 중 원하는 컬럼만 받아와 records 딕셔너리 배열로 받는다.
- records의 키값으로 컬럼명을 넣어 원하는 값을 추출해 콘솔창에 띄운다.
2. API url
- 공공데이터 포털 사이트에 접속(https://www.data.go.kr/)해 회원가입을 한다.
- '대기오염정보'로 검색한다.
- 오픈 API를 누른다.
- 한국환경공단_에어코리아_대기오염정보를 클릭 후 활용신청을 간단히 진행한다.
- 마이페이지에 들어간다.
- 개인 API인증키를 아래 링크에서 서비스키 부분에 붙여넣기 해준다.
- http://apis.data.go.kr/B552584/ArpltnInforInqireSvc/getCtprvnRltmMesureDnsty?sidoName=대구&pageNo=1&numOfRows=10&returnType=json&serviceKey=서비스키&ver=1.0
- numOfRows(데이터 건수) : 10
- returnType(반환값 타입) : json
- sidoName(시도명) : 대구
- 서비스키(인증키) : 자신의 서비스키(일반 인증키 Decoding)
3. 파이썬 코드
from pymongo import MongoClient
import requests
# MongoDB 클라이언트 생성 및 연결
client = MongoClient('localhost', 27017)
# 데이터베이스 선택 (없으면 자동 생성)
db = client['air_quality_db']
# 컬렉션(테이블과 유사) 선택 (없으면 자동 생성)
collection = db['air_quality_requestVer']
# 데이터를 요청할 API의 URL입니다.
url = 'http://apis.data.go.kr/B552584/ArpltnInforInqireSvc/getCtprvnRltmMesureDnsty'
# API 요청에 필요한 파라미터를 사전(dictionary) 형태로 준비합니다. 여기에는 지역명, 페이지 번호, 행 수, 반환 형식, 서비스키, 버전 정보가 포함됩니다.
param_data = {'sidoName':'대구',
'pageNo':'1',
'numOfRows' : '100',
'returnType' : 'json',
'serviceKey' : 'N7fv97fb45MVGN88uQunNpgIQaA0dqSkuPUud8tp6Wkf12QS41gaagdbdT2lBcLyDW8IPmOxaXanz2W4cPUABA%3D%3D',
'ver' : '1.0'}
# 준비된 URL과 파라미터를 사용해 API로부터 데이터를 요청합니다.
# res는 requests.Response의 객체. HTTP 요청에 대한 서버의 응답을 캡슐화하고 있다.
res = requests.get(url, params=param_data)
# 요청 결과를 JSON 형태로 변환합니다.
json_data = res.json()
# 변환된 JSON 데이터 내의 'items' 키에 해당하는 값을 순회하며, 각 항목을 MongoDB의 컬렉션에 저장합니다.
for item in json_data['response']['body']['items']:
collection.insert_one(item)
print("데이터가 MongoDB에 저장되었습니다.")
from pymongo import MongoClient
# MongoDB 클라이언트 생성 및 연결
client = MongoClient('localhost', 27017)
# 데이터베이스 선택
db = client['air_quality_db']
# 컬렉션 선택
collection = db['air_quality_requestVer']
# MongoDB에서 데이터 조회 (pm10Value와 stationName 필드 조회)
records = collection.find({}, {'pm10Value': 1, 'stationName': 1, '_id': 0})
for record in records:
pm10 = int(record['pm10Value']) # 미세먼지 PM10 농도 값
station_name = record['stationName'] # 측정소 이름
# 미세먼지 농도에 따른 상태 분류
if 0 <= pm10 <= 20:
status = '매우 안전'
elif 21 <= pm10 <= 30:
status = '안전'
elif 31 <= pm10 <= 50:
status = '보통'
elif 51 <= pm10 <= 60:
status = '나쁨'
elif pm10 >= 61:
status = '매우 나쁨'
else:
status = '정보 없음'
# 측정소 이름과 함께 미세먼지 농도 및 상태 출력
print(f"지역명: {station_name}, 미세먼지 농도: {pm10}, 상태: {status}")
댓글