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