본문 바로가기

카테고리 없음

Python 크롤링, CPU 코어 수가 정말 중요할까? 실전 성능 비교

반응형

대규모 웹 데이터 수집 프로젝트를 시작하면서 가장 먼저 고민했던 것은 하드웨어 선택이었습니다. "멀티프로세싱을 위해 8코어 CPU를 사야 할까?", "구형 4코어와 최신 2코어 중 어떤 게 나을까?" 이론적으로는 코어 수가 많을수록 좋다고 하지만, 실제로는 어떨까요? 하루 1,500개 이상의 데이터를 수집하는 실전 프로젝트를 통해 직접 테스트한 결과를 공유합니다.

1. 프로젝트 배경: 왜 CPU 성능이 중요해졌나

Python과 Playwright를 활용한 대규모 웹 크롤링 프로젝트를 진행하면서, 데이터 수집 속도를 높이기 위해 멀티프로세싱을 도입하기로 했습니다.

초기에는 단일 프로세스로 하루 1,500개 정도의 데이터를 수집했는데, 전국 단위 데이터베이스를 구축하려면 너무 오랜 시간이 걸린다는 문제가 있었습니다.

핵심 질문: 병렬처리로 속도를 높이려면 어떤 CPU가 필요할까?

2. 테스트 환경: 비교 대상 CPU

보유 중인 두 대의 시스템으로 실제 성능을 비교했습니다.

Intel Core i7-3770K

  • 출시: 2012년
  • 코어/스레드: 4코어 8스레드
  • 기본 클럭: 3.5GHz
  • 터보 부스트: 3.9GHz
  • L3 캐시: 8MB
  • TDP: 77W

Intel Pentium G7400

  • 출시: 2022년
  • 코어/스레드: 2코어 4스레드
  • 기본 클럭: 3.7GHz
  • 터보 부스트: 없음
  • L3 캐시: 6MB
  • TDP: 46W

i7-3770K는 10년 더 오래된 CPU지만 물리 코어가 2배 많고, G7400은 최신 아키텍처로 단일 스레드 성능과 전력 효율이 우수합니다.

3. 크롤링에서 CPU 성능이 중요한 이유

3.1 Playwright의 리소스 특성

Playwright는 실제 브라우저를 구동하는 방식이기 때문에, 각 브라우저 인스턴스마다 상당한 리소스를 소비합니다:

  • 메모리: 인스턴스당 200~300MB
  • CPU: JavaScript 실행 및 DOM 렌더링
  • 프로세스: 각 브라우저가 독립적인 프로세스로 실행

3.2 멀티프로세싱 구조

from playwright.sync_api import sync_playwright
from multiprocessing import Pool

def crawl_data(keyword):
    with sync_playwright() as p:
        browser = p.chromium.launch(headless=True)
        page = browser.new_page()
        # 크롤링 로직
        browser.close()

# 병렬 실행
keywords = ['키워드1', '키워드2', '키워드3', '키워드4']
with Pool(processes=4) as pool:
    results = pool.map(crawl_data, keywords)

이론상 4개의 프로세스를 동시에 실행하면 4배의 속도 향상을 기대할 수 있습니다. 하지만 실제로는 어떨까요?

4. 실전 테스트 결과

4.1 단일 프로세스 성능 (베이스라인)

CPU 하루 수집량 시간당 수집량 평균 소비전력
i7-3770K 1,500개 62개 90~100W
G7400 1,500개 62개 50~55W
결과: 단일 프로세스에서는 두 CPU의 성능 차이가 거의 없었습니다. 크롤링은 대부분의 시간을 네트워크 대기(I/O bound)에 사용하기 때문입니다.

4.2 멀티프로세싱 성능

프로세스 수 i7-3770K (4코어) G7400 (2코어)
2개 병렬 하루 3,000개 (안정) 하루 3,000개 (안정)
3개 병렬 하루 4,500개 (안정) 하루 4,000개 (불안정)
4개 병렬 하루 6,000개 (안정) 시스템 과부하

4.3 핵심 발견사항

1. 크롤링은 CPU bound가 아닌 I/O bound 작업

