
웹 크롤링 입문: BeautifulSoup과 Selenium, 정적 페이지와 동적 페이지를 함께 다루는 법
파이썬으로 웹에서 데이터를 자동으로 수집하려는 사람이라면 가장 먼저 마주치는 두 이름이 있습니다. 바로 BeautifulSoup과 Selenium입니다. 두 라이브러리는 이름은 자주 함께 언급되지만 실제로는 성격이 완전히 다른 도구입니다. 이 글에서는 각각의 개요, 기능, 장단점, 추천 대상을 정리하고 마지막에 자주 묻는 질문(FAQ)까지 다뤄보겠습니다.
1. 기본/개요: 두 라이브러리는 서로 다른 문제를 푼다
BeautifulSoup은 HTML과 XML 문서를 파싱(구조 분석)하기 위한 파이썬 라이브러리입니다. 공식 문서에 따르면 문자열이나 열린 파일 핸들을 BeautifulSoup 생성자에 넘기면 문서를 유니코드로 변환하고, 이를 Tag·NavigableString·Comment 등 파이썬 객체로 이루어진 트리 구조로 바꿔줍니다. 설치는 pip install beautifulsoup4 한 줄로 끝나며, 현재도 crummy.com에서 공식 문서가 지속적으로 갱신되고 있습니다. 참고로 이전 버전인 Beautiful Soup 3는 더 이상 개발되지 않으므로, 새 프로젝트라면 반드시 4버전(bs4)을 사용해야 합니다.
반면 Selenium은 파서가 아니라 브라우저 자동화 프레임워크입니다. 2004년에 처음 등장해 20년 넘게 유지되고 있으며, W3C WebDriver 표준을 기반으로 실제 브라우저(Chrome, Firefox 등)를 코드로 직접 제어합니다. 클릭, 텍스트 입력, 스크롤, 페이지 이동 같은 사용자 행동을 그대로 재현할 수 있다는 점이 핵심입니다. 과거에는 크롬 버전에 맞는 chromedriver를 수동으로 내려받아 경로를 지정해야 했지만, Selenium 4.6 이후 도입된 Selenium Manager 덕분에 최신 버전에서는 드라이버를 자동으로 관리해주는 방식으로 개선되었습니다.
개인적으로 느끼는 점: 두 도구를 "경쟁 관계"로 오해하는 경우를 종종 봅니다. 하지만 실제로는 BeautifulSoup은 "파싱 엔진", Selenium은 "브라우저 리모컨"에 가까워서 둘을 대립시키는 것 자체가 질문이 잘못 설정된 경우가 많습니다. 오히려 실무에서는 Selenium으로 페이지를 로딩·상호작용시키고, 그 결과 HTML을 BeautifulSoup으로 파싱한다는 조합이 매우 흔한 패턴입니다.
2. 기능/스펙: 정적 파싱 vs 브라우저 제어
BeautifulSoup의 핵심 기능은 세 가지로 요약됩니다.
find()/find_all()을 이용한 태그·클래스·id 기반 검색- CSS 선택자(
select())를 통한 탐색 - html.parser, lxml, html5lib 등 여러 파서 백엔드 선택 가능
BeautifulSoup 자체는 네트워크 요청 기능이 없기 때문에, 정적 페이지를 가져오려면 requests나 urllib 같은 별도의 라이브러리와 함께 사용하는 것이 일반적인 패턴입니다.
Selenium의 핵심 기능은 다음과 같습니다.
find_element()/find_elements()로 요소 탐색 및 클릭, 입력 등 상호작용- JavaScript로 렌더링되는 동적 콘텐츠까지 실제로 브라우저에 그려진 뒤의 결과를 가져올 수 있음
unittest,pytest와 연동한 자동화 테스트 작성 지원- 2026년 기준으로도 활발히 버전업이 이어지고 있으며, 최근 릴리스에서는 BiDi(브라우저 양방향 통신) 프로토콜 지원 확대, 파이썬 바인딩의 타입 힌트 개선 등이 이루어졌습니다.
비판적으로 보면: BeautifulSoup은 스펙이 단순한 만큼 배우기는 쉽지만, JavaScript로 데이터를 나중에 그려주는 사이트(무한 스크롤, SPA 등)에는 애초에 대응이 불가능합니다. 반대로 Selenium은 실제 브라우저를 구동하기 때문에 기능적으로는 강력하지만, 그만큼 무겁고 복잡한 도구라는 점을 부정하기 어렵습니다.
3. 장단점: 가볍고 빠른 것과 무겁고 강력한 것의 트레이드오프
BeautifulSoup 장점
- 문법이 간단해 진입장벽이 낮음
- 실행 속도가 빠르고 메모리 사용량이 적음
- requests와 조합하면 서버 자원 소모가 적어 대량 수집에 유리
BeautifulSoup 단점
- JavaScript 렌더링 페이지는 원천적으로 처리 불가
- 로그인, 클릭 등 상호작용이 필요한 흐름은 별도 도구 없이는 구현 불가
Selenium 장점
- 사람이 브라우저를 쓰는 것과 동일한 방식으로 동작하므로 동적 페이지도 대응 가능
- 로그인, 팝업 처리, 무한 스크롤 등 복잡한 상호작용 구현 가능
- 웹 자동화 테스트 도구로도 널리 쓰이는 만큼 생태계와 자료가 풍부함
Selenium 단점
- 실제 브라우저를 띄우기 때문에 속도가 느리고 리소스 소모가 큼
- 대상 사이트 구조 변경에 따라 스크립트가 쉽게 깨질 수 있음
- 대규모 수집 시 서버 차단(429, 캡차 등)에 걸리기 쉬움
제 생각: 실무에서 가장 흔한 실수는 "일단 Selenium부터 켜고 보는 것"입니다. 사이트가 정적 HTML만으로 원하는 데이터를 제공한다면 BeautifulSoup(+requests) 조합이 훨씬 가볍고 안정적입니다. Selenium은 반드시 필요한 경우, 즉 JS 렌더링이나 사용자 상호작용이 불가피한 경우에만 최후의 수단으로 꺼내는 것이 합리적이라고 생각합니다. 또한 대상 사이트가 공식 API를 제공한다면, 크롤링보다 API 사용이 안정성과 이용 약관 준수 측면에서 더 나은 선택지인 경우가 많습니다.
4. 추천 대상
- BeautifulSoup 추천 대상: 정적 블로그, 뉴스 목록, 공공데이터 페이지 등 서버에서 완성된 HTML을 그대로 내려주는 사이트를 다루는 초보 개발자, 데이터 수집을 가볍고 빠르게 끝내고 싶은 사람
- Selenium 추천 대상: 로그인 이후에만 보이는 데이터, 무한 스크롤형 SNS, 검색 결과처럼 JS로 동적으로 그려지는 페이지를 다뤄야 하는 개발자, 혹은 웹 서비스의 UI 자동화 테스트를 작성해야 하는 QA/개발자
- 둘 다 필요한 대상: 동적 페이지에서 로그인·클릭 등 상호작용까지 마친 뒤, 최종 HTML만 빠르게 파싱하고 싶은 실무 크롤러 개발자
5. FAQ
Q1. BeautifulSoup만으로 로그인 후 데이터를 가져올 수 있나요?
A. BeautifulSoup 자체에는 브라우저 상호작용 기능이 없습니다. requests의 세션(Session) 기능으로 로그인 요청을 직접 재현할 수 있는 경우도 있지만, 이는 사이트 구조를 정확히 알아야 가능한 방식이며 모든 사이트에 적용되는 것은 아닙니다.
Q2. Selenium은 무조건 Chrome을 써야 하나요?
A. 아닙니다. Selenium은 Chrome, Firefox, Edge 등 여러 브라우저를 지원하는 W3C WebDriver 표준을 기반으로 하고 있어 브라우저를 바꿔가며 사용할 수 있습니다.
Q3. 크롤링은 법적으로 문제가 없나요?
A. 이는 대상 사이트의 이용 약관, 수집하는 데이터의 성격, 국가별 법률에 따라 달라지는 사안으로, 이 글에서 일률적으로 답변드리기는 어렵습니다. 이것은 확인할 수 없습니다. 실무에서는 대상 사이트의 robots.txt와 이용 약관을 먼저 확인하고, 가능하다면 공식 API를 우선 사용하는 것이 권장됩니다.
Q4. 두 라이브러리를 함께 쓰는 방법이 있나요?
A. 네, 매우 흔한 패턴입니다. Selenium으로 페이지를 로딩·상호작용시킨 뒤 driver.page_source로 렌더링된 HTML을 가져오고, 이를 BeautifulSoup에 넘겨 파싱하는 방식이 실무에서 널리 쓰입니다.
Q5. 최신 버전에서 chromedriver를 따로 설치해야 하나요?
A. Selenium 4.6 이후 버전에서는 Selenium Manager가 도입되어 대부분의 경우 드라이버를 자동으로 관리해주므로, 과거처럼 수동으로 다운로드하고 경로를 지정하는 번거로움이 줄었습니다.
6. 출처
- Beautiful Soup 공식 문서 (crummy.com/software/BeautifulSoup/bs4/doc/)
- Beautiful Soup 한국어 공식 문서 (crummy.com/software/BeautifulSoup/bs4/doc.ko/)
- Selenium 공식 문서 (selenium.dev/documentation/)
- Selenium Python Client Driver 문서 (selenium.dev, readthedocs.io)
- Selenium 공식 블로그, "Selenium 4.40 Released!" (selenium.dev/blog)
- Selenium 다운로드 페이지 (selenium.dev/downloads/)