My Python
open API를 CSV 파일로 전환하기 (json)
beie
2024. 1. 26. 20:31
(+ SERVICE_KEY_IS_NOT_REGISTERED_ERROR 발생 원인)
공공데이터 (open API)는 보통 데이터 활용신청 후 부여받은 키 값을 사용하여 불러올 수 있음
< 1 >
다음과 같은 json 활용 코드로 API 호출 완료
import requests
import pandas as pd
# 인증키
encoding = "부여받은 encoding 삽입"
decoding = "부여받은 decoding 삽입"
# 엔드포인트 및 파라미터 설정
url = '부여받은 End Point 혹은 url 삽입'
params = {'serviceKey': decoding, 'pageNo': '1', 'numOfRows': '5', 'type': 'json'}
# API 호출
response = requests.get(url, params=params)
json_data = response.json()
< 2 >
우선, 위의 코드에서 적절하게 'pageNO'와 'numOfRows'의 수를 설정하기 위해
몇 개의 row가 존재하는지 확인
# totalCount 확인
total_count = int(json_data['response']['body']['totalCount'])
print(f"Total count of data: {total_count}")
[확인하는 이유]
처음에는 확인하지 않고 pageNO를 1로 두고 numOfRows만 늘려가는 방식으로 돌렸더니
3000부터는 코드가 돌아가지 않는 오류 발생
< 3 >
그래서 2000행을 6 dataframe으로 나눠서 받기로 결정 ( = pageNO를 1~6으로 넘기면서 numOfRows를 2000씩)
base_params = {'serviceKey': decoding, 'numOfRows': '2000', 'type': 'json'}
# 10번 반복
for i in range(1, 7):
# 'pageNo' 변경
base_params['pageNo'] = str(i)
# API 호출
response = requests.get(url, params=base_params)
json_data = response.json()
# 응답에서 items 키가 있는지 확인
if 'items' in json_data['response']['body']:
items = json_data['response']['body']['items']
# items가 리스트 형태인지 확인
if isinstance(items, list):
# 리스트의 각 딕셔너리를 DataFrame으로 변환
df = pd.DataFrame(items)
# 결과 출력
print(df)
# CSV 파일로 저장
df.to_csv(f'd{i}.csv', index=False, encoding='utf-8-sig')
else:
print(f"The 'items' key is not a list on page {i}.")
else:
print(f"No 'items' key found in the response on page {i}.")
6개의 dataframe을 받아서 d1, d2, d3, d4, d5, d6의 이름의 csv형식의 파일로 저장하도록 반복
** "utf-8" 사용했더니 엑셀에서 한글이 깨져서 "utf-8-sig" 사용
저장 완료
< 4 >
6개 csv파일 통합하기
import pandas as pd
# 파일 이름 리스트
file_names = ['d1.csv', 'd2.csv', 'd3.csv', 'd4.csv', 'd5.csv', 'd6.csv']
# 빈 DataFrame 생성
combined_df = pd.DataFrame()
# 각 파일을 순회하며 데이터를 합침
for file_name in file_names:
df = pd.read_csv(file_name)
combined_df = pd.concat([combined_df, df], ignore_index=True)
# 합친 데이터를 새로운 CSV 파일로 저장 (UTF-8 인코딩, 인덱스 미포함)
combined_df.to_csv('통합본.csv', index=False, encoding='utf-8-sig')
# 잘 합쳐졌는지 확인하면 끝~~
comnined_df.info()
끝 ~ ~
< SERVICE_KEY_IS_NOT_REGISTERED_ERROR 발생 원인 >
1. 서비스 키값 입력 잘못함
2. 활용신청 후 동기화가 아직 안됨
(동기화 완료될때까지 기다려야함. / 데이터 사용 사이트내에 문의해봐야 확인할 수 있는 부분 )
+ 서비스키 값은 웬만하면 재발급 받지 X