1. BeautifulSoup이란?
웹페이지는 HTML이라는 코드로 이루어져 있다. 하지만 requests로 가져온 HTML은 그저 거대한 하나의 '문자열(글자 덩어리)'일 뿐이다. 파이썬은 이 글자 뭉치의 어디가 제목이고 어디가 본문인지 스스로 알지 못한다.
BeautifulSoup은 이 문자열 형태의 HTML을 파이썬이 이해할 수 있는 객체 구조(트리 구조)로 변환해 준다. 덕분에 우리는 "태그 이름이 <a>인 것만 찾아줘", "class가 title인 것만 가져와줘"라고 편하게 명령할 수 있게 된다.
2. BeautifulSoup의 핵심 메서드
① find() : 가장 먼저 나오는 딱 '하나'만 찾기
- 조건에 맞는 태그 중 첫 번째 태그 하나만 가져온다.
- 데이터가 매칭되는 즉시 반환하므로, 제목이나 유일한 요소를 찾을 때 좋다.
② find_all() : 조건에 맞는 것 '전부' 찾기
- 조건에 맞는 모든 태그를 리스트(List) 형태로 긁어모아 준다.
- 반복문(for)과 함께 쓰여 게시판 목록, 뉴스 리스트 등을 크롤링할 때 필수적이다.
3. BeautifulSoup이 가장 많이 쓰이는 영역

