API

Application Programming Interface
어플리케이션이 서로 소통하기 위한 인터페이스 / 규칙 / 프로토콜

  • 네이버와 소통하기 위한 네이버 API
  • 구글과 소통하기 위한 구글 API
  • 공개되어 모든 사람들이 접속할 수 있는 오픈 API

와 같이 이해할 수 있겠다.

API 호출해보기

POSTMAN

![[Pasted image 20250508223849.png]]
API를 여러개 호출해보고 관리하기 위한 플랫폼
직접 날려보는거 연습은 여기서 하는게 제일 편하다.
주소

파이썬

사실 다들 API를 날리려는 목적이 데이터 수집 등일테니, 파이썬으로 바로 날려보자.
간단하게 파이썬의 requests라는 라이브러리를 이용해보자.

라이브러리 세팅

우선 가상환경을 세팅하거나 하고, requests 라이브러리를 깐 적이 없다면

pip install requests

와 같은 명령어를 통해 라이브러리를 설치하자.

API 호출

다음과 같이 API를 호출해볼 수 있다.

import requests

r = requests.get('https://httpbin.org/get')
print(r.json())

# {'args': {}, 'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Host': 'httpbin.org', 'User-Agent': 'python-requests/2.32.3', 'X-Amzn-Trace-Id': 'Root=1-681cb4a7-5d1f2758285456d213f3c296'}, 'origin': '180.229.161.36', 'url': 'https://httpbin.org/get'}

HTTP Method로 Get 요청을 날린건데, 이게 궁금하다면 http를 검색해서 찾아보는것도 좋을 것이다.
데이터만 모을거면 스킵해도…

url과 헤더

![[Pasted image 20250508224327.png]]
다음과 같이 requests.get 함수는 url, param, data 등을 받게 되어있다.
이걸 위해 예시로 생활안전정보 편의점 API 를 살펴보자.

![[Pasted image 20250508224443.png]]

url은 위에 나와있는 대로
http://safemap.go.kr/openApiService/data/getConvenienceStoreData.do

와 같이, 직접 api 요청을 날릴 주소이고,

param은 보통 query param으로 주소창의 ?뒤에 들어가는 변수들이다.
![[Pasted image 20250508224705.png]]

data는 보통 posts에서 담는 본문으로, 게시글 등록 등에서 쓰인다.

따라서 저 API에서 필수로 요구하는 5가지 파라미터인 serviceKey, numOfRows, pageNo, dataType, Fclty_Cd 를 param 변수로 넣어주면 될 것 같다. 이를 구현해보면 다음과 같다.

import requests

URL = "http://safemap.go.kr/openApiService/data/getConvenienceStoreData.do?pageNo=2&numOfRows=10&dataType=XML&Fclty_Cd=509010&serviceKey=FY0E9MKY-FY0E-FY0E-FY0E-FY0E9MKYT7"

PARAMS = {
	"serviceKey": "자신의 API KEY",
	"numOfRows": 10,
	"pageNo": 2,
	"dataType": "XML",
	"Fclty_Cd": "509010"
}

result = requests.get(url=URL, params=PARAMS)
print(result.text)
# print(result.json())

PARAMS는 딕셔너리로 작성하면 된다.
이때 결과를 보니 써있는대로 XML파일이다. text로 안된다면 json으로도 시도해보기. 아니면 응답 잘 나왔는지 status_code같은걸로 확인해보기.

XML 파싱

GPT한테 물어보니 xml.etree.ElementTree라는 표준 라이브러리가 있다고 알려준다. 좋은 세상이다.

import xml.etree.ElementTree as ET
import pandas as pd

root = ET.fromstring(result.text)
datas = []
for item in root.find('body').find('items').findall('item'):
	data = { child.tag: child.text for child in item }
	datas.append(data)

df = pd.DataFrame(datas)
print(df)

이렇게 하면 깔끔하게 DataFrame으로 만들어진다. csv파일로 바꾸기도 편하겠지.

근데

<FCLTY_NM>씨스페이스<안산테콤점></FCLTY_NM> 

이런상황에서 버그가 나서..

beautifulsoup를 쓰는게 나아보인다.

pip install bs4

진행한 후

raw = result.text
soup = BeautifulSoup(raw, "lxml-xml")
items = soup.find_all("item")

for it in items:
	data = {}
	for child in it.find_all(recursive=False):
	data[child.name] = child.get_text(strip=True)
	datas.append(data)

이와 같이 마무리했다.

Json 파싱

나중에 쓸 일 생기면 추가하겠다.

API 호출 자동화

이제 편의점 자료를 다 모으려면.. 이걸 페이지네이션을 돌던가 거대한 입력을 한번 받으면 될거같다. 거대하게 받는건 좀 짜치니 페이지네이션을 도는걸 해보자.

import requests
import pandas as pd
import xml.etree.ElementTree as ET
from bs4 import BeautifulSoup

URL = "http://safemap.go.kr/openApiService/data/getConvenienceStoreData.do"
API_KEY = "자신의 API 키"
ROW_SIZE = 1000

datas = []
page = 1

while True:
	PARAMS = {
		"serviceKey": API_KEY,
		"numOfRows": ROW_SIZE,
		"pageNo": page,
		"dataType": "XML",
		"Fclty_Cd": "509010"
	}
	result = requests.get(url=URL, params=PARAMS)
	raw = result.text
	
	soup = BeautifulSoup(raw, "lxml-xml")
	items = soup.find_all("item")
	if not items:
		break

	for it in items:
		data = {}
		for child in it.find_all(recursive=False):
			data[child.name] = child.get_text(strip=True)
		datas.append(data)

	print(f"페이지 {page} 완료: {len(items)}건")
	page += 1
	if len(items) < ROW_SIZE:
		break

df = pd.DataFrame(datas)
df.to_csv("convenience_store.csv", index=False, encoding='utf-8-sig')

와 같은 구조로 진행할 수 있다.

뭐 말이 길었지만 결국 이거 붙여넣고 API키 입력하면 잘 됩니다.

마무리

딱히 마무리로 할말은 없는데
API 막쏘다가 할당량 안넘치게만 조심하자.