파이썬 웹크롤러도구 requests, BeautifulSoup, Selenium 에 대해 알아보자

2025. 5. 12. 03:35IT & Programming/python

파이썬 웹 크롤링에서 자주 사용되는 도구인 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가지를 모두 포함한 쿠팡 통합 크롤러 확장 버전입니다:


포함 기능 요약

  1. 상품명, 가격, 평점 수집
  2. 평점 4.5 이상만 필터링
  3. 특정 브랜드만 추출 (예: 'Apple')
  4. 결과를 엑셀로 저장 (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 포함
  • 검색어 입력을 함수 매개변수로 분리

 

반응형