
데이터 분석을 위한 데이터 스크래핑
✔️ XML 데이터 스크래핑
✔️ 공공데이터 API 활용 XML 데이터 스크래핑
✔️ XML 데이터 스크래핑
데이터 스크래핑_XML
xml : html처럼 태그 기반으로 자료를 저장한 포멧
xml parser를 통해서 str을 xml로 변환하는 작업이 필요
xml로 변환이 되면 태그 기반으로 자료를 찾아서 정리
태그에서 자료를 추출할 때는 beautifulsoup이라는 라이브러리를 이용
xml로 추출된 데이터 스크래핑 과정
xml로 데이터를 받으면 처음에는 단순 문자열을 받게됨
문자열을 xml 문서 변환 필요
beautifulsoup을 이용해 xml 문서로 변환
HTML과 XML 파일로부터 데이터를 뽑아내기 위한 파이썬 라이브러리
beautifulsoup의 메서드인 select, select_one을 이용
css 셀렉터 기반으로 데이터가 위치한 태그 찾아서 내용 추출
공공데이터 API 활용_서민금융상품기본정보 데이터 스크래핑
금융위원회_서민금융상품기본정보
서민금융진흥원에서 제공하는 서민금융상품 정보 서민금융진흥원에서 취급하는 대출상품, 자산형성상품, 사회적 금융 등에 대한 정보를 서민금융한눈에 오퍼레이션으로 제공한다.
www.data.go.kr
라이브러리 임포트 및 API 키 설정
import os import time import requests import pandas as pd decoding_key = 'Paste Your Key'
XML 데이터 요청 및 확인
# API URL 설정 및 파라미터 설정 (dataType을 'xml'로 변경) url = 'http://apis.data.go.kr/B551408/rent-loan-rate-info/rate-list' payload = dict(serviceKey=decoding_key, numOfRows=100, pageNo=1, dataType='xml') r_xml = requests.get(url,params=payload) # 요청 URL 및 상태 코드 출력 print(r_xml.url) print(r_xml.status_code) # r_xml에 할당된 데이터 확인 가능(주석 처리) # print(r_xml.text)
결과는 직접 해보시기 바랍니다. 결과는 데이터셋과 코드에 따라 달라질 수 있습니다.
BeautifulSoup 라이브러리 활용
Beautifulsoup : 문자열을 DOM TREE 구조로 변환
Beautifulsoup 라이브러리 활용
find, find all 함수 : xml, html 태그 기반으로 내용을 찾음
select, select_one 함수 : xml, hteml에서 css selector 기반으로 내용 찾음
find_all, select는 해당 태그나 css selector를 가진 부분을 모두 찾아서 list로 반환
find, select_one은 여러 태그나 css selector 중에서 가장 먼저 나오는 태그/selector를 한 개만 찾아줌찾아온 태그 .name : 태그 이름 반환찾아온 태그
. text, .string : 태그 안쪽의 텍스트 반환
BeautifulSoup을 이용한 XML 데이터 파싱
# BeautifulSoup 설치(주석 처리) # !pip install beautifulsoup4 # cmd > conda install beautifulsoup4 # BeautifulSoup 라이브러리 임포트 from bs4 import BeautifulSoup as bs # BeautifulSoup을 사용하여 XML 파싱 soup = bs(r_xml.text, 'xml') # print(soup)
결과는 직접 해보시기 바랍니다. 결과는 데이터셋과 코드에 따라 달라질 수 있습니다.
XML 데이터 추출_데이터 개별 수집
# XML 데이터에서 필요한 태그들을 선택하여 리스트에 저장 items = soup.select_one('items') bssYmdStart_list = items.select('bssYmdStart') interest4_1_list = items.select('interest4_1') interest3_2_list = items.select('interest3_2') interest4_2_list = items.select('interest4_2') interest2_1_list = items.select('interest2_1') interest1_2_list = items.select('interest1_2') interest3_1_list = items.select('interest3_1') interest2_2_list = items.select('interest2_2') interest1_1_list = items.select('interest1_1') bssYmdEnd_list = items.select('bssYmdEnd') organId_list = items.select('organId') callCenter_list = items.select('callCenter') # 추출된 데이터들을 리스트에 저장 tag_list = [bssYmdStart_list, interest4_1_list, interest3_2_list, interest4_2_list, interest3_1_list, interest2_2_list, interest1_1_list, bssYmdEnd_list, organId_list, callCenter_list] # 데이터를 딕셔너리 형태로 변환 result = {} for lists in tag_list: for item in lists: result.setdefault(item.name, []).append(item.text) # print(result) # 딕셔너리를 데이터프레임으로 변환 final_df = pd.DataFrame(result) final_df

