๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
โ–ช Research

Guide: Converting KOICA OpenAPI Data to Files Using Python (1)

by soychoi 2024. 8. 7.
728x90
๋ฐ˜์‘ํ˜•
Guide: Python Code for Converting KOICA OpenAPI Data to Files | Excels
KOICA ์˜คํ”ˆAPI๋ฐ์ดํ„ฐ๋ฅผ ํŒŒ์ผ๋ฐ์ดํ„ฐ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ํŒŒ์ด์ฌ ์ฝ”๋“œ ๊ฐ€์ด๋“œ

1. Name of data used: KOICA ODA Project Information - KF Public Diplomacy Projects
(ํ•œ๊ตญ๊ตญ์ œํ˜‘๋ ฅ๋‹จ_KOICA ODA ์‚ฌ์—…์ •๋ณด_KF-๊ณต๊ณต์™ธ๊ต ์‚ฌ์—…์ •๋ณด)

Google Colab: https://colab.research.google.com/drive/10BISX58wfqgf2dZSR-izYJjzB1XIpEyU?usp=sharing

 

 

KOICA OpenAPI Data (19 Records) from Public Data Portal

๊ณต๊ณต๋ฐ์ดํ„ฐํฌํ„ธ KOICA ์˜คํ”ˆAPI ๋ฐ์ดํ„ฐ (19๊ฑด)

 

 

๋ฐ์ดํ„ฐ๋ช…: ํ•œ๊ตญ๊ตญ์ œํ˜‘๋ ฅ๋‹จ_KOICA ODA ์‚ฌ์—…์ •๋ณด_KF-๊ณต๊ณต์™ธ๊ต ์‚ฌ์—…์ •๋ณด

 

 

1. API ํ˜ธ์ถœ URL ์ฃผ์†Œ ํ™•์ธ

  • API ํ˜ธ์ถœ URL ์ฃผ์†Œ๋Š” ๋ฐ์ดํ„ฐ ์ƒ์„ธ์„ค๋ช…์— ๊ธฐ์žฌ๋œ ์„œ๋น„์ŠคURL์œผ๋กœ ํ™•์ธ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  • API URL์€ 'getOdaBusinessInfoList ์—”๋“œํฌ์ธํŠธ(Endpoint)๋ฅผ ํฌํ•จํ•œ ์ „์ฒด ์ฃผ์†Œ๋ฅผ ํ•„์š”๋กœ ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ [KOICA-ODA ์‚ฌ์—…์ •๋ณด KF-๊ณต๊ณต์™ธ๊ต ์‚ฌ์—…์ •๋ณด] ๋ฐ์ดํ„ฐ์ฒ˜๋Ÿผ (1) ์š”์ฒญ์ฃผ์†Œ์™€ (2) ์„œ๋น„์ŠคURL์ด ์žˆ์œผ๋ฉด ์—”๋“œํฌ์ธํŠธ๋ฅผ ํฌํ•จํ•œ ์ฃผ์†Œ๋ฅผ ์‚ฌ์šฉํ•˜์‹œ๋ฉด ๋˜์‹ญ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๊ฒฝ์šฐ๋Š” ์š”์ฒญ์ฃผ์†Œ๋ฅผ ํ™œ์šฉํ•˜์‹œ๋ฉด ๋˜์‹ญ๋‹ˆ๋‹ค.
  • ์š”์ฒญ์ฃผ์†Œ: http://apis.data.go.kr/B260003/OdaBusinessInfoService/getOdaBusinessInfoList

 

2. ์ผ๋ฐ˜ ์ธ์ฆํ‚ค(Decoding) ์‚ฌ์šฉ - ์š”์ฒญํ•ด์„œ ๋ถ€์—ฌ ๋ฐ›์€ ์ธ์ฆํ‚ค๋กœ ๋Œ€์ฒดํ•˜์—ฌ ๊ธฐ์ž…ํ•˜์…”์•ผ ํ•ฉ๋‹ˆ๋‹ค!

  • ์˜ˆ์‹œ: kGUKTo8Mh/FFlsfrtw7HOGgfkKwZkXH8TNNzDcOdXpdg4I5RrbSu89yzFp9PLET6xzVDhwQU5VyRCUKIoG2YQg==

 

3. ์š”์ฒญ๋ณ€์ˆ˜(Request Parameter) ์ž…๋ ฅ์„ ์œ„ํ•œ ์ƒ˜ํ”Œ์ฝ”๋“œ ํ™•์ธ

 

 

 

4. ์ „์ฒด ๋ฐ์ดํ„ฐ ํ˜ธ์ถœ์„ ์œ„ํ•œ ์ฝ”๋“œ ์‹คํ–‰

 

 

