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