단일 지표 하나를 크롤링하는 것을 넘어, 이제 여러 관심 종목의 데이터를 한 번에 수집하고 실무에 쓸 수 있도록 '깨끗하게 정제'하는 단계로 넘어갑니다.
웹 크롤링 실무에서 가장 많이 부딪히는 장벽은 두 가지입니다. 첫째, 한두 개가 아닌 수십 개의 종목 데이터를 반복해서 가져와야 할 때 코드가 지저분해지는 문제. 둘째, 기껏 가져온 데이터에 불필요한 공백이나 줄바꿈 표기가 섞여 있어 엑셀이나 계산식에 바로 적용할 수 없는 전처리 문제입니다.
이번 글에서는 Requests와 BeautifulSoup의 정확한 역할 분담을 이해하고, 파이썬의 반복문(for)과 문자열 정제 함수를 활용해 이 두 가지 실무 장벽을 한 번에 해결하는 방법을 알아봅니다.
1. Requests와 BeautifulSoup: 조달과 가공의 분업
코드를 작성하기 전, 두 라이브러리의 역할을 명확히 분리해서 이해해야 오류를 빠르게 잡을 수 있습니다.
Requests (원자재 조달 파트): 특정 URL에 접속해 웹페이지의 전체 HTML 소스 코드를 통째로 가져옵니다. 이때 가장 중요한 것은 '응답 상태 코드(Status Code)'를 확인하는 것입니다.
response.status_code를 출력했을 때 200이 나오면 정상 접속, 404나 500이 나오면 주소가 틀렸거나 서버에 문제가 있다는 뜻입니다. 여기서 에러가 났다면 BeautifulSoup 코드는 볼 필요도 없이 URL이나 네트워크 상태를 점검해야 합니다.BeautifulSoup (원자재 가공 파트): Requests가 던져준 방대한 HTML 텍스트 더미를 파이썬이 검색하기 쉬운 구조로 변환(Parsing)합니다. 이후
.select()나.select_one()메서드를 사용해 우리가 원하는 특정 태그(예: id, class)안의 데이터만 예쁘게 도려냅니다.
2. 실전 코드: 여러 종목의 현재가 연속 크롤링
관심 종목이 삼성전자, SK하이닉스, 현대차 3개라고 가정해 보겠습니다. 종목마다 코드를 따로 짤 필요 없이, 종목 코드 6자리만 리스트로 만들어 파이썬의 for 반복문에 던져주면 코드가 획기적으로 짧아집니다.
import requests
from bs4 import BeautifulSoup
import time
# 1. 관심 종목 코드 리스트 (삼성전자, SK하이닉스, 현대차)
item_codes = ['005930', '000660', '005380']
for code in item_codes:
# 2. 종목 코드를 URL에 결합하여 접속
url = f"https://finance.naver.com/item/main.naver?code={code}"
response = requests.get(url)
# 정상 접속(200)인 경우만 데이터 추출 진행
if response.status_code == 200:
soup = BeautifulSoup(response.text, 'html.parser')
# 3. 현재가 추출 (네이버 금융 종목 홈 기준)
price_tag = soup.select_one('.no_today .blind')
if price_tag:
price = price_tag.text
print(f"종목코드 {code} 현재가: {price}")
else:
print(f"종목코드 {code} 접속 실패")
# 4. 서버 과부하 방지를 위한 딜레이 (필수)
time.sleep(1)
이 코드를 실행하면 리스트에 담긴 종목 수십 개라도 순식간에 순회하며 현재가를 출력해 냅니다. 기업 재무제표 엑셀 양식을 채우기 위해 수작업으로 검색하던 시간을 0으로 만드는 핵심 로직입니다.
3. 실무 팁: 지저분한 공백과 쉼표 제거 (데이터 전처리)
크롤링을 하다 보면 추출한 텍스트에 \n (줄바꿈), \t (탭 공백) 같은 불순물이 섞여 나오는 경우가 매우 흔합니다. 또한 '80,000'처럼 금액에 쉼표(,)가 포함되어 있으면 파이썬은 이를 숫자가 아닌 단순 '글자'로 인식하여 사칙연산이나 통계 분석을 할 수 없습니다.
이를 해결하기 위해 추출 직후 문자열을 정제하는 습관을 들여야 합니다.
.strip(): 텍스트 앞뒤의 무의미한 공백과 줄바꿈을 모두 날려버립니다..replace(',', ''): 텍스트 내의 쉼표를 찾아 공백 없는 상태로 교체(제거)합니다.
위 코드의 price = price_tag.text 부분을 실무형으로 바꾸면 다음과 같습니다.
price = price_tag.text.strip().replace(',', '')
이제 ' 80,000 \n' 이었던 데이터가 '80000'이라는 깔끔한 숫자로 떨어집니다. 이 상태가 되어야 다음 단계에서 데이터를 엑셀로 보내거나 수익률 계산에 활용할 수 있습니다.
4. 예외 상황 및 주의사항
타임아웃(Timeout) 설정: 대상 웹사이트 서버가 느려져 응답이 오지 않으면 파이썬 스크립트 전체가 멈춰버립니다. 실무에서는
requests.get(url, timeout=5)처럼 5초 이상 응답이 없으면 에러를 뱉고 다음 작업으로 넘어가도록 설정하는 것이 안전합니다.예외 처리(Try-Except): 웹사이트 구조가 일시적으로 바뀌어
.select_one()이 데이터를 찾지 못하면None을 반환하고 프로그램이 강제 종료됩니다. 이를 막기 위해 데이터가 없을 경우 "데이터 없음"을 출력하고 다음 종목으로 넘어가도록 방어용 코드를 짜는 것이 좋습니다.
[핵심 요약]
여러 종목의 데이터를 수집할 때는 종목 코드만 리스트로 묶어
for반복문으로 순회하면 코드를 간결하게 유지할 수 있습니다.Requests로 가져온
status_code가 200인지 먼저 확인하는 것이 크롤링 오류를 잡는 첫 단추입니다.추출한 문자열은 반드시
.strip()과.replace(',', '')를 사용해 불필요한 공백과 쉼표를 제거해야 온전한 데이터 분석이 가능합니다.
[다음 편 예고] 5편에서는 이렇게 수집하고 정제한 데이터를 본격적으로 요리하는 마법의 도구, 'Pandas 라이브러리 기초 입문'을 다룹니다. 파이썬 메모리 상에 존재하는 데이터를 엑셀 표(DataFrame)처럼 깔끔하게 구조화하는 방법을 구체적인 예제와 함께 알아보겠습니다.
[궁금한 점이 있으신가요?]
오늘 다룬 strip()이나 replace() 외에, 데이터를 크롤링했을 때 원하지 않는 특수문자나 텍스트가 섞여 나와 처리가 곤란했던 경험이 있으신가요?
0 댓글