์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๊ณ  ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์€ ์•„๋ž˜์˜ ์ž‘์—…์„ ๊ธฐ์ดˆ๋กœ ํ•ฉ๋‹ˆ๋‹ค.

 

  • ๊ธฐ๋ณธ ์„ค์ •: API์˜ URL๊ณผ ์„œ๋น„์Šค ํ‚ค ์„ค์ •
  • ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘ ํ•จ์ˆ˜: fetch_all_data ํ•จ์ˆ˜๋Š” ๋ชจ๋“  ํŽ˜์ด์ง€์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•ฉ๋‹ˆ๋‹ค. while True ๋ฃจํ”„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŽ˜์ด์ง€ ๋ฒˆํ˜ธ๋ฅผ ์ฆ๊ฐ€์‹œํ‚ค๋ฉฐ ๋ฐ์ดํ„ฐ ์š”์ฒญ
  • ๋ฐ˜๋ณต ์š”์ฒญ: ๊ฐ ์š”์ฒญ๋งˆ๋‹ค numOfRows๋ฅผ 1000์œผ๋กœ ์„ค์ •ํ•˜์—ฌ ์ตœ๋Œ€ํ•œ ๋งŽ์€ ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ ๋ฒˆ์— ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.
  • ์‘๋‹ต ์ฒ˜๋ฆฌ: ์‘๋‹ต ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์œผ๋ฉด ๋ฃจํ”„๋ฅผ ์ข…๋ฃŒํ•˜๊ณ , ์‘๋‹ต ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์œผ๋ฉด ์ด๋ฅผ all_data ๋ฆฌ์ŠคํŠธ์— ์ถ”๊ฐ€
  • ์—๋Ÿฌ ์ฒ˜๋ฆฌ: API ์š”์ฒญ์ด ์‹คํŒจํ•  ๊ฒฝ์šฐ ๋ฃจํ”„๋ฅผ ์ข…๋ฃŒํ•˜๊ณ  ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅ
  • ๋ฐ์ดํ„ฐ ์ €์žฅ: ์ˆ˜์ง‘๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ณ  ์—‘์…€ ํŒŒ์ผ๋กœ ์ €์žฅ

 

 

URL ๋ถ„์„

 

http://openapi.koica.go.kr/api/ws/BsnsService/getBsnsInfoList

 

 

  • ํ†ต์‹  ํ”„๋กœํ† ์ฝœ : http (๋˜๋Š” https)
  • ๋„๋ฉ”์ธ : openapi.koica.go.kr 
  • ๊ธฐ๋ณธ ๊ฒฝ๋กœ(Base URL) : http://openapi.koica.go.kr/api
  • End Point : /ws/BsnsService
  • ํ†ต์‹  ํ”„๋กœํ† ์ฝœ ๋ฉ”์†Œ๋“œ : getBsnsInfoList

 

* ์—”๋“œ ํฌ์ธ๋“œ(End Point)๋Š” API ์„œ๋น„์Šค ๋‚ด์—์„œ ํŠน์ • ์„œ๋น„์Šค๋‚˜ ๋ฆฌ์†Œ์Šค๋ฅผ ์ง€์นญํ•˜๋Š” ๋ถ€๋ถ„์œผ๋กœ API์˜ ํ˜ธ์ถœ ์ฃผ์†Œ์ž…๋‹ˆ๋‹ค.

* ํ†ต์‹  ํ”„๋กœํ† ์ฝœ ๋ฉ”์†Œ๋“œ๋Š” ํ˜ธ์ถœํ•  ํŠน์ • ๊ธฐ๋Šฅ์ด๋‚˜ ์ž‘์—…์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ์ผ๋ฐ˜์ ์œผ๋กœ API์˜ ๋ฉ”์†Œ๋“œ(method) ๋˜๋Š” ์•ก์…˜(action)์œผ๋กœ ํ˜ธ์นญ๋ฉ๋‹ˆ๋‹ค.

 

 

์ฐธ๊ณ  ์œ ์˜์‚ฌํ•ญ

 

* [ํ™ˆํŽ˜์ด์ง€] Open API ํ™œ์šฉ ์‹ ์ฒญ ํ›„, ํ™œ์šฉ์‹ ์ฒญ ํ˜„ํ™ฉ์˜ End Point์œผ๋กœ๋Š” ์ „์ฒด ์„œ๋น„์Šค URL์„ ํ™•์ธํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

 

 

