[트러블 슈팅]셀레니움 방식 크롤링 수정

2star_·2025년 1월 25일
0

최종 프로젝트

목록 보기
28/32

1. 문제

  • AWS 서버에서 Selenium을 이용해 리뷰를 크롤링하는 코드를 실행했더니 CPU 사용량이 100%에 근접하는 현상이 발생하였다.
  • EC2 같이 스펙이 낮은 서버에서 헤드리스 크롬(Chromedriver)을 구동할 경우, 브라우저 엔진이 동작하면서 리소스 사용량이 크게 늘어날 수 있다.

2. 문제 원인

  1. Selenium 자체의 무거운 동작 방식
    • Selenium은 실제 브라우저(크롬 등)를 띄워서 페이지 로딩, JavaScript 실행 등을 처리한다.
    • 이 과정에서 CPU와 메모리를 많이 사용하게 된다.
  2. EC2 인스턴스 환경
    • 일반적으로 작은 EC2 인스턴스는 CPU 자원이 제한적이라, 브라우저를 다수 실행하거나 연속 크롤링 시 CPU 사용량이 급증하기 쉽다
  3. 페이지 내용이 이미 HTML에 포함
    • Steam의 “Recommended” 리뷰는 자바스크립트 없이도 정적 HTML로 되어 있는 경우가 많다
    • 즉, 굳이 실제 브라우저로 렌더링하지 않아도 requests + BeautifulSoup 같은 간단한 방식으로 충분히 파싱 가능하다

3. 해결 방안

3.1. Selenium 제거 및 BeautifulSoup으로 전환

  • requestsBeautifulSoup만 사용해 HTML을 가져오고, 필요한 요소를 파싱한다.
  • 브라우저 엔진을 구동하지 않으므로 CPU 사용량이 매우 낮아진다.

수정 전 핵심 흐름

  1. webdriver.Chrome으로 헤드리스 브라우저 실행
  2. driver.get(url)로 페이지 열기
  3. 필요한 셀렉터(.review_box)로 요소 찾기
  4. driver.quit()로 브라우저 종료

수정 후 핵심 흐름

  1. requests.get(url)로 HTML을 텍스트 형태로 받아오기
  2. BeautifulSoup(html, "html.parser")로 DOM 파싱
  3. .select(".review_box") 등 원하는 요소에 접근
  4. HTML 내 리뷰가 보이는지 확인 후 app_id 등을 추출

3.2. 코드

import requests
from bs4 import BeautifulSoup

def fetch_top3_reviews(steam_id_str):
    url = f"https://steamcommunity.com/profiles/{steam_id_str}/recommended"
    headers = {
        "User-Agent": (
            "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
            "AppleWebKit/537.36 (KHTML, like Gecko) "
            "Chrome/87.0.4280.66 Safari/537.36"
        )
    }

    # HTML 가져오기
    response = requests.get(url, headers=headers, timeout=10)
    if response.status_code != 200:
        return []

    # 파싱
    soup = BeautifulSoup(response.text, "html.parser")
    boxes = soup.select(".review_box")

    recommended = []
    for box in boxes:
        try:
            title_elem = box.select_one(".vote_header .title > a")
            if not title_elem or "Recommended" not in title_elem.text:
                continue

            href = title_elem.get("href", "")
            if "/recommended/" not in href:
                continue

            app_id = href.split("/recommended/")[1].split("/")[0]
            recommended.append({"app_id": app_id})

            if len(recommended) >= 3:
                break
        except Exception as e:
            # 에러 발생 시 로그 남기고 다음 박스로 진행
            print(f"리뷰 박스 처리 중 오류: {e}")
            continue

    return recommended
  • 기존에 WebDriverWait, driver.find_elements 등을 사용하던 부분이 사라졌고, 대신 BeautifulSoup을 통한 단순 HTML 파싱으로 변경되었다.
  • 최대 3개까지만 리뷰 데이터를 가져오며, 각 리뷰에서 app_id를 추출한다.

3.3. 적용 효과

  • CPU 사용률 감소: 브라우저 엔진을 구동하지 않으므로 EC2에서 CPU 부하가 크게 줄어든다.

4. 트러블슈팅 요약

  • 문제: Selenium으로 인한 브라우저 구동 → CPU 사용량 100% 근접
  • 원인: 실제 브라우저 엔진이 동작하면서 리소스 사용량 급증
  • 해결: 정적 HTML 파싱 가능하므로 requests + BeautifulSoup 도입
  • 결과: CPU 부하 감소, 코딩 구조 단순화
profile
안녕하세요.

0개의 댓글

관련 채용 정보