Learn & Record
Python (공공데이터활용(에어코리아), 공공데이터활용(근접측정소), XML, 공공데이터활용(인천공항)) 본문
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)
공부 과정을 정리한 것이라 내용이 부족할 수 있습니다.
부족한 내용은 추가 자료들로 보충해주시면 좋을 것 같습니다.
읽어주셔서 감사합니다 :)