이번 시간에는 데이터 엔지니어로서 꼭 해야하는 데이터 수집, 처리, 적재
ETL( Extract , Transform , Load )에 대하여 알아봅시다.

데이터 추출을 위해 NAVER Devoloper 에서 api 를 빌려올 예정입니다.
NAVER Devoloper API 사용법
1. NAVER Devoloper 입장
https://developers.naver.com/main/
NAVER Developers
네이버 오픈 API들을 활용해 개발자들이 다양한 애플리케이션을 개발할 수 있도록 API 가이드와 SDK를 제공합니다. 제공중인 오픈 API에는 네이버 로그인, 검색, 단축URL, 캡차를 비롯 기계번역, 음
developers.naver.com
2. NAVER Devoloper 로그인

3. Application > 애플리케이션 등록

4. 애플리케이션 등록하기

이름 : 자유롭게 설정
사용 API : 검색
환경추가 : WEB 생성
웹 서비스 URL : http://127.0.0.1
http://127.0.0.1 는 로컬환경입니다.
이렇게 설정하고 '등록하기' 버튼 클릭합니다.
5. Application > 내 애플리케이션
거기에 생성된 애플리케이션을 클릭해보시면 아래와 같은 화면이 나옵니다.

주의! 해당 정보는 아무에게도 알려주시면 안됩니다!
이렇게 하면 API 사용 준비 완료입니다.
구글 코랩에서 ETL 적용해보기
1. 보안 비밀 등록하기
아래와 같이 열쇠 모양 버튼을 누르면 보안 비밀을 등록할 수 있습니다.
위에서 발급받은 Client ID, Client SECRET 을 저장하면 됩니다.
저는 NAVER_CLIENT_ID, NAVER_CLIENT_SECRET 으로 저장했습니다.
그리고 친절하게도 아래 저 키를 사용하는 방법을 알려주었네요!