XML 데이터 추출_반복문으로 태그 태그 자동 추출하여 데이터 수집
# XML 데이터에서 'item' 태그를 선택하여 데이터 추출 result = {} for item in soup.select('items'): for tags in item.select('item'): # print(tags) for tag in tags: result.setdefault(tag.name, []).append(tag.text) # print(result) # 추출된 데이터를 데이터프레임으로 변환 df = pd.DataFrame(result) df
결과는 직접 해보시기 바랍니다. 위 데이터프레임과 동일한 형식의 데이터프레임이 형성됩니다.
+
태그 이름 추출_set 활용
# XML 데이터에서 태그 이름 추출 tag_names = [] for items in soup.select('item'): for item in items: tag_names.append(item.name) # tag_names # 중복된 태그 이름 제거 및 확인 tags = set(tag_names) # tags
결과는 직접 해보시기 바랍니다. 결과는 데이터셋과 코드에 따라 달라질 수 있습니다.
✔️ 공공데이터 API 활용 XML 데이터 스크래핑
데이터 스크래핑_공공데이터 API(서민대출상품 금융상품 취급기관 정보 서비스)
공공데이터 API활용 XML 데이터 스크래핑 과정
1. 라이브러리 임포트 및 API 키 설정
2. XML 데이터 요청 및 확인
3. XML 데이터 파싱 및 모든 key 값 확인
3. 파싱된 XML 데이터를 데이터프레임으로 변환
4. 데이터 수집 자동화를 위한 페이지 처리
5. 전체 페이지 반복을 통한 전체 XML 데이터 수집 및 병합
6. 수집된 데이터를 데이터프레임으로 변환
서민금융진흥원_서민대출상품 취급기관 정보 서비스
서민금융진흥원의 대출상품취급기관 및 상품정보를 제공하는 API 서비스
www.data.go.kr
라이브러리 임포트 및 API 키 설정
import os import time import requests import pandas as pd from bs4 import BeautifulSoup as bs Decoding_Key = 'Paste Your Key'
XML 데이터 요청 및 확인
# API URL 설정 및 파라미터 설정 url = 'https://apis.data.go.kr/1160100/service/GetSmallLoanFinanceInstituteInfoService/getOrdinaryFinanceInfo' payload = dict(serviceKey=Decoding, numOfRows=100, pageNo=1, resultType='xml') r = requests.get(url, params = payload) # 요청 URL 및 상태 코드 출력 print(r.url) print(r.status_code) # print(r.text)
XML 데이터 파싱 및 모든 key 값 확인
# BeautifulSoup을 사용하여 XML 파싱 soup = bs(r.text, 'xml') # print(soup) # 모든 key 추출 tag_name = [] for items in soup.select('item'): # print(items) for item in items: # print(item.name) tag_name.append(item.name) tag_name = set(tag_name) # tag_name
결과는 직접 해보시기 바랍니다. 결과는 데이터셋과 코드에 따라 달라질 수 있습니다.
파싱된 XML 데이터를 데이터프레임으로 변환
# XML 데이터에서 필요한 정보 추출 및 데이터프레임으로 변환 result = {} for items in soup.select('items'): for item in items('item'): # print(item) for tag in item: # print(tag.name) if tag.name is None: continue result.setdefault(tag.name, []).append(tag.text) # print(result) result_df = pd.DataFrame(result) result_df
데이터 수집 자동화를 위한 페이지 처리
# 전체 데이터 개수 및 페이지 수 확인 for i in soup('totalCount'): n_count = i.text total_pages = (int(i.text)//100)+1 # print(n_count, total_pages)
결과는 직접 해보시기 바랍니다. 결과는 데이터셋과 코드에 따라 달라질 수 있습니다.
전체 페이지 반복을 통한 전체 XML 데이터 수집 및 병합
import time # API URL 설정 및 파라미터 설정 url = 'https://apis.data.go.kr/1160100/service/GetSmallLoanFinanceInstituteInfoService/getOrdinaryFinanceInfo' payload = dict(serviceKey=Decoding, numOfRows=1, pageNo=1, resultType='xml') # XML 데이터 추출 및 파싱 수행 r = requests.get(url, params=payload) soup = bs(r.text, 'xml') # 전체 데이터 수와 전체 페이지 수 확인 total_counts = int(soup.find('totalCount').text) total_pages = (total_counts // 100) + 1 print(f"총 데이터: {total_counts}, 총 페이지: {total_pages}") # 최종적으로 수집된 데이터를 딕셔너리 형태로 page_xml에 할당 page_xml = {} page = 1 nums = 100 # while 반복문 통해 전체 페이지의 데이터 수집 while True: print(f"{page}/{total_pages} 수집중", end='\r') if page == total_pages: nums = total_counts - (page - 1) * 100 payload = dict(serviceKey=Decoding, numOfRows=nums, pageNo=page, resultType='xml') r = requests.get(url, params=payload) soup = bs(r.text, 'xml') # 딕셔너리 형태의 데이터로 page_xml에 할당 for items in soup.select('items'): for item in items('item'): for tag in item: if tag.name is None: continue page_xml.setdefault(tag.name, []).append(tag.text) # 전체 데이터보다 페이지 * 수집하는 데이터 수가 크다면 종료 # 아닌 경우는 page에 +1씩 수행 if page * 100 >= total_counts: break page += 1 # 너무 빠르게 수집하지 않도록 시간 조정 time.sleep(1) # 최종적으로 수집된 데이터 페이지 확인 print(f"\n수집 완료: {total_pages} 페이지")
결과는 직접 해보시기 바랍니다. 결과는 데이터셋과 코드에 따라 달라질 수 있습니다.
수집된 데이터를 데이터프레임으로 변환
df_loan_info = pd.DataFrame(page_xml) df_loan_info

이번 내용에서는 XML 데이터 스크래핑 및 공공데이터 API 활용 XML 데이터 스크래핑에 대해 알아보았습니다.
파이썬(Python)을 활용한 데이터 스크래핑을 공부하고 정리해 나갈 예정이니,
파이썬으로 데이터 스크래핑을 공부하는데 도움이 되었으면 좋겠습니다.
데이터 분석과 관련된 다양한 정보들이 확인하고 싶다면
관심 있는 분들은 방문해서 좋은 정보 얻어가시길 바랍니다.
ECODATALIST
데이터 분석 공부 열심히 하는 중😁
everyonelove.tistory.com
'Python > 데이터 분석을 위한 데이터 스크래핑' 카테고리의 다른 글
[Python] 데이터 스크래핑_ 공공데이터 API 신청 및 공공데이터 API 활용 데이터 스크래핑 (0) | 2025.04.06 |
---|---|
[Python] 데이터 스크래핑_requests 모듈을 사용한 네이버 API 활용 데이터 스크래핑 (0) | 2025.04.03 |
[Python] 데이터 스크래핑_네이버 API 신청 및 네이버 API 활용 데이터 스크래핑 (1) | 2025.04.02 |