IT & Programming/python
파이썬 웹크롤러도구 requests, BeautifulSoup, Selenium 에 대해 알아보자
오스카리
2025. 5. 12. 03:35
파이썬 웹 크롤링에서 자주 사용되는 도구인 requests, BeautifulSoup, Selenium 은 각각의 역할과 특성이 뚜렷하게 다릅니다. 이들은 보통 조합해서 사용하지만, 목적에 따라 적절한 도구를 선택해야 합니다.
아래에 차이점, 장단점, 용도를 중심으로 비교 정리하겠습니다.
1. 각 도구의 역할 요약
도구 주요 기능 핵심 역할
requests | HTTP 요청 전송 | 웹 페이지 HTML 요청 |
BeautifulSoup | HTML 파싱 | HTML 구조 분석 및 정보 추출 |
Selenium | 브라우저 자동 제어 | 자바스크립트 렌더링 포함한 동적 페이지 처리 |
2. 차이점 상세 비교
항목 requests BeautifulSoup Selenium
기능 | HTML 페이지 다운로드 | HTML 파싱 및 요소 추출 | 브라우저 자동화 |
동작 방식 | 서버에서 HTML만 받음 | HTML 문자열 분석 | 브라우저 직접 실행 |
자바스크립트 처리 | 불가능 | 불가능 | 가능 |
속도 | 빠름 | 빠름 | 느림 |
설치 및 사용 | 간단 | 간단 | 복잡 (드라이버 필요) |
테스트 및 디버깅 | 코드 기반 | 코드 기반 | 실제 브라우저 화면 확인 가능 |
3. 장단점 비교
1) requests
- 장점
- 빠르다 (브라우저 실행 없이 서버에서 직접 응답 수신)
- 사용법이 간단하고 코드가 가볍다
- 다양한 HTTP 메서드 지원 (GET, POST 등)
- 단점
- 자바스크립트로 렌더링되는 데이터에는 무력함 (페이지 구조만 가져옴)
사용 예시
- 정적인 HTML 웹페이지
- API 응답 수집 (JSON 등)
2) BeautifulSoup
- 장점
- HTML 구조 탐색이 간단 (CSS 선택자, 태그 이름으로 쉽게 접근)
- HTML이 다소 깨져 있어도 파싱에 유연
- requests나 Selenium과 함께 사용 가능
- 단점
- 자체로는 데이터를 가져올 수 없음 (HTML 문자열 필요)
- 자바스크립트로 로딩되는 요소 접근 불가
사용 예시
- HTML 내 기사 제목, 상품 정보, 이미지 태그 등 추출
- requests 또는 Selenium과 함께 사용
3) Selenium
- 장점
- 실제 브라우저 실행을 통해 자바스크립트 렌더링 완벽 처리
- 로그인, 버튼 클릭, 스크롤, 팝업 제어 등 상호작용 가능
- 브라우저에서 눈으로 결과를 직접 확인 가능
- 단점
- 느림 (브라우저 실행 포함)
- 크롬드라이버 설치 필요
- 자원 많이 사용
사용 예시
- 동적 웹페이지 크롤링 (쿠팡, 네이버 뉴스, 인스타그램 등)
- 로그인 후 데이터 접근
- 무한 스크롤 페이지 처리
4. 실무 예시 분류
상황 적합 도구
뉴스 목록 제목 수집 | requests + BeautifulSoup |
JSON API 데이터 추출 | requests |
제품 페이지에서 리뷰 크롤링 (스크롤 포함) | Selenium |
로그인 후 마이페이지 정보 수집 | Selenium |
HTML 테이블에서 정보 추출 | requests + BeautifulSoup |
5. 종합 비교표
항목 requests BeautifulSoup Selenium
HTML 요청 | O | X | O |
HTML 파싱 | X | O | X (→ BeautifulSoup 필요) |
자바스크립트 렌더링 | X | X | O |
속도 | 빠름 | 빠름 | 느림 |
설치 복잡도 | 낮음 | 낮음 | 높음 |
동작 환경 | CLI 기반 | CLI 기반 | 브라우저 환경 |
추천 사용처 | 정적 웹, API | HTML 분석 | 동적 웹, JS 기반 페이지 |
결론 요약
- 정적 데이터만 필요하다면 → requests + BeautifulSoup
- JS로 생성된 데이터가 많고, 로그인·클릭 등 상호작용이 필요하다면 → Selenium
다음은 requests, BeautifulSoup, Selenium을 조합하여
실제 동적 웹사이트(쿠팡)의 상품 데이터를 수집하고,
상품명 + 가격 + 평점 을 추출하여 중복 없이 정제하는 통합 크롤러 실전 예제입니다.
프로젝트 목표:
쿠팡에서 특정 키워드로 검색된 상품의 다음 항목을 수집
- 상품명
- 가격
- 평점
사용 기술 요약
라이브러리 역할
Selenium | 자바스크립트 렌더링 + 페이지 로딩 |
BeautifulSoup | 렌더링된 HTML 파싱 |
set, dict | 중복 제거 및 데이터 정리 |
전체 코드 예제
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from bs4 import BeautifulSoup
import time
# 1. Selenium으로 쿠팡 접속 및 검색
driver = webdriver.Chrome()
driver.get("https://www.coupang.com/")
search_box = driver.find_element(By.NAME, "q")
search_box.send_keys("아이폰")
search_box.send_keys(Keys.RETURN)
time.sleep(3) # 로딩 대기
# 2. 페이지 소스 가져오기 → BeautifulSoup 사용
html = driver.page_source
soup = BeautifulSoup(html, "html.parser")
# 3. 상품 정보 추출
items = soup.select("li.search-product")
result = []
seen_names = set()
for item in items:
# 상품명 추출
name_tag = item.select_one("div.name")
if not name_tag:
continue
name = name_tag.get_text(strip=True)
if name in seen_names:
continue
seen_names.add(name)
# 가격 추출
price_tag = item.select_one("strong.price-value")
price = price_tag.get_text(strip=True) if price_tag else "가격 없음"
# 평점 추출
rating_tag = item.select_one("em.rating")
rating = rating_tag.get_text(strip=True) if rating_tag else "평점 없음"
result.append({
"상품명": name,
"가격": price,
"평점": rating
})
driver.quit()
# 4. 결과 출력
for idx, prod in enumerate(result, 1):
print(f"{idx}. {prod['상품명']}")
print(f" - 가격: {prod['가격']}")
print(f" - 평점: {prod['평점']}")
print()
예시 출력
1. Apple 아이폰 14 Pro 128GB
- 가격: 1,599,000
- 평점: 4.8
2. 나이킨 아이폰 14 케이스 방탄형
- 가격: 12,000
- 평점: 4.5
3. 애플 정품 라이트닝 케이블
- 가격: 25,000
- 평점: 4.7
...
주요 포인트 요약
요소 설명
Selenium | 쿠팡 페이지 접근, 검색창 조작, 렌더링된 HTML 확보 |
BeautifulSoup | 렌더링된 HTML에서 필요한 태그 선택 및 파싱 |
set | 중복 상품명 제거 |
dict | 상품 정보를 구조화 |
⛔ 주의 사항
- Selenium은 쿠팡 자동화 차단 정책에 의해 과도한 요청 시 IP 차단될 수 있습니다.
- 시간 지연 (time.sleep) 또는 WebDriverWait을 활용해 안정성 확보 필요
- 크롬드라이버 버전이 설치된 크롬 브라우저 버전과 일치해야 함
확장 아이디어
- 무한 스크롤 구현하여 더 많은 상품 수집
- 결과를 CSV, Excel, 또는 JSON으로 저장
- 상품별 URL, 이미지 링크 포함
아래는 요청하신 기능 3가지를 모두 포함한 쿠팡 통합 크롤러 확장 버전입니다:
포함 기능 요약
- 상품명, 가격, 평점 수집
- 평점 4.5 이상만 필터링
- 특정 브랜드만 추출 (예: 'Apple')
- 결과를 엑셀로 저장 (pandas 사용)
사전 준비 사항
- 패키지 설치:
pip install selenium beautifulsoup4 pandas openpyxl
- 크롬드라이버 설치 필요 (Chrome 브라우저와 동일 버전)
🧾 전체 코드
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from bs4 import BeautifulSoup
import time
import pandas as pd
# 크롬드라이버 실행
driver = webdriver.Chrome()
driver.get("https://www.coupang.com/")
# 검색어 입력
search_box = driver.find_element(By.NAME, "q")
search_box.send_keys("아이폰")
search_box.send_keys(Keys.RETURN)
time.sleep(3) # 렌더링 대기
# 렌더링된 HTML을 가져옴
html = driver.page_source
soup = BeautifulSoup(html, "html.parser")
# 상품 블록 추출
items = soup.select("li.search-product")
# 결과 저장용 리스트 및 중복 제거용 set
result = []
seen = set()
# 조건
TARGET_BRAND = "Apple"
MIN_RATING = 4.5
for item in items:
name_tag = item.select_one("div.name")
if not name_tag:
continue
name = name_tag.get_text(strip=True)
if name in seen:
continue
seen.add(name)
# 브랜드 필터
if TARGET_BRAND.lower() not in name.lower():
continue
# 가격
price_tag = item.select_one("strong.price-value")
price = price_tag.get_text(strip=True) if price_tag else "가격 없음"
# 평점
rating_tag = item.select_one("em.rating")
try:
rating = float(rating_tag.get_text(strip=True)) if rating_tag else 0
except:
rating = 0
# 평점 필터
if rating < MIN_RATING:
continue
result.append({
"상품명": name,
"가격": price,
"평점": rating
})
driver.quit()
# pandas로 엑셀 저장
df = pd.DataFrame(result)
df.to_excel("쿠팡_아이폰_상품_리스트.xlsx", index=False, engine='openpyxl')
print("엑셀 파일 저장 완료: 쿠팡_아이폰_상품_리스트.xlsx")
📂 결과 파일 예시
상품명 가격 평점
Apple 아이폰 14 Pro 128GB | 1,599,000 | 4.8 |
Apple 정품 라이트닝 케이블 | 25,000 | 4.6 |
주요 필터링 기준
항목 값 설명
브랜드 필터 | "Apple" | 상품명에 포함된 경우만 허용 |
평점 필터 | 4.5 이상 | 신뢰도 높은 상품만 추출 |
확장 옵션
- 무한스크롤 탐지 → 여러 페이지 크롤링
- 이미지, 상품 URL 포함
- 검색어 입력을 함수 매개변수로 분리
반응형