from google.colab import userdata
userdata.get('secretName')
코드에 위의 내용을 넣으면 된다는 거겠죠? (밑에도 있으니까 걱정마세요!)
2. Extract (추출): API에서 데이터 가져오기
가장 먼저 할 일은 네이버 검색 API를 통해 원하는 키워드의 뉴스 데이터를 가져오는 것입니다.
이때 중요한 것은 발급받은 API Key(Client ID, Secret)의 보안입니다. 소스 코드에 키를 직접 노출하는 것은 위험하므로,
환경 변수나 Google Colab의 userdata 기능을 활용하여 안전하게 불러오는 것이 좋습니다.
import os
import urllib.request
import json
from google.colab import userdata
# 안전하게 API 키 획득
NAVER_CLIENT_ID = userdata.get('NAVER_CLIENT_ID')
NAVER_CLIENT_SECRET = userdata.get('NAVER_CLIENT_SECRET')
이제 특정 키워드를 검색해서 결과를 가져오는 함수를 만들어보겠습니다.
네이버 API는 JSON 형식으로 데이터를 응답해주기 때문에,
파이썬에서 다루기 쉽도록 딕셔너리(dict) 형태로 바로 변환(역직렬화)해 주는 것이 효율적입니다.
def news_extract_ex(keyword: str) -> dict:
# 1. 한글 검색어 인코딩 처리 (%D%21%A...)
encText = urllib.parse.quote(keyword)
url = f"https://openapi.naver.com/v1/search/news.json?query={encText}"
# 2. 요청 객체 생성 및 헤더 세팅 (권한 인증)
request = urllib.request.Request(url)
request.add_header("X-Naver-Client-Id", NAVER_CLIENT_ID)
request.add_header("X-Naver-Client-Secret", NAVER_CLIENT_SECRET)
# 3. API 요청 및 응답 코드 확인
response = urllib.request.urlopen(request)
rescode = response.getcode()
if rescode == 200:
# 역직렬화: JSON 문자열을 파이썬 딕셔너리 객체로 즉시 변환
return json.load(response)
else:
print(f"Error Code: {rescode}")
return {}
# 검색어 입력 및 데이터 추출
results = news_extract_ex(input('검색어 입력 (예: 테슬라): '))
💡 핵심 지식: 통신을 통해 넘어오는 JSON 데이터는 본질적으로 '문자열'입니다. 이를 파이썬이 이해할 수 있는 딕셔너리 구조로 바꾸는 과정을 '역직렬화(Deserialization)'라고 부르며, json.load() 함수가 이 역할을 깔끔하게 수행합니다.
데이터는 아래와 같이 나옵니다! results에 담아줍니다.
(dict,
{'lastBuildDate': 'Wed, 08 Jul 2026 15:41:40 +0900',
'total': 569783,
'start': 1,
'display': 10,
'items': [{'title': 'LG엔솔, ESS·<b>테슬라</b> 효과에 매출 7조…하반기 반등 기대',
'originallink': 'http://www.thebigdata.co.kr/view.php?ud=2026070813421592570ecbf9426b_23',
'link': 'http://www.thebigdata.co.kr/view.php?ud=2026070813421592570ecbf9426b_23',
'description': '<b>테슬라</b>의 유럽 판매 호조와 리비안향 46시리즈 원통형 배터리 공급 확대, 르노·폭스바겐의 보급형... LG에너지솔루션은 최근 DTE에너지와 한화큐셀 ESS 공급 계약을 체결한 데 이어 <b>테슬라</b>와 43억달러 규모 LFP 배터리... ',
'pubDate': 'Wed, 08 Jul 2026 15:38:00 +0900'},
{'title': '머스크 “xAI, 9일 그록 4.5 공개”',
'originallink': 'https://www.tokenpost.kr/news/breaking/375922',
'link': 'https://www.tokenpost.kr/news/breaking/375922',
'description': '일론 머스크 <b>테슬라</b> 최고경영자가 xAI의 인공지능 모델 그록 4.5를 대중에 공개할 예정이라고 밝혔다. 오데일리에 따르면 머스크는 xAI가 9일 그록 4.5를 일반에 공개한다고 말했다. 그록은 머스크가 이끄는 xAI의... ',
'pubDate': 'Wed, 08 Jul 2026 15:32:00 +0900'},
.
.
.
.
3. Transform (변환): 데이터 정제 및 DataFrame 구성
데이터를 무사히 가져왔지만, 출력해 보면 제목이나 내용에 <b>테슬라</b> 같은 HTML 강조 태그나 & 같은 특수문자 이스케이프 코드가 섞여 있어 지저분합니다.
이러한 노이즈를 제거하는 데이터 클리닝(정제) 과정을 거쳐야 비로소 분석 가능한 데이터가 됩니다. html 모듈과 정규표현식(re) 모듈을 결합하여 강력한 정제 함수를 만들어 보겠습니다.
import html
import re
import pandas as pd
# HTML 태그를 찾아내는 정규표현식 패턴 (대소문자 무시)
pattern = re.compile("<[a-z0-9]+>|</[a-z0-9]+>", re.IGNORECASE)
def clean(src: str) -> str:
# 1. HTML 엔티티(& " 등)를 원래 문자로 복원
src = html.unescape(src)
# 2. 정규식을 활용하여 <b>, </b> 같은 태그를 빈 문자열로 대체(제거)
src = pattern.sub("", src)
return src
# 리스트 컴프리헨션을 활용한 깔끔한 데이터 재구성
news = [
{
'title': clean(item['title']),
'description': clean(item['description']),
'pubDate': item['pubDate']
}
for item in results.get('items', [])
]
# 파이썬 딕셔너리 리스트를 Pandas DataFrame으로 변환
df = pd.DataFrame.from_dict(news)
# 정제된 데이터 확인
print(df.sample(2))
💡 핵심 지식: re.compile()을 사용해 정규식 패턴을 미리 컴파일해 두면, 반복문 안에서 텍스트를 검사할 때 처리 속도가 훨씬 빨라집니다. 대량의 텍스트 데이터를 전처리할 때 반드시 알아두어야 할 최적화 기법입니다.
확실히 데이터가 깔끔해 졌죠???
[{'title': 'LG엔솔, ESS·테슬라 효과에 매출 7조…하반기 반등 기대',
'description': '테슬라의 유럽 판매 호조와 리비안향 46시리즈 원통형 배터리 공급 확대, 르노·폭스바겐의 보급형... LG에너지솔루션은 최근 DTE에너지와 한화큐셀 ESS 공급 계약을 체결한 데 이어 테슬라와 43억달러 규모 LFP 배터리... ',
'pubDate': 'Wed, 08 Jul 2026 15:38:00 +0900'},
{'title': '머스크 “xAI, 9일 그록 4.5 공개”',
'description': '일론 머스크 테슬라 최고경영자가 xAI의 인공지능 모델 그록 4.5를 대중에 공개할 예정이라고 밝혔다. 오데일리에 따르면 머스크는 xAI가 9일 그록 4.5를 일반에 공개한다고 말했다. 그록은 머스크가 이끄는 xAI의... ',
'pubDate': 'Wed, 08 Jul 2026 15:32:00 +0900'},
4. Load (적재): 파일로 영구 저장하기
이제 예쁘게 표 형태로 정리된 DataFrame을 로컬 환경이나 스토리지에 저장할 차례입니다.
가장 널리 쓰이는 형태인 CSV 파일로 내보내겠습니다.
# DataFrame을 CSV 파일로 저장
df.to_csv('tesla_news.csv', index=False, encoding='utf-8-sig')
💡 핵심 지식: index=False 옵션을 주면 DataFrame의 기본 숫자 인덱스(0, 1, 2...)가 파일에 저장되지 않아 데이터가 더 깔끔해집니다. 또한 한글 데이터가 포함된 경우 엑셀에서 열었을 때 글자가 깨지지 않도록 encoding='utf-8-sig' 옵션을 추가하는 것을 적극 권장합니다.
여기까지 파이썬과 네이버 API를 활용한 기본적인 ETL 파이프라인 구축 과정이었습니다.
이 코드를 응용하여 스케줄러(Cron, Airflow 등)와 결합하면, 매일 특정 시간마다 관심 종목의 뉴스를 자동으로 수집하고 저장하는 훌륭한 자동화 봇을 완성하실 수 있습니다!
오늘의 한 마디
나에게 소중한 사람과 어떠한 일이 발생하더라도 잘 해결해나가면 된다고 생각합니다. 그러니까 그 문제 혹은 발생한 일을 해결하는 재미가 있다고 생각하면서 해결해 나가면 조금 더 수월하게 해결할 수 있다고 생각합니다.
그 문제에 있어서도 내가 통제할 수 없는 것과 통제할 수 있는 것에 대해 생각하면서 통제할 수 있는 것을 최선을 다해 하고 그 뒤의 결과를 많은 걱정을 하지 않고 기다려보면 좋지 않을까 싶어요.
'코딩 개발 > Python' 카테고리의 다른 글
| Python - 데이터수집처리 (feat. 네이버 finance 환율) 2 (0) | 2026.07.27 |
|---|---|
| Python - 데이터수집처리 (feat. 네이버 finance 환율) 1 (0) | 2026.07.24 |
| Python - 모듈 (from, import) (0) | 2026.07.22 |
| Python - 함수 지향적 프로그래밍(feat. 숫자 맞추기 게임) (1) | 2026.07.21 |
| Python - 함수의 종류와 활용법 (0) | 2026.07.20 |