728x90
반응형
저번 시간에 이어서 이제 위에 있는 메타 정보를 가져와보겠습니다.
https://pabeba.tistory.com/276

1. 메타 정보 추출 목적
개별 통화의 환율 데이터(매매기준율, 미화환산율 등)만으로는 해당 데이터의 기준 시점과 제공처를 정확히 식별할 수 없습니다. 데이터의 무결성과 시계열 분석을 보장하기 위해 기준 시간, 고시 은행, 고시 회차와 같은 메타 정보(Meta Data)를 별도로 추출하여 개별 데이터 셋에 병합해야 합니다.
2. Part 1: 타겟 사이트 접속 (요청 및 응답)
환율 상세 정보와 메타 정보가 존재하는 페이지가 다를 경우,
메타 정보를 제공하는 별도의 URL에 HTTP GET 요청을 보내 HTML 응답을 획득해야 합니다.
import urllib.request as req
from bs4 import BeautifulSoup
# 메타 정보 제공 타겟 URL
TARGET_SITE_META = "https://finance.naver.com/marketindex/"
# HTTP 요청 및 응답 획득
res_meta = req.urlopen(TARGET_SITE_META)
3. Part 2: 데이터 파싱 및 CSS Selector 추출
응답받은 HTML 스트림을 html5lib 파서를 이용해 DOM Tree로 객체화합니다. 이후 브라우저의 개발자 도구를 통해 식별한 CSS Selector를 적용하여 필요한 텍스트 노드를 추출합니다.
# DOM Tree 구성
soup_meta = BeautifulSoup(res_meta, "html5lib")
# CSS Selector를 이용한 메타 정보 단일 객체 추출
# .date : 고시 시간
# .standard : 고시 은행 (기준)
# .round > em : 고시 회차 (자식 선택자를 이용해 em 태그 내부 텍스트 지정)
ex_date = soup_meta.select_one('.date').string
ex_std = soup_meta.select_one('.standard').string
ex_round = soup_meta.select_one('.round > em').string
print(f"시간: {ex_date}, 은행: {ex_std}, 회차: {ex_round}")
추가 지식:
- 단일 요소 탐색: .select_one()은 조건에 부합하는 최초의 요소 단 하나만 반환합니다. 메타 정보는 페이지 내에 유일하게 존재하므로, 전체 목록을 리스트로 반환하는 .select() 대신 .select_one()을 사용하는 것이 메모리와 속도 측면에서 효율적입니다.
- 텍스트 추출 속성: 요소 내부의 텍스트를 가져오기 위해 .string 속성을 사용했습니다. 단, 해당 태그 내부에 다른 자식 태그가 복잡하게 중첩되어 있을 경우 .string은 None을 반환합니다. 이 경우에는 하위 태그를 무시하고 텍스트만 결합하여 추출하는 .text (또는 .get_text()) 속성을 대안으로 사용해야 합니다.
4. 최종 자료구조 반영 (Transform 단계)
프로그램의 실행 절차상 공통 적용되는 메타 정보를 먼저 1회 획득한 후, 개별 통화 정보(exchanges 리스트)를 구성할 때 이를 일괄 반영하는 구조가 합리적입니다.
통화의 개수만큼 메타 정보를 중복 수집하는 것은 서버와 네트워크 리소스의 낭비입니다.
(이전 시간에 생성된 데이터에 메타 정보 추가)
# 기존 통화 정보 딕셔너리에 메타 정보 키-값 쌍을 추가하는 함수
def update_ex(exchange):
exchange['시간'] = ex_date
exchange['은행'] = ex_std
exchange['회차'] = ex_round
return exchange
# 리스트 컴프리헨션을 통한 일괄 업데이트 (Transform 적용)
final_exchanges = [
update_ex(ex)
for ex in exchanges
]
추가 지식:
- ETL 관점의 해석: 위 코드는 추출된 개별 데이터에 공통 기준값을 부여하여 구조를 정제하는 과정이므로 ETL 파이프라인의 Transform(변환) 단계에 속합니다.
- 리스트 내포(List Comprehension) 활용: 반복문(for) 내에서 별도의 리스트 append() 메서드를 호출하는 대신, 리스트 컴프리헨션 내부에서 업데이트 함수(update_ex)를 호출하는 방식은 연산 속도가 빠르고 코드가 간결해집니다.
- 이후 최종적으로 생성된 final_exchanges 리스트 객체를 Pandas DataFrame으로 변환하여 .to_csv()로 저장하거나 관계형 데이터베이스(RDBMS)에 Insert 하면 파이프라인의 Load(적재) 단계가 완료됩니다.
반응형
'코딩 개발 > Python' 카테고리의 다른 글
| Python - 웹 스크래핑 (feat.Selenium, 오피넷(Oil Price Information Network)) (0) | 2026.07.29 |
|---|---|
| Python - 데이터수집처리 (적재) 3 (0) | 2026.07.28 |
| Python - 데이터수집처리 (feat. 네이버 finance 환율) 1 (0) | 2026.07.24 |
| Python - 데이터 수집, 처리, 적재 (ETL) (feat. NAVER Developer 어플리케이션 사용 법, Google Colab에서 API 사용) (1) | 2026.07.23 |
| Python - 모듈 (from, import) (0) | 2026.07.22 |