실제 CPU 사용 시간은 전체 작업의 10~20%에 불과했습니다. 대부분의 시간은:

  • 페이지 로딩 대기: 1~3초
  • JavaScript 렌더링: 1~2초
  • 의도적인 딜레이(차단 방지): 2~5초

2. 차단 방지가 가장 큰 병목

이론적으로는 8개 프로세스로 8배 속도를 낼 수 있지만, 실제로는 같은 IP에서 너무 많은 요청을 보내면 차단당합니다. 안전한 속도:

  • 시간당 200~300개
  • 하루 5,000~7,000개
  • 요청당 3~7초 간격

5. 비용 분석: ROI 계산

5.1 전기료 비교

시스템 소비전력 월간 전기료 (24시간 가동)
i7-3770K (4프로세스) 90~100W 약 15,000원
G7400 (2프로세스) 50~60W 약 9,000원
차액 - 약 6,000원/월

5.2 시간 가치 계산

10만 개 데이터 수집을 목표로 한다면:

구성 하루 수집량 소요 기간 월 전기료
G7400 (1프로세스) 1,500개 67일 9,000원
G7400 (2프로세스) 3,000개 33일 9,000원
i7-3770K (4프로세스) 6,000개 17일 15,000원

결론: i7-3770K는 전기료는 더 나가지만, 프로젝트 완성 시간을 50일 단축시킵니다. 데이터 기반 서비스의 경우 빠른 출시가 수익 창출로 이어지므로 투자 가치가 충분합니다.

6. 안전한 크롤링 전략

⚠️ 중요: 웹사이트 크롤링 시에는 반드시 해당 사이트의 이용약관과 robots.txt를 확인하고, 서버에 과부하를 주지 않도록 주의해야 합니다.

6.1 차단 방지 기법

import time
import random
from playwright.sync_api import sync_playwright

def safe_crawl(url):
    with sync_playwright() as p:
        # headless 탐지 회피
        browser = p.chromium.launch(
            headless=False,
            args=['--disable-blink-features=AutomationControlled']
        )
        
        # 사용자 에이전트 설정
        context = browser.new_context(
            user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64)...'
        )
        
        page = context.new_page()
        
        # 랜덤 딜레이 (중요!)
        time.sleep(random.uniform(3, 7))
        
        page.goto(url)
        
        # 사람처럼 행동
        page.mouse.move(
            random.randint(100, 500),
            random.randint(100, 500)
        )
        time.sleep(random.uniform(2, 4))
        
        # 데이터 수집...
        
        browser.close()

6.2 권장 설정값

  • 요청당 딜레이: 3~7초 (랜덤)
  • 시간당 요청: 200~300개 이하
  • 하루 최대: 5,000~7,000개
  • User-Agent: 실제 브라우저와 동일하게
  • Headless 모드: False (느리지만 안전)

7. 실전 권장사항

7.1 CPU 선택 가이드

목적 권장 CPU 이유
소규모 크롤링
(하루 1,000개 이하)
G7400 (2코어) 저전력, 저발열, 충분한 성능
중규모 크롤링
(하루 3,000~5,000개)
G7400 (2코어)
또는 i5 (4코어)
2~3 프로세스 병렬 실행
대규모 크롤링
(하루 5,000개 이상)
i7 (4코어 이상) 4개 이상 병렬 처리
크롤링 + 데이터 가공 i7/Ryzen 7 (8코어) 크롤링과 분석 동시 수행

7.2 최적 구성: 2개 프로세스 병렬

실전 테스트 결과, 2개 프로세스 병렬이 가장 안정적이었습니다:

  • ✅ 성능: 단일 대비 2배 (하루 3,000개)
  • ✅ 안전성: 차단 위험 최소화
  • ✅ 효율: G7400으로도 충분
  • ✅ 비용: 추가 전기료 거의 없음
# 최적 구성 예시
from multiprocessing import Pool

def crawl_by_category(config):
    region, category = config
    # 각 프로세스가 독립적인 영역 크롤링
    crawl_data(f"{region} {category}")