① 뉴스 기사 및 언론사 데이터 수집
- 예시: 네이버 뉴스, 다음 뉴스, 혹은 특정 신문사 사이트에서 실시간 헤드라인, 본문, 기자 이름, 발행일 등을 긁어모을 때 사용한다.
- 목적: 특정 키워드(예: '인공지능', '주식 시장')에 대한 여론을 분석하거나 텍스트 마이닝(Word Cloud 등)을 하기 위한 기초 데이터를 쌓을 때 필수적이다.
② 이커머스 상품 정보 및 가격 비교
- 예시: 쇼핑몰(쿠팡, 네이버 쇼핑 등)의 상품명, 가격, 리뷰 수, 평점, 상품 이미지 URL 등을 수집한다.
- 목적: 경쟁사 상품의 가격 변동 추이를 모니터링하여 자동으로 내 쇼핑몰의 가격을 조정하거나, 최저가 알림 서비스를 만들 때 쓰인다.
③ 부동산 매물 및 주식 정보 모니터링
- 예시: 네이버 페이 증권의 일별 시세 표, 부동산 사이트의 매물 리스트를 수집한다.
- 목적: 주기적으로 데이터를 가져와서 엑셀(CSV) 파일로 저장하거나, 본인의 데이터베이스(DB)에 누적하여 투자 지표 분석용 차트를 그릴 때 활용한다.
④ 기업 및 타깃 리스트 수집 (영업/마케팅)
- 예시: 특정 업종의 협회 사이트나 지도 서비스에서 등록된 업체의 이름, 전화번호, 주소 등을 추출한다.
- 목적: 마케팅이나 영업팀에서 사용할 타깃 고객 리스트를 자동화로 구축할 때 많이 쓰인다.
4. 간단한 실습
실제 웹사이트를 크롤링하기 전에, 맛보기용 HTML 문자열을 만들어서 BeautifulSoup이 어떻게 작동하는지 바로 확인해 보려고 한다.
import requests
from bs4 import BeautifulSoup
# 크롤링할 사이트
url = "https://quotes.toscrape.com"
# 웹 페이지 요청
response = requests.get(url)
# HTML 파싱
soup = BeautifulSoup(response.text, "html.parser")
# 제목 출력
title = soup.title.text
print("페이지 제목:", title)
# 인용문과 작가 출력
quotes = soup.select("div.quote")
for idx, quote in enumerate(quotes, start=1):
text = quote.select_one("span.text").text
author = quote.select_one("small.author").text
print(f"\n[{idx}]")
print("명언 :", text)
print("작가 :", author)
페이지 제목: Quotes to Scrape
[1]
명언 : “The world as we have created it is a process of our thinking..."
작가 : Albert Einstein
[2]
명언 : “It is our choices, Harry, that show what we truly are..."
작가 : J.K. Rowling
...
5. 정리 노트용 요약
- 역할: HTML 문자열을 분석 가능한 파이썬 객체로 변환 (Parsing)
- 텍스트 추출: 찾은 태그 뒤에 .text 또는 .get_text()를 붙여 문자열만 추출 가능
- 속성 추출: 태그 뒤에 ['속성명']을 붙여 href나 src 같은 주소 추출 가능 (예: tag['href'])
- 단짝 친구: 주로 requests로 웹페이지 정보를 가져온 뒤 BeautifulSoup으로 요리하는 구조를 많이 사용
# 태그 하나 찾기
soup.find("h1")
# 태그 여러 개 찾기
soup.find_all("a")
# CSS 선택자 사용
soup.select("div.quote")
# 첫 번째 요소 선택
soup.select_one("h1")
# 텍스트 추출
tag.text
# 공백 제거
tag.text.strip()
# 속성 가져오기
tag["href"]
6. BeautifulSoup으로 '할 수 없는 것'
BeautifulSoup은 requests가 받아온 초기 HTML만 다룰 수 있다.
그래서 다음과 같은 상황에서는 BeautifulSoup만으로 크롤링이 불가능하거나 아주 어렵다.
- 로그인이 필요한 페이지: 로그인을 해야만 들어갈 수 있는 마이페이지나 비밀 게시판
- 동적 웹페이지 (JavaScript 렌더링): "더보기" 버튼을 눌러야 아래에 상품이 더 나타나거나, 인스타그램/유튜브처럼 스크롤을 아래로 내릴 때 데이터가 계속 로딩되는 사이트 (이런 걸 싱글 페이지 애플리케이션(SPA) 또는 CSR 방식이라고 한다.
💡 해결책은? 이렇게 마우스 클릭, 스크롤, 로그인 등이 필요한 '동적 페이지'를 크롤링할 때는 브라우저를 진짜로 원격 조종하는 Selenium(셀레니움)이나 Playwright라는 라이브러리를 섞어서 사용해야 한다.
7. Selenium

Selenium은 웹 브라우저를 자동으로 제어할 수 있는 라이브러리이다.
BeautifulSoup이 HTML 문서를 분석하는 도구라면, Selenium은 실제 사용자가 브라우저를 사용하는 것처럼 클릭, 입력, 스크롤 등의 동작을 수행할 수 있다.
예를 들어 Selenium을 사용하면 다음과 같은 작업이 가능하다.
- 웹 페이지 접속
- 로그인
- 검색어 입력
- 버튼 클릭
- 무한 스크롤 실행
- JavaScript 실행 후 생성된 데이터 수집
Selenium이 필요한 이유
BeautifulSoup은 서버가 처음 응답한 HTML만 분석할 수 있다.
서버 응답 HTML
↓
BeautifulSoup 분석
반면 Selenium은 실제 브라우저를 실행하여 JavaScript까지 수행한다.
브라우저 실행
↓
JavaScript 실행
↓
최종 화면 생성
↓
데이터 수집
따라서 JavaScript에 의해 동적으로 생성되는 데이터도 수집할 수 있다.
8. Selenium의 핵심 메서드
① find_element() : 조건에 맞는 요소 '하나'만 찾기
BeautifulSoup의 find()와 같은 역할을 한다. 페이지 내에서 가장 먼저 발견되는 태그나 요소를 가져온다.
② find_elements() : 조건에 맞는 요소 '전부' 찾기
BeautifulSoup의 find_all()과 같은 역할을 한다. 조건에 일치하는 모든 요소를 리스트 형태로 반환한다.
③ send_keys() : 텍스트 입력 및 키보드 조작
검색창이나 로그인 폼에 원하는 텍스트를 타이핑하거나, 엔터(Keys.ENTER) 같은 키보드 입력을 보낼 때 사용한다.
④ click() : 마우스 클릭
링크, 버튼, 체크박스 등 웹페이지의 특정 요소를 실제로 클릭해 주는 메서드이다.
10. Selenium이 가장 많이 쓰이는 영역
① 로그인 및 인증이 필요한 서비스 수집
네이버, 인스타그램 등 로그인을 거쳐야만 마이페이지나 특정 데이터에 접근할 수 있는 웹사이트를 크롤링할 때 필수적으로 사용된다.
② 무한 스크롤 및 더보기 버튼이 있는 영역
화면을 아래로 끝까지 내리거나 '더보기' 버튼을 눌러야만 새로운 데이터가 로딩되는 동적 웹페이지를 수집할 때 쓰인다.
③ 비동기 JavaScript 기반의 사이트
주소(URL)는 그대로인데 화면 안의 콘텐츠만 실시간으로 계속 바뀌는 주식 차트, 실시간 댓글, 예약 사이트 등을 크롤링할 때 활용된다.
11. 간단한 실습 (Selenium)
자동으로 네이버에 접속해 검색어를 입력하고, 검색 결과 페이지의 제목들을 10개만 추출하는 코드이다.
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from webdriver_manager.chrome import ChromeDriverManager
import time
# 1. 크롬 드라이버 자동 설정 및 브라우저 실행
service = Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=service)
try:
# 2. 네이버로 이동
driver.get("https://www.naver.com")
time.sleep(2) # 페이지 로딩 대기
# 3. 검색창 찾아서 '파이썬' 입력 후 엔터
search_box = driver.find_element(By.ID, "query")
search_box.send_keys("파이썬")
search_box.send_keys(Keys.ENTER)
# 4. ★ 중요: 검색 결과가 화면에 다 그려질 때까지 충분히 대기 (5초)
# 네이버의 새로운 레이아웃은 로딩 속도에 따라 조금 늦게 뜰 수 있습니다.
time.sleep(5)
# 5. 최신 네이버 SDS(Smart Search) 구조 맞춤형 CSS 선택자 사용
# 무작위 난수 클래스명 대신, 세로형 레이아웃 박스 내부의 링크(a) 태그들을 타겟팅
titles = driver.find_elements(By.CSS_SELECTOR, "div[data-template-type='vertical'] a[href^='http']")
print("\n=== 크롤링 결과 출력 ===")
# 6. 가져온 요소 중 텍스트가 있는 제목만 골라서 출력
count = 1
for title in titles:
if count > 10:
break
text = title.text.strip()
# 빈 텍스트거나 너무 짧은 연관 문구(예: Downloads, PSF 등)는 제외하고
# 진짜 본문 제목처럼 보이는 긴 텍스트만 필터링합니다.
if text and len(text) > 5:
print(f"{count}. {text}")
count += 1
# 만약 아무것도 수집되지 않았다면 경고 메시지 출력
if count == 1:
print("❌ 요소를 찾지 못했습니다. 네이버 레이아웃이 또 변경되었을 수 있습니다.")
except Exception as e:
print(f"❌ 에러 발생: {e}")
finally:
# 7. 브라우저 완전 종료 (메모리 확보를 위해 필수!)
driver.quit()
print("====================\n브라우저가 안전하게 종료되었습니다.")
12. Selenium으로 '할 수 없는 것'
① 대량의 페이지를 빠르게 크롤링하기
Selenium은 실제로 눈앞에 브라우저 창을 띄우고 그래픽을 표현하기 때문에, 텍스트만 긁어오는 BeautifulSoup에 비해 속도가 무척 느리고 컴퓨터 메모리(RAM)를 많이 잡아먹는다.
② 완벽한 캡차(CAPTCHA) 우회
"로봇이 아닙니다"를 체크하는 보안 프로그램이나 이미지 글자 맞추기 등은 Selenium 자동화 코드를 잡아내기 때문에, 기본 기능만으로는 완벽히 우회하기 어렵다.
13. BeautifulSoup과 Selenium의 차이
| HTML 분석 | 브라우저 제어 |
| 빠름 | 상대적으로 느림 |
| 정적 페이지 수집에 적합 | 동적 페이지 수집에 적합 |
| JavaScript 실행 불가 | JavaScript 실행 가능 |
[참고]
파이썬에서 BeautifulSoup 설치하기: 입문자 가이드
파이썬에서 pip으로 BeautifulSoup을 몇 분 만에 설치하는 방법과, Thunderbit을 활용한 더 빠르고 쉬운 웹 스크래핑·데이터 추출법을 비교합니다.
thunderbit.com
[Java] 동적 웹 크롤링을 위한 셀레니움 1 - Data Engineer
셀레니움 셀레니움이란 가상의 브라우저를 띄워서 이를 활용하여 테스트 자동화 및 크롤링 할수 있는 툴이다. WebDriver를 사용해서 브라우저에서의 동작을 컨트롤 할수 있어 정적 Jsoup같은 정적 W
wonyong-jang.github.io
—————————————————————————————————————————————————————
본 후기는 [한글과컴퓨터x한국생산성본부x스나이퍼팩토리]
한컴 AI 아카데미 (B-log) 리뷰로 작성 되었습니다.
