본문 바로가기
프로그래밍/파이썬기초

서울시 미세먼지 API로 미세먼지 알리미 만들기

by 조크리 2023. 11. 13.
반응형

 

안녕하세요?

이번 글에서는 

서울시에서 제공하는

미세먼지 구별 현황 API를 활용해

미세먼지 알리미를 만들어 보겠습니다. 

 
 


목차

     

     

     

    1. 서울시 열린 데이터광장에서 미세먼지 API 가져와서 데이터 추출하기

     

    첫 단계는 API를 가져와서 데이터를 추출하는 단계입니다. 

    우선 requests 를 import 해주어야 합니다.

    그리고 requests를 사용해서 발급받은 API를 넣어줍니다. 

     

    그리고 city_air라는 변수를 만들어서 응답 데이터를 쉽게 접근할 수 있도록 만들어 줍니다. 

    # requests 라이브러리 설치 필요
    import requests
    
    # requests 를 사용해 요청(Request)하기
    response_data= requests.get('http://openapi.seoul.go.kr:8088/6d4d776b466c656533356a4b4b5872/json/RealtimeCityAir/1/99')
    
    # 응답(response) 데이터인 json을 쉽게 접근할 수 있게 만들어 city_air변수에 넣는다.
    city_air = response_data.json()

     

     

    그럼 이 city_air라는 변수에는 API로 불러온 정보들이 다 담겨 있는 상태가 되겠죠!

    그럼 여기서

    row의 0번째 항목의 'MSRSTE_NM'을 출력해보겠습니다. 

    즉 row의 value값은 리스트로 이루어져 있는데

    이 리스트의 0번째 항목을 우선 불러옵니다.

    0번째 항목은 딕셔너리로 이루어져 있죠!

    이 딕셔너리에서 MSRSTE_NM의 key값을 불러옵니다.

    그럼?!

    중구 라는 글자가 출력되어야 겠죠!

     

    코드는 매우 간단합니다.

    print(city_air['RealtimeCityAir']['row'][0]['MSRSTE_NM'])

     

    이렇게 써주면 됩니다. 

    결과도 함께 보겠습니다. 

    결과도 중구로 잘 나옵니다. 

    # 값을 출력
    print(city_air['RealtimeCityAir']['row'][0]['MSRSTE_NM'])

     

     

    2. 서울시 모든 구의 PM10 값(미세먼지 값) 출력하기

     

    다음은 서울시 모든 구의 PM10의 값을 출력해보겠습니다.

    PM10은 미세먼지, PM25는 초미세먼지를 나타내는데

    중구는 29, 종로구는 31 이런식으로 출력이 되어야 겠죠!

     

     

    이를 위해서는 반복문을 써야 합니다. 

    그리고 반복문을 사용하기 전에 변수를 하나 더 만들어 주면 좋습니다. 

     

    이렇게 gu_infos 라는 변수를 만들어 주고 row의 value값들을 나타내는 부분을 넣어줍니다. 

    gu_infos = city_air['RealtimeCityAir']['row']

     

    그리고 나서

    반복문을 써주면 됩니다.

    for gu_info in gu_infos:
      print(gu_info['MSRSTE_NM'], gu_info['PM10'])

     

    전체 코드를 보겠습니다. 

    전체 구의 미세먼지 값들이 수치로 나타나게 됩니다. (2023.11.10.(금) 수치입니다.)

    #서울시 모든 구의 PM10 값 출력하기
    gu_infos = city_air['RealtimeCityAir']['row']
    
    for gu_info in gu_infos:
      print(gu_info['MSRSTE_NM'], gu_info['PM10'])

     

     

     

     

    3. PM10 값이 30미만인 구를 나타내기

     

    이번에는 조건을 좀 걸어보았습니다. 

    PM10 값이 30 미만인 구만 나타내도록 if(조건문)을 추가했습니다. 

    for반복문 안에 if문을 넣어주면 되겠죠!

    #PM10 값이 30미만인 구 나타내기
    for gu_info in gu_infos:
        if gu_info['PM10'] < 30:
           print(gu_info['MSRSTE_NM'], gu_info['PM10'])

     

    4. 서울시 모든 구 중에서 미세먼지 보통, 나쁨 인 경우만 안내하는 프로그램

     

    이번에는 

    서울시의 모든 구 중에서

    미세먼지가 보통, 나쁨인 경우만 안내해주는 프로그램을 만들어보겠습니다. 

    이 경우는 if와 else또는 elif를 사용할 수 있는데요.

    미세먼지가 나쁨인 조건과 보통인 조건을 사용해주면 됩니다. 

     

    for gu_info in gu_infos:
      if gu_info['IDEX_NM'] == '나쁨':
        print('{}의 미세먼지 상태가 나쁨입니다. 외출을 자제하세요.'.format(gu_info['MSRSTE_NM']))
      elif gu_info['IDEX_NM'] == '보통':
        print('{}의 미세먼지 상태가 보통입니다. 외출하셔도 됩니다.'.format(gu_info['MSRSTE_NM']))

     

    2023.11.10.(금) 기준으로는 도봉구와 강북구가 미세먼지가 보통인 상태네요~!

     

     

    5. 서울시 미세먼지 알리미 프로그램

     

    그럼 마지막으로 미세먼지 알리미 프로그램을 만들어보겠습니다. 

    이렇게 알고 싶은 구를 사용자가 입력하면

    그 구의 미세먼지 상태를 알려줍니다.

     

    만약에 사용자가 구의 이름을 잘못 입력했다면

    다시 질문합니다.

     

    사용자가 종료라고 말하면 프로그램이 종료됩니다. 

     

     

    이 프로그램의 전체 코드를 한 번 살펴보겠습니다. 

     

    앞부분은 API를 불러오는 부분이고요.

     

    air 라는 딕셔너리를 새롭게 만들어 주었습니다. 

    이제 air라는 딕셔너리에는 구의 이름과 그 구의 미세먼지 값을 key와 value로 입력해줍니다. 

     

    그리고 while반복문을 써준 뒤,

    사용자가 어떤 구의 미세먼지 상태가 궁금한지 입력하도록 input()함수를 써줍니다.

    만약에 미세먼지 상태가 30보다 적으면 좋다고 판단하도록 하고

    미세먼지 상태가 30보다 크고 80보다 같거나 작으면 보통이라고 판단합니다.

    미세먼지 상태가 80보다 크고 150보다 같거나 작으면 미세먼지 상태는 나쁨이라고 판단합니다.

    150 초과의 경우라면 미세먼지 상태는 매우 나쁨입니다. 

     

    사용자가 종료라고 입력하면?

    프로그램이 끝나기에 break를 써줍니다. 

    import requests
    response_data= requests.get('http://openapi.seoul.go.kr:8088/6d4d776b466c656533356a4b4b5872/json/RealtimeCityAir/1/99')
    city_air = response_data.json()
    gu_info = city_air['RealtimeCityAir']['row']
    air = {}
    for i in gu_info:
      air[i["MSRSTE_NM"]] = i['PM10']
    
    print('미세먼지알리미입니다. 종료하고 싶으면 "종료"을 입력해주세요')
    
    while True:
      select = str(input('어떤 구의 미세먼지 상태가 궁금한가요? : '))
      if select in air.keys():
        for a, b in air.items():
          if select == a:
            if b <= 30:
              print(a + '의 미세먼지 상태는 좋음입니다')
            elif 30 < b <= 80:
              print(a + '의 미세먼지 상태는 보통입니다')
            elif 80 < b <= 150:
              print(a + '의 미세먼지 상태는 나쁨입니다')
            else:
              print(a + '의 미세먼지 상태는 매우나쁨입니다')
      elif select == '종료':
        print('이용해주셔서 감사합니다')
        break

     

    실제로 작동시켜보면 이런 예시 결과가 나옵니다. 

     

     

    이번 글에서는

    서울시 미세먼지 API를 활용하는 예제를 살펴보았습니다. 

     

    다음 글에서는

    서울시 따릉이 API를 가져와서 따릉이 안내 프로그램을 만들어보겠습니다~!

     

    반응형