티스토리 뷰

1. 공공데이터포털에서 오픈 API를 이용해 XML형식의 데이터를 받음.

2. 받은 xml파일을 pd.read_xml을 사용해 dataframe으로 바꿈.

<오픈 API 활용신청>

1. 공공 데이터 포털 접속

사이트 주소: https://www.data.go.kr/index.do

 

공공데이터 포털

국가에서 보유하고 있는 다양한 데이터를『공공데이터의 제공 및 이용 활성화에 관한 법률(제11956호)』에 따라 개방하여 국민들이 보다 쉽고 용이하게 공유•활용할 수 있도록 공공데이터(Datase

www.data.go.kr

2. 원하는 공공데이터 검색

3. 오픈 API 탭 선택

4. 활용 신청

원하는 오픈 API에 들어가 '활용 신청' 버튼 클릭

이 글에서는 건강보험심사평가원_요양기관개폐업정보조회서비스를 기준으로 함. (링크: https://www.data.go.kr/data/15051043/openapi.do)

 

해당 데이터는 건강보험사평가원에서 제공하는 데이터로 최근 1년 간의 요양기관(병원/약국) 개폐업 정보를 확인 할 수 있음. 

요청변수는 위와 같은데 위 조건들을 입력해 원하는 데이터를 받아 올 수 있음.

출력결과는 위와 같은데 위 항목에 해당하는 데이터를 받을 수 있다는 뜻.

제공된 python sample code는 위와 같음. 위 sample 코드를 활용해 목적에 맞게 사용하면 됨.

5. 활용신청현황

우측 상단 마이페이지 버튼을 눌러 마이페이지에 접속.

왼쪽 데이터 활용 > Open API > 활용신청 현황으로 활용신청 현황 페이지 접속.

건강보험심사평가원_요양기관개폐업정보조회서비스 클릭.

6. 개발계정 상세보기

활용신청 상세기능정보에 원하는 조건을 넣어 미리보기도 할 수 있음.

xml 형식의 데이터 확인 가능. 

 

 

<Python 으로 API 호출하기>

1. requests 사용해 api 호출

서비스 정보 - 일반 인증키 (Decoding)에 적힌 문자를 복사한 뒤

아래 코드의 serveiceKey = "" 라고 되어 있는 line의 "" 안에 붙여 넣기함. 

# Python3 샘플 코드 #


import requests

serviceKey = ""  # 일반 인증키 (Decoding)

url = 'http://apis.data.go.kr/B551182/yadmOpCloInfoService/getHospPharmacyOpCloList'
params ={'serviceKey' : serviceKey, 'numOfRows' : '10', 'pageNo' : '1', 'crtrYm' : '202303', 'yadmTp' : '1', 'opCloTp' : '2' }

response = requests.get(url, params=params)
# print(response.content)  # bytes 형태여서 보기 힘듦.
content = response.content.decode('utf-8')  # utf-8로 디코딩함. 
print(content)

 

실행 시키면 아까 미리보기 했던 데이터와 동일한 결과를 출력해 볼 수 있음.

 

 

<xml문서를 dataframe으로 바꾸기>

방법1. pandas.read_xml 이용

xml 파일을 파싱해서 dataframe으로 만드는 가장 쉬운 방법은 pandas의 read_xml라이브러리를 사용하는 것. 

공식 문서: https://pandas.pydata.org/docs/reference/api/pandas.read_xml.html

# Python3 샘플 코드 #


import requests
import pandas as pd  # 추가된 코드

serviceKey = ""  # 일반 인증키 (Decoding)

url = 'http://apis.data.go.kr/B551182/yadmOpCloInfoService/getHospPharmacyOpCloList'
params ={'serviceKey' : serviceKey, 'numOfRows' : '10', 'pageNo' : '1', 'crtrYm' : '202303', 'yadmTp' : '1', 'opCloTp' : '2' }

response = requests.get(url, params=params)
pd.read_xml(response.content, xpath=".//item")  # 추가된 코드

item 태그 안에 있는 데이터를 가져와야하기 때문에 xpath=".//item" 라고 적음. 

 

결과 df. 

 

방법2. beautifulSoup 이용

1. item 태그 추출

# Python3 샘플 코드 #


import requests
import pandas as pd

serviceKey = ""  # 일반 인증키 (Decoding)

url = 'http://apis.data.go.kr/B551182/yadmOpCloInfoService/getHospPharmacyOpCloList'
params ={'serviceKey' : serviceKey, 'numOfRows' : '10', 'pageNo' : '1', 'crtrYm' : '202303', 'yadmTp' : '1', 'opCloTp' : '2' }

response = requests.get(url, params=params)

# 여기부터 새로 추가된 코드.
import bs4

xml_obj = bs4.BeautifulSoup(content,'lxml-xml')
rows = xml_obj.findAll('item')
print (len(rows))
print(rows[0])

태그 추출을 위해 bs4의 BeautifulSoup 사용.

findAll을 사용해 'item'에 해당되는 모든 태그를 리스트로 리턴 받음.

rows는 총 10개의 bs4.element.Tag가 들어있는 리스트.

rows가 10개인 이유는 request parameter에 numOfRows를 10으로 설정해서 10개의 아이템만 받음.

첫번째 row만 출력해서 내용을 확인해 봄. type은 bs4.element.Tag임.

2. xml-> dict -> dataframe으로 저장

import pandas as pd
df = pd.DataFrame()

# xml 안의 데이터 수집
for row in rows:
    result_set = row.find_all()  # 모든 태그들이 result_set에 저장됨.
    tmp_dict = dict()
    for result in result_set:
        tmp_dict[result.name] = result.text  # {태그이름:태그값} 형태의 dict
    # df = df.append(tmp_dict, ignore_index=True)  # 그냥 이렇게 해도 되는데 warning이 신경쓰인다면 아래 두 줄 사용. 
    tmp_dict_df = pd.DataFrame([tmp_dict])
    df = pd.concat([df, tmp_dict_df], ignore_index=True)

 

방법1에서 사용했던 pandas.read_xml과 동일한 결과의 데이터프레임을 얻을 수 있음. 

 

 

다음 게시글은 이렇게 저장된 데이터 프레임을 db 로 insert 하는 방법. (feat. pymysql)

그리고 process spawning을 사용해 한 번에 더 많이 api를 호출하는 방법. (feat. multiprocessing)

그리고 수집한 데이터 배포하기 (feat.streamlit)

댓글
Total
Today
Yesterday
공지사항
최근에 올라온 글
글 보관함