Learn & Record

Python (공공데이터활용(에어코리아), 공공데이터활용(근접측정소), XML, 공공데이터활용(인천공항)) 본문

Dev/Python

Python (공공데이터활용(에어코리아), 공공데이터활용(근접측정소), XML, 공공데이터활용(인천공항))

Walker_ 2024. 3. 6. 17:20

1. 공공데이터활용(에어코리아)

 - 공공데이터포털_에어코리아_측정소정보

import json
import csv
import requests

# 1. 데이터 수집
# 서비스 키
service_key :str = '서비스키'

url = 'http://apis.data.go.kr/B552584/MsrstnInfoInqireSvc/getMsrstnList'
param_str : str = f'?addr=대구&pageNo=1&numOfRows=30&serviceKey={service_key}&returnType=json'

response = requests.get(url + param_str)

json_data = response.text # HTTP 응답에서 텍스트 데이터를 추출
dict_data = json.loads(json_data) # JSON 형식의 문자열을 파이썬의 딕셔너리로 변환
print(dict_data)

for item in dict_data['response']['body']['items']:
    if item['addr'][0] in '대구':
        print(item['addr'])

# 2. 데이터 저장
item_list : list[dict] = list() # 목록을 저장할 리스트
name_list : list[str] = ['측정소 명', '측정소 주소', '위도', '경도', '설치년도'] # csv의 헤더 및 딕셔너리의 key값으로 사용.

for item in dict_data['response']['body']['items']:
    if item['addr'][0:2] == '대구':
        new_item: dict = dict()
        new_item[name_list[0]] = item['stationName']
        new_item[name_list[1]] = item['addr']
        new_item[name_list[2]] = item['dmX']
        new_item[name_list[3]] = item['dmY']
        new_item[name_list[4]] = item['year']
        item_list.append(new_item)

print(item_list)
with open('./output/daegu_air_list.csv', 'w', newline='', encoding='UTF-8') as file:
    dict_writer = csv.DictWriter(file, name_list)
    dict_writer.writeheader()
    for data in item_list:
        dict_writer.writerow(data)

 

2. 공공데이터활용(근접측정소)

 

 - TM 기준좌표를 조회 후 > 근접측정소 목록 조회 진행

 

 - 내가 살고있는 동네의 TM 기준좌표를 조회

# 서비스키 조회 후 기입
service_key : str = '서비스키'

# TM 조회 URL 기입
url_tm = 'http://apis.data.go.kr/B552584/MsrstnInfoInqireSvc/getTMStdrCrdnt'

# 파라미터 작성
params_tm2 =f'?umdName=대명동&pageNo=1&numOfRows=10&returnType=json&serviceKey={service_key}'
# URL과 Parameter 기입
response = requests.get(url_tm + params_tm2)

# HTTP 응답에서 텍스트 데이터를 추출
json_data = response.text

# JSON 형식의 문자열을 파이썬의 딕셔너리로 변환
dict_data = json.loads(json_data)
# 조회되는 tm 좌표 변수로 저장
tmX = dict_data['response']['body']['items'][0]['tmX']
tmY= dict_data['response']['body']['items'][0]['tmY']

 

- 같은 방식으로 근접 측정소 API 공공데이터 기능 적용

# 근접 측정소 조회 URL 기입
url_air = 'http://apis.data.go.kr/B552584/MsrstnInfoInqireSvc/getNearbyMsrstnList'

# 파라미터 작성 (tm 값은 조회한 변수)
params_air2 = f'?tmX={tmX}&tmY={tmY}&returnType=json&serviceKey={service_key}'
# URL과 Parameter 기입
response = requests.get(url_air + params_air2)

# HTTP 응답에서 텍스트 데이터를 추출
json_data = response.text

# JSON 형식의 문자열을 파이썬의 딕셔너리로 변환
dict_data = json.loads(json_data) # JSON 형식의 문자열을 파이썬의 딕셔너리로 변환

 

 - 측정소 위치 추출

for item in dict_data['response']['body']['items']:
    print(item['stationName'])
    
# 충혼탑 대명동 남산1동

 

3. XML

 - XML도 JSON과 마찬가지로 데이터를 전달을 목적으로 만든 구조화된 텍스트 형식

 - eXtensible Markup Language은 데이터 저장 및 전달을 위해 만든 다목적 마크업 언어 Markup Language.

 - 마크업 언어는 일반적인 텍스트와 구분되는 태그 Tag를 이용해 문서나 데이터를 구조화 하는 언어

 - 대표적인 마크업 언어로는 앞에서 살펴본 HTML HyperText Markup Languae.

 

 - HTML의 경우는 태그가 미리 정해져 있지만 XML은 자신이 태그를 정의해서 사용할 수 있음

 - 단 XML 문서의 규칙으 따라야 함

 

 - * 태그는 '<문자열>'로 시작해서 '</문자열>'로 끝나야 함.

 - 시작과 끝 태그의 문자열은 같아야 하며 대소문자를 구분, XML 문서에서는 시작 태그에서 끝 태그까지로 이루어진 것을     요소 element라고함 

 

 - * 태그는 중첩에 여러 개를 이용할 수 있는데 이때 태그는 반드시 올바른 순서대로 이용해야 함

 - 즉, '<abc><def> ~ </def></abc>'와 같이 나중에 나온 시작 태그에 대응하는 끝 태그가 먼저 나와야 함

 

 - * XML 문서에는 반드시 최상위 root 요소가 있어야 함. 최상위 요소는 시작과 끝 태그로 다른 모든 요소를 감싸야 함

 

 - * 주석은 '<!--'와 '-->'로 문자열을 감싸서 표시. 즉 '<!-- 이것은 주석입니다 -->'와 같이 이용

 

 - XML을 지원하는 모듈은 내장 모듈로 xml이 있고, 외부 모듈의 경우 xmltodict가 편리.

 - XML 데이터를 파이썬의 딕셔너리 타입으로 바로 변환

 - https://pypi.org/project/xmltodict/ 

 