* ์š”์ฒญ๋ณ€์ˆ˜(Request Parameter) ์ž…๋ ฅ์„ ์œ„ํ•œ ์ƒ˜ํ”Œ์ฝ”๋“œ ํ™•์ธ์‹œ ์ƒ˜ํ”Œ์ฝ”๋“œ๋Š” PC์—์„œ๋งŒ ํ™•์ธ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ํ™”๋ฉด ํฌ๊ธฐ์— ๋”ฐ๋ผ ๋ณด์ด์ง€ ์•Š์„ ์ˆ˜ ์žˆ์œผ๋‹ˆ ํ™”๋ฉด์„ ์ตœ๋Œ€ํ™”ํ•˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

 

 

์ „์ฒด ์ฝ”๋“œ
# 1. ํ•œ๊ตญ๊ตญ์ œํ˜‘๋ ฅ๋‹จ_KOICA-ODA ์‚ฌ์—…์ •๋ณด_KF-๊ณต๊ณต์™ธ๊ต ์‚ฌ์—… ์ •๋ณด

import requests
import pandas as pd
from google.colab import files

# API ์š”์ฒญ URL ๋ฐ ๊ธฐ๋ณธ ํŒŒ๋ผ๋ฏธํ„ฐ ์„ค์ •

# ์•„๋ž˜ serviceKey์—๋Š” ์š”์ฒญํ•ด์„œ ๋ถ€์—ฌ ๋ฐ›์€ "์ผ๋ฐ˜ ์ธ์ฆํ‚ค(Decoding)"๋กœ ๋Œ€์ฒดํ•˜์—ฌ ๊ธฐ์ž…ํ•˜์…”์•ผ ํ•ฉ๋‹ˆ๋‹ค!
service_key = '์ผ๋ฐ˜ ์ธ์ฆํ‚ค(Decoding)'

# ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘ ํ•จ์ˆ˜
def fetch_all_data(url, service_key):
all_data = []
page_no = 1

while True:
params = {
'serviceKey': service_key,
'numOfRows': '1000', # ํ•œ ๋ฒˆ์— ์ตœ๋Œ€ํ•œ ๋งŽ์€ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญ
'pageNo': page_no
}

response = requests.get(url, params=params)
if response.status_code == 200:
items = response.json().get('data', [])
if not items:
break
all_data.extend(items)
page_no += 1
else:
print(f"API ์š”์ฒญ ์‹คํŒจ: {response.status_code}")
break

return all_data

# ์ „์ฒด ๋ฐ์ดํ„ฐ ํ˜ธ์ถœ
all_items = fetch_all_data(url, service_key)

# ํ•ญ๋ชฉ๋ช…(์˜๋ฌธ)๊ณผ ํ•ญ๋ชฉ๋ช…(๊ตญ๋ฌธ)์˜ ๋งคํ•‘
column_mapping = {
"country_nm": "ํ•œ๊ธ€ ๊ตญ๊ฐ€๋ช…",
"country_eng_nm": "์˜๋ฌธ ๊ตญ๊ฐ€๋ช…",
"country_iso_alp2": "ISO 2์ž๋ฆฌ์ฝ”๋“œ",
"continent_nm": "๋Œ€๋ฅ™๋ช…",
"business_type_cd": "์‚ฌ์—…์œ ํ˜•์ฝ”๋“œ",
"business_type_cd_nm": "์‚ฌ์—…์œ ํ˜•๋ช…",
"kor_business_nm": "์‚ฌ์—…๋ช…(๊ตญ๋ฌธ)",
"eng_business_nm": "์‚ฌ์—…๋ช…(์˜๋ฌธ)",
"business_start_dt": "์‚ฌ์—…์‹œ์ž‘์ผ",
"business_end_dt": "์‚ฌ์—…์ข…๋ฃŒ์ผ",
"multi_year_type_cd": "๋‹ค๋…„๊ตฌ๋ถ„์ฝ”๋“œ",
"multi_year_type_cd_nm": "๋‹ค๋…„๊ตฌ๋ถ„์ฝ”๋“œ๋ช…",
"bnft_org_nm": "์ˆ˜ํ˜œ๊ธฐ๊ด€๋ช…",
"business_year": "์‚ฌ์—…๋…„๋„"
}

# ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„ ๋ณ€ํ™˜ ๋ฐ ์—‘์…€ ํŒŒ์ผ ์ €์žฅ
if all_items:
df = pd.DataFrame(all_items)
df.rename(columns=column_mapping, inplace=True)
file_path = 'KOICA_odabizinfo_kor.xlsx'
df.to_excel(file_path, index=False)
print(f"์ „์ฒด ๋ฐ์ดํ„ฐ๊ฐ€ '{file_path}' ํŒŒ์ผ๋กœ ์ €์žฅ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.")
files.download(file_path)
else:
print("์‘๋‹ต ๋ฐ์ดํ„ฐ์— ํ•ญ๋ชฉ์ด ์—†์Šต๋‹ˆ๋‹ค.")

 

 

728x90
๋ฐ˜์‘ํ˜•