웹 스크래핑은 이제 영업, 운영, 시장 조사를 하는 사람이라면 꼭 갖춰야 할 핵심 역량이 됐어요. 웹 데이터의 양은 폭발적으로 늘고 있어요. 전 세계 데이터 생성량은 2019년부터 2023년까지 거의 193% 증가했어요. 기업의 81%가 데이터를 의사결정의 "핵심"으로 본다는 것도 당연해요. 문제는 조직의 95%가 비정형 데이터, 그러니까 지저분한 HTML 같은 걸 다루는 게 큰 도전이라고 답한다는 점이에요. 웹사이트 정보를 스프레드시트로 옮기느라 복붙 마라톤에 빠진 팀, 저도 정말 많이 봤어요. 보기 좋은 광경은 아니죠.
AI를 사용해 어떤 웹사이트든 데이터 추출 Get Started Free
이럴 때 Python의 BeautifulSoup가 등장해요. 이 실전 튜토리얼에서는 웹 스크래핑에 BeautifulSoup를 어떻게 쓰는지 단계별로 보여드릴게요. 바로 응용할 수 있는 Python Beautiful Soup 예제도 함께 다뤄요. 그리고 저는 늘 더 열심히보다 더 똑똑하게 일하는 쪽을 택하니까, BeautifulSoup를 Thunderbit — 저희 AI 웹 스크래퍼 — 와 함께 써서 워크플로를 더 빠르게 만들고 더 깔끔한 구조화 데이터를 얻는 방법도 보여드릴게요. 코딩 실력과 상관없이요.
BeautifulSoup는 무엇이고, 웹 스크래핑에 왜 쓸까요?
기본부터요. BeautifulSoup는 HTML과 XML 문서를 쉽게 파싱하게 해주는 Python 라이브러리예요. 웹페이지의 "태그 덩어리"를 탐색 가능한 트리로 바꿔 주는 번역기라고 보면 돼요. 그래서 필요한 데이터를 찾고, 추출하고, 수정하기가 훨씬 쉬워져요. 이 프로젝트는 지금도 활발히 유지보수되고 있고, beautifulsoup4 4.14.3이 2025년 말 PyPI에 올라왔어요. 여기서 배우는 내용은 여전히 최신이라고 봐도 돼요. 이커머스 사이트에서 가격을 가져오든, 뉴스 헤드라인을 모으든, 영업 리드를 찾으려 비즈니스 디렉터리를 스크래핑하든, BeautifulSoup는 웹페이지를 구조화된 실행 가능한 데이터로 바꾸는 데 가장 많이 쓰이는 도구예요.
왜 이렇게 인기일까요? 우선 초보자도 쉽게 접근할 수 있어요. 엉망인 HTML에도 관대하고(솔직히 웹은 그런 경우가 많죠), Python다운 문법 덕분에 몇 줄만으로 스크래핑을 시작할 수 있어요. 다운로드 수가 수백만 회에 커뮤니티도 거대해서, 막히면 검색 한 번에 답을 찾아요.
BeautifulSoup의 대표 활용 사례는 이래요.
- 이커머스 페이지에서 상품명, 가격, 평점 추출하기
- 뉴스 사이트에서 헤드라인, 작성자, 발행일 가져오기
- 표나 디렉터리(회사 목록, 연락처 목록 등) 파싱하기
- 목록형 사이트에서 이메일이나 전화번호 수집하기
- 업데이트(가격 변동, 신규 채용 공고 등) 모니터링하기
데이터가 정적 HTML 안에 있다면, BeautifulSoup는 웹 스크래핑에서 가장 든든한 친구예요.
웹 스크래핑에서 BeautifulSoup가 가진 강점
Python 웹 스크래핑 라이브러리는 정말 많아요. 그런데 왜 BeautifulSoup일까요? 경쟁 도구와 비교하면 이래요.
- 간단함: 가볍고 배우기 쉬워요. 거대한 프레임워크를 세팅하거나 긴 보일러플레이트를 쓸 필요가 없어요. 빠르게 한 번 처리하는 작업이나 막 시작한 초보자에게 딱이에요.
- 관대함: 깨졌거나 형식이 엉망인 HTML도 처리해요. 생각보다 자주 마주치는 상황이죠.
- 유연성: 딱딱한 크롤링 구조에 얽매이지 않아요. HTML만 넣고 필요한 것만 뽑으면 돼요.
- 통합성:
requests(가져오기),csv(저장),pandas(분석) 같은 다른 Python 라이브러리와 잘 어울려요.
다른 도구들과는 어떻게 비교될까요?
| 도구 | 가장 적합한 용도 | 장점 | 단점 |
|---|---|---|---|
| BeautifulSoup | 정적 HTML 파싱, 초보자 | 간단함, 빠른 세팅, 관대함, 유연함 | JavaScript가 많은 사이트에는 부적합 |
| Scrapy | 대규모 비동기 작업 | 강력함, 확장성 좋음, 내장 크롤링 기능 | 학습 난도가 높고 세팅이 더 필요함 |
| Selenium | JavaScript/동적 콘텐츠 | JS와 상호작용 가능, 폼 입력, 버튼 클릭 가능 | 느리고 무겁고 리소스를 많이 사용함 |
정적 페이지를 빠르게 파싱해야 하거나 막 시작하는 단계라면, BeautifulSoup가 웹 스크래핑의 "만능 도구"예요(medium.com). 더 복잡하거나 동적인 사이트라면 Selenium이나 Scrapy와 함께 쓸 수도 있지만, 기본기를 익히는 데는 BeautifulSoup가 가장 좋아요.
BeautifulSoup용 Python 환경 설정하기
환경 설정은 이렇게 해요.
-
Python 설치하기: python.org에서 최신 버전을 받으세요.
-
가상 환경 설정하기(선택이지만 권장):
python -m venv venv source venv/bin/activate # Windows에서는: venv\Scripts\activate -
BeautifulSoup와 의존성 설치하기:
pip install beautifulsoup4 requests lxml html5libbeautifulsoup4: 핵심 라이브러리requests: 웹페이지 가져오기용lxml또는html5lib: 더 빠르고 더 안정적인 HTML 파서
-
문제 해결 팁:
- "pip not found" 오류가 나면
pip3나py -m pip를 시도해 보세요. - Mac/Linux에서는 권한 때문에
sudo가 필요할 수 있어요. - Windows라면 Python이 PATH에 추가됐는지 확인하세요.
- "pip not found" 오류가 나면
설정이 제대로 됐는지 아래 간단한 테스트로 확인하세요.
from bs4 import BeautifulSoup
import requests
html = requests.get("http://example.com").text
soup = BeautifulSoup(html, "html.parser")
print(soup.title)
<title>Example Domain</title>가 보이면 준비 완료예요(Thunderbit Blog).
단계별 Python Beautiful Soup 예제
실제 예제를 볼게요. 공용 뉴스 사이트에서 최신 헤드라인을 추출한다고 해 봅시다. 방법은 이래요.
1. 웹페이지 가져오기
import requests
from bs4 import BeautifulSoup
url = "https://www.bbc.com/news"
response = requests.get(url)
html = response.text
2. HTML 파싱하기
soup = BeautifulSoup(html, "html.parser")
3. HTML 구조 살펴보기
브라우저 개발자 도구를 열고(우클릭 → 검사) 헤드라인이 든 태그를 찾으세요. 많은 뉴스 사이트에서 헤드라인은 특정 클래스가 붙은 <h3> 태그에 들어 있어요.
예를 들면 이런 식이에요.
<h3 class="gs-c-promo-heading__title">헤드라인 제목</h3>
4. 데이터 추출하기
headlines = soup.find_all("h3", class_="gs-c-promo-heading__title")
for h in headlines:
print(h.get_text(strip=True))
이 코드는 페이지의 모든 뉴스 헤드라인을 출력해요.
5. 데이터를 CSV로 저장하기
나중에 분석할 수 있게 헤드라인을 저장해 봅시다.
import csv
with open("headlines.csv", "w", newline='', encoding="utf-8") as file:
writer = csv.writer(file)
writer.writerow(["headline"])
for h in headlines:
writer.writerow([h.get_text(strip=True)])
이제 Excel이나 Google Sheets에서 열 수 있는 CSV가 준비됐어요.
효과적인 추출을 위한 HTML 구조 이해하기
코드를 짜기 전에 항상 페이지의 HTML을 먼저 살펴보세요. 방법은 이래요.
- 개발자 도구 열기: 페이지에서 우클릭하고 "검사"를 선택하세요.
- 데이터 찾기: 요소 위에 마우스를 올려 원하는 정보(헤드라인, 가격, 작성자 등)가 어떤 태그에 들었는지 확인하세요.
- 태그·클래스 확인하기:
class="product-title"나id="main-content"같은 고유 식별자를 찾으세요. - 선택자 테스트하기: BeautifulSoup의
.find(),.find_all(),.select()로 해당 요소를 타깃팅해 보세요.
꿀팁: soup.prettify()를 쓰면 콘솔에서 읽기 쉬운 HTML을 출력할 수 있어요.
BeautifulSoup로 데이터 추출하고 구조화하기
블로그 페이지에서 제목과 작성자를 모두 뽑고 싶다고 해 볼게요.
articles = soup.find_all("article")
data = []
for article in articles:
title = article.find("h2").get_text(strip=True)
author = article.find("span", class_="author").get_text(strip=True)
data.append({"title": title, "author": author})
이제 딕셔너리 리스트가 생겼어요. CSV로 내보내거나 추가 분석하기 좋아요.
링크, 이미지, 어떤 속성이든 이렇게 뽑을 수 있어요.
for link in soup.find_all("a"):
print(link.get("href"))
이미지도 마찬가지예요.
for img in soup.find_all("img"):
print(img.get("src"))
추출한 데이터 저장하기: Python에서 Excel 또는 CSV로
데이터를 구조화했다면 내보내기는 아주 쉬워요. csv 모듈로 하는 법은 이래요.
import csv
with open("articles.csv", "w", newline='', encoding="utf-8") as file:
writer = csv.DictWriter(file, fieldnames=["title", "author"])
writer.writeheader()
for row in data:
writer.writerow(row)
pandas를 선호한다면 이렇게요.
import pandas as pd
df = pd.DataFrame(data)
df.to_csv("articles.csv", index=False)
df.to_excel("articles.xlsx", index=False)
특히 특수 문자가 섞일 수 있는 국제 데이터는 반드시 UTF-8 인코딩을 쓰세요.
사례 연구: BeautifulSoup로 뉴스 사이트 데이터 스크래핑하기
예제를 하나 더 볼게요. 뉴스 사이트에서 기사 제목, 작성자, 발행일을 스크래핑해 봅시다.
예를 들어 CNN에서 기사 데이터를 가져온다고 해 볼게요.
import requests
from bs4 import BeautifulSoup
import csv
url = "https://edition.cnn.com/world"
response = requests.get(url)
soup = BeautifulSoup(response.content, "html.parser")
articles = soup.find_all("article")
data = []
for article in articles:
title_tag = article.find("h3")
date_tag = article.find("span", class_="date")
author_tag = article.find("span", class_="author")
title = title_tag.get_text(strip=True) if title_tag else ""
date = date_tag.get_text(strip=True) if date_tag else ""
author = author_tag.get_text(strip=True) if author_tag else ""
data.append({"title": title, "date": date, "author": author})
with open("cnn_articles.csv", "w", newline='', encoding="utf-8") as file:
writer = csv.DictWriter(file, fieldnames=["title", "date", "author"])
writer.writeheader()
for row in data:
writer.writerow(row)
이 스크립트는 최신 기사를 가져와 제목, 날짜, 작성자를 추출한 뒤 CSV로 저장해요. 단, CNN의 현재 마크업이 위 태그들과 여전히 일치한다는 가정이 필요해요. 주요 뉴스 사이트는 클래스 이름과 DOM 구조를 자주 바꾸니, 실제 데이터에 쓰기 전에 페이지를 다시 확인하세요. 구조(<article> 컨테이너를 쓰고 자식 태그에 find를 적용하는 방식)는 변하지 않는 패턴이에요. 반면 "date"나 "author" 같은 구체적인 클래스 이름은 지금 실제 페이지에 맞게 조정해야 하는 자리표시자예요.
BeautifulSoup와 Thunderbit를 함께 써서 워크플로 향상하기
이제 스크래핑 워크플로를 더 매끄럽게 만드는 방법을 볼게요. Thunderbit는 AI 기반 웹 스크래퍼 Chrome 확장 프로그램으로, 데이터 추출의 추측을 없애 줘요. Thunderbit로는 이런 게 가능해요.
- "AI 필드 추천" 사용하기: Thunderbit가 페이지를 읽고 추출할 데이터 필드를 자동으로 제안해요. 더 이상 HTML을 뒤지거나 선택자를 만질 필요가 없어요.
- 하위 페이지 스크래핑: 개별 상품 페이지나 기사 페이지 같은 하위 페이지로 이동해 추가 정보를 담은 데이터셋을 만들어요.
- 즉시 내보내기: 클릭 한 번으로 Excel, Google Sheets, Airtable, Notion으로 바로 보낼 수 있어요.
- 페이지네이션 처리: 무한 스크롤을 포함해 여러 페이지에 걸친 데이터를 스크래핑해요.
- 예약 스크래핑: 데이터를 늘 최신으로 유지하도록 반복 작업을 설정할 수 있어요.
제가 특히 좋아하는 하이브리드 워크플로는 이거예요.
- Thunderbit로 시작하기: 대상 사이트를 열고 Thunderbit 아이콘을 클릭한 뒤, "AI 필드 추천"이 title, author, date 같은 열을 찾아내게 하세요.
- 데이터 내보내기: 결과를 CSV로 받거나 Google Sheets로 보내세요.
- BeautifulSoup로 맞춤 처리하기: 더 깊은 분석(텍스트 정제, 중복 제거, 다른 소스와 결합)이 필요하면, 내보낸 CSV를 Python으로 불러와 BeautifulSoup나 pandas로 후처리하세요.
이 조합은 양쪽 장점을 다 줘요. Thunderbit의 속도와 AI 기반 필드 감지, BeautifulSoup의 유연한 맞춤 로직이 함께하니까요.
Thunderbit AI 웹 스크래퍼를 무료로 사용해 보기
속도와 데이터 품질: 왜 Thunderbit와 BeautifulSoup를 같이 쓸까요?
왜 굳이 두 도구를 함께 쓸까요? 제 경험으론 이래요.
- 속도: Thunderbit는 수십 개의 페이지를 병렬로 스크래핑해요(클라우드 모드에서는 한 번에 최대 50개). 몇 시간 걸리던 일이 몇 분이면 끝나죠.
- 데이터 완성도: Thunderbit의 AI는 레이아웃 변화에 적응하고 까다로운 사이트에서도 구조화된 데이터를 뽑아내, 누락 필드를 줄여 줘요.
- 오류 감소: 클래스 이름이 바뀔 때마다 스크립트가 깨지는 일이 없어져요. Thunderbit AI가 매번 페이지를 다시 평가하니까요.
- 맞춤 후처리: 필터링, 번역, 데이터셋 병합 같은 고급 작업엔 BeautifulSoup와 pandas가 완전한 제어권을 줘요.
이 하이브리드 방식은 특히 이럴 때 유용해요.
- 대규모 리드 생성: Thunderbit로 대량 데이터를 가져오고, BeautifulSoup로 정제·보강하기
- 상품 모니터링: Thunderbit가 반복 스크래핑을 맡고, BeautifulSoup가 트렌드 분석이나 이상 탐지를 돕기
- 뉴스·콘텐츠 추적: Thunderbit로 기사를 빠르게 모은 뒤, Python으로 감성 분석이나 키워드 추출하기
BeautifulSoup 웹 스크래핑에서 흔한 문제 해결하기
Thunderbit Chrome 확장 프로그램 사용해 보기 AI로 어떤 웹사이트든 2번 클릭만으로 스크래핑하세요. Get Started Free
웹 스크래핑이 항상 순탄하진 않아요. 자주 겪는 문제와 해결법은 이래요.
- 동적 콘텐츠: 사이트가 JavaScript로 데이터를 불러오면(무한 스크롤, AJAX 등) BeautifulSoup만으론 볼 수 없어요. 이럴 땐 Selenium이나 Thunderbit의 브라우저 모드를 쓰세요.
- 봇 차단: 자동 요청을 막는 사이트가 있어요. 커스텀 User-Agent 헤더를 설정하거나, 요청 사이에 지연을 넣거나, Thunderbit의 클라우드 스크래핑으로 단순한 차단을 우회해 보세요.
- HTML 구조 변경: 스크립트가 갑자기 깨졌다면 사이트 HTML이 바뀐 가능성이 높아요. 페이지를 다시 확인하고 선택자를 업데이트하세요. Thunderbit AI는 상황에 맞춰 자동으로 적응해요.
- 데이터 누락:
.get_text()를 호출하기 전에 요소가 존재하는지 항상 확인하세요. 속성값을 가져올 땐[]대신.get()을 쓰면 KeyError를 피할 수 있어요. - 인코딩 문제: 특수 문자를 처리하려면 파일을 UTF-8 인코딩으로 저장하세요.
그리고 항상 robots.txt와 사이트 이용약관을 존중하세요. 책임감 있게 스크래핑하는 게 중요해요. 무리한 요청으로 사이트에 부담을 주면 안 돼요.
결론 및 핵심 요약
BeautifulSoup를 활용한 웹 스크래핑은 데이터 중심의 시대에 익혀 둘 가장 실용적인 기술 중 하나예요. 이번 튜토리얼에서 다룬 내용을 정리하면 이래요.
- BeautifulSoup는 정적 HTML을 파싱하고 Python으로 구조화된 데이터를 추출하기에 이상적인 출발점이에요.
- 설정은 아주 간단해요. Python, pip, 라이브러리 몇 개만 설치하면 돼요.
- HTML 살펴보기는 올바른 데이터를 타깃팅하는 데 핵심이에요.
- CSV/Excel 내보내기를 하면 데이터를 바로 업무 분석에 쓸 수 있어요.
- Thunderbit와 함께 쓰면 AI 기반 필드 감지, 더 빠른 스크래핑, 쉬운 내보내기를 모두 얻어요. 비즈니스 사용자와 비개발자에게 특히 좋아요.
- 하이브리드 워크플로(대량 추출은 Thunderbit, 맞춤 처리는 BeautifulSoup)는 속도, 데이터 품질, 유연성을 가장 잘 잡아 줘요.
웹 스크래핑 실력을 한 단계 끌어올리고 싶다면 두 도구를 다 써 보세요. 간단한 BeautifulSoup 스크립트로 실험해 본 다음, Thunderbit AI 웹 스크래퍼로 얼마나 더 빨라지는지 확인해 보세요. 더 많은 실전 가이드는 Thunderbit Blog에 있어요.
즐거운 스크래핑 되세요. 데이터는 늘 깨끗하고 구조화돼 바로 실행 가능한 상태이길 바라요.
Thunderbit AI 웹 스크래퍼 사용해 보기 Get Started Free
자주 묻는 질문
1. BeautifulSoup는 무엇이고 무엇에 쓰나요?
BeautifulSoup는 HTML과 XML 문서를 파싱하는 Python 라이브러리예요. 웹페이지에서 데이터를 추출해 리스트나 표 같은 구조화된 형식으로 바꿔 주기 때문에, 웹 스크래핑 프로젝트에 잘 맞아요.
2. BeautifulSoup는 Selenium, Scrapy와 어떻게 다른가요?
BeautifulSoup는 가볍고 정적 HTML을 다루기 쉬워요. Selenium은 동적이고 JavaScript가 많은 사이트에 더 적합하고, Scrapy는 대규모 비동기 스크래핑을 위한 완전한 프레임워크예요. 초보자와 빠른 작업에는 BeautifulSoup가 가장 좋아요.
3. BeautifulSoup와 Thunderbit를 함께 쓸 수 있나요?
물론이죠. Thunderbit는 AI로 웹페이지에서 필드를 빠르게 찾아 추출하고, BeautifulSoup는 내보낸 데이터를 맞춤 후처리하거나 더 깊게 분석하는 데 쓸 수 있어요.
4. BeautifulSoup로 웹 스크래핑할 때 흔한 어려움은 무엇인가요?
동적 콘텐츠 처리, 봇 차단 대응, HTML 구조 변경에 맞춰 스크립트를 조정하는 일이 흔한 문제예요. Thunderbit의 AI 기능이나 브라우저 모드를 쓰면 상당수를 해결할 수 있어요.
5. BeautifulSoup로 스크래핑한 데이터를 Excel이나 CSV로 어떻게 내보내나요?
Python 기본 csv 모듈이나 pandas 라이브러리로 추출 데이터를 CSV 또는 Excel로 저장할 수 있어요. 특수 문자를 잘 처리하고 스프레드시트 도구와 호환되게 하려면 항상 UTF-8 인코딩을 쓰세요.
직접 해보고 싶다면 Thunderbit의 Chrome 확장 프로그램을 받아 더 똑똑하게 스크래핑을 시작해 보세요. 더 많은 튜토리얼과 팁은 Thunderbit Blog에 있어요.
더 알아보기