xmltodict

Makes working with XML feel like you are working with JSON

pypi.org

 

 - xmliodict 라이브러리에서 XML 형식의 데이터를 파이썬의 딕셔너리 타입으로 변환하는 함수

 - xmltodict.parse(xml_input [, xml_attribs=True 혹은 False ])

 - xml_input은 XML 타입의 데이터

 - xml_attribs은 기본 값은 True

 - False 이면 XML 형식의 데이터를 딕셔너리 타입으로 변환할 때 속성을 무시

import csv

import requests
import pprint
import xmltodict
import xml
import pprint

with open('./input/data.xml', 'r', encoding='utf-8') as xml_file:
    dict_data = xmltodict.parse(xml_file.read(), xml_attribs=True) # xml 데이터를 딕셔너리로 변경
    print(dict_data)
    datas = dict_data['response']['body']['items']
    pprint.pprint(datas)

# 1. 대구 오페라 공연 일정 XML 파일 읽은 후 CSV로 저장

# URL 기입
url :str = 'https://www.daeguoperahouse.org/rss.php'
print(url)

# URL 정보 불러옴
response = requests.get(url)

# 불러온 정보의 TEXT 정보 저장
xml_data = response.text

# XML의 텍스트 정보를 파이썬의 딕셔너리로 변환
dict_data = xmltodict.parse(xml_data)
print(dict_data)

# 가독성이 좋게 출력을 해주는 pprint 출력
pprint.pprint(dict_data)


# 2. 데이터 저장
item_list : list[dict] = list() # 목록을 저장할 리스트
name_list : list[str] = ['제목', '링크'] # csv의 헤더 및 딕셔너리의 key값

# 필요한 정보를 추출하여 list에 저장
for item in dict_data['rss']['channel']['item']:
    new_item: dict = dict()
    new_item[name_list[0]] = item['title']
    new_item[name_list[1]] = item['link']
    item_list.append(new_item)

pprint.pprint(item_list)

# list 내용을 csv 파일로 저장
with open('./output/daegu_opera_240306.csv', 'w', newline='', encoding='UTF-8') as file:
    dict_writer = csv.DictWriter(file, name_list)
    dict_writer.writeheader()
    for data in item_list:
        dict_writer.writerow(data)

 

4. 공공데이터 활용 (인천공항정보)

 -https://www.data.go.kr/data/15095074/openapi.do

 

인천국제공항공사_여객편 주간 운항 현황

인천공항 여객 항공기 출발 / 도착 정보 현황에 대한 데이터로 조회일 기준 +6일간의 항공사/항공 편명, 터미널 구분, 도착/출발 시간, 출발/도착지 정보 등을 제공한다.

www.data.go.kr

 - 대한항공사, 출발지공항, 스케줄타임을 추출해서 csv 파일로 저장

import csv
import pprint

import requests
import xmltodict

# 인증키 기입
service_key :str = '개인인증키'
# URL 기입
url = 'http://apis.data.go.kr/B551177/StatusOfPassengerFlightsDSOdp/getPassengerDeparturesDSOdp'
param = f'?serviceKey={service_key}&type=xml&airline=대한항공'

# URL 정보 불러옴
response = requests.get(url+param)

# 불러온 정보의 TEXT 정보 저장
xml_data = response.text

# XML의 텍스트 정보를 파이썬의 딕셔너리로 변환
dict_data = xmltodict.parse(xml_data)
print(dict_data)

# 가독성이 좋게 출력을 해주는 pprint 출력
pprint.pprint(dict_data)

# 2. 데이터 저장
item_list : list[dict] = list() # 목록을 저장할 리스트
# csv의 헤더 및 딕셔너리의 key값
name_list : list[str] = ['항공사', '출발지공항', '스케줄타임']

# 필요한 정보를 추출하여 list에 저장 (대한항공만 추출)
for item in dict_data['response']['body']['items']['item']: # 필요데이터 위치 경로 파악
    if item.get('airline'): # item 딕셔너리 안에 'airline' key 값이 있을 경우 아래 아래 코드 실행
        if item['airline'][0:2] == '대한': # 항공사의 앞 두글자가 '대한'일 때, 아래 코드 실행
            new_item: dict = dict() # 딕셔너리 객체 생성
            new_item[name_list[0]] = item['airline'] # 딕셔너리 안에 name_list 리스트의 0번 인덱스에 airline 값들 저장
            new_item[name_list[1]] = item['airport'] # 딕셔너리 안에 name_list 리스트의 1번 인덱스에 airport 값들 저장
            new_item[name_list[2]] = item['scheduleDateTime'] # 딕셔너리 안에 name_list 리스트의 2번 인덱스에 scheduleDateTime 값들 저장
            item_list.append(new_item) # 각각의 리스트 들을 item_list라는 큰 리스트에 저장

# 가독성 좋게 pprint 출력
pprint.pprint(item_list)

# list 내용을 csv 파일로 저장
with open('./output/incheon_air_daehan_start.csv', 'w', newline='', encoding='UTF-8') as file:
    dict_writer = csv.DictWriter(file, name_list)
    dict_writer.writeheader()
    for data in item_list:
        dict_writer.writerow(data)

 


공부 과정을 정리한 것이라 내용이 부족할 수 있습니다.

부족한 내용은 추가 자료들로 보충해주시면 좋을 것 같습니다.

읽어주셔서 감사합니다 :)