Skip to main content
  1. Posts/
  2. ETC/

파이썬 API 설명

·527 words·3 mins
Jiho Kim
Author
Jiho Kim
달려 또 달려

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 막쏘다가 할당량 안넘치게만 조심하자.