티스토리 뷰
1. 공공데이터포털에서 오픈 API를 이용해 XML형식의 데이터를 받음.
2. 받은 xml파일을 pd.read_xml을 사용해 dataframe으로 바꿈.
<오픈 API 활용신청>
1. 공공 데이터 포털 접속
사이트 주소: https://www.data.go.kr/index.do
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)
'pandas' 카테고리의 다른 글
건강보험심사평가원_의약품사용정보조회서비스_약효분류군별 지역별 사용량 목록조회 (0) | 2023.04.06 |
---|---|
split과 join을 이용해 문자열 자른 뒤 합치기(apply, lambda, axis) (0) | 2022.11.26 |
영업일(bdate_range, is_busday, weekmask) (0) | 2022.07.15 |
pd.to_datetime, strptime, strftime, (0) | 2022.07.15 |
group by 후 custom된 집계함수 사용 (0) | 2022.06.16 |
- Total
- Today
- Yesterday