# 2개 프로세스로 안전하게 분산
tasks = [
    ('서울+경기', '카테고리A'),
    ('부산+대구', '카테고리B')
]

with Pool(2) as pool:
    results = pool.map(crawl_by_category, tasks)

7.3 8코어는 오버스펙?

8코어 CPU는 순수 크롤링만으로는 과잉 투자입니다. 하지만 다음 경우에는 의미가 있습니다:

  • 여러 사이트 동시 크롤링: 각 사이트별로 독립 프로세스
  • 데이터 후처리 병행: Pandas, NumPy 등 대용량 데이터 분석
  • AI 모델 추론: 수집 데이터로 즉시 분석/분류
  • 다중 프로젝트 운영: 크롤링 + 웹서버 + DB 등

8. 대안: 공식 API 활용

크롤링의 리스크가 부담된다면 공식 API를 활용하세요:

장점

  • ✅ 법적 문제 없음
  • ✅ 차단 걱정 없음
  • ✅ 안정적인 데이터 품질
  • ✅ 빠른 속도 (별도 렌더링 불필요)

추천 API

  • 공공데이터포털: 정부/공공기관 데이터 (무료)
  • 카카오 로컬 API: 장소 검색 (월 30만 건 무료)
  • 네이버 검색 API: 블로그, 뉴스 등 (일 25,000건 무료)

9. 실전 팁

9.1 메모리 관리

# 주기적으로 브라우저 재시작
def crawl_with_restart(urls, restart_every=100):
    for i, url in enumerate(urls):
        if i % restart_every == 0:
            if 'browser' in locals():
                browser.close()
            browser = p.chromium.launch()
        
        # 크롤링 수행
        crawl_single(browser, url)

9.2 에러 처리 및 재시도

import time
from tenacity import retry, stop_after_attempt, wait_exponential

@retry(
    stop=stop_after_attempt(3),
    wait=wait_exponential(multiplier=1, min=4, max=10)
)
def robust_crawl(url):
    try:
        # 크롤링 로직
        return fetch_data(url)
    except Exception as e:
        print(f"Error on {url}: {e}")
        raise

9.3 로깅과 모니터링

import logging

logging.basicConfig(
    filename='crawling.log',
    level=logging.INFO,
    format='%(asctime)s - %(levelname)s - %(message)s'
)

def crawl_with_log(url):
    logging.info(f"Starting: {url}")
    try:
        result = crawl(url)
        logging.info(f"Success: {url} - {len(result)} items")
        return result
    except Exception as e:
        logging.error(f"Failed: {url} - {str(e)}")
        raise

10. 결론

Python 웹 크롤링에서 CPU 코어 수는 중요하지만, 생각만큼 드라마틱한 차이를 만들지는 않습니다.

핵심 요약

  1. 2코어도 충분: G7400 같은 저전력 CPU로도 하루 3,000개 수집 가능
  2. 병목은 네트워크: CPU보다는 네트워크 대기 시간이 더 중요
  3. 안전이 우선: 속도보다 차단 방지가 더 중요
  4. 2개 프로세스가 최적: 성능과 안정성의 균형점
  5. 8코어는 다목적용: 크롤링 외 작업이 많을 때만 유용

최종 권장사항

  • 예산 중시: G7400 (2코어) + 2프로세스 병렬
  • 성능 중시: i5/i7 (4코어) + 4프로세스 병렬
  • 다목적 사용: Ryzen 7 (8코어) + 복합 작업

가장 중요한 것은 하드웨어 스펙이 아니라 안전한 크롤링 전략효율적인 코드 설계입니다. 적절한 딜레이, 에러 처리, 로깅을 갖춘다면 2코어 CPU로도 충분히 강력한 크롤링 시스템을 구축할 수 있습니다.

면책 조항: 이 글의 내용은 기술적 실험 결과를 공유하기 위한 것입니다. 웹 크롤링 시에는 반드시 해당 웹사이트의 이용약관과 robots.txt를 확인하고, 법률을 준수해야 합니다. 무분별한 크롤링으로 인한 법적 책임은 사용자 본인에게 있습니다.

반응형