피드로 돌아가기
I Built 77 Web Scrapers — Here Are the 10 Patterns That Actually Work
Dev.toDev.to
Backend

I Built 77 Web Scrapers — Here Are the 10 Patterns That Actually Work

77개의 웹 스크레이퍼 개발을 통해 도출한 10가지 재사용 가능한 패턴을 체계화하여 스크레이퍼 개발 시간 단축

Alex Spinov2026년 3월 25일8intermediate

Context

웹 스크레이핑 프로젝트에서 일회성 스크립트 방식의 개발은 코드 재사용성이 낮고, 데이터 손실 위험이 높으며, 장시간 실행 시 진행 상황 파악이 어렵다는 문제가 있었다. 또한 속도 최적화, 오류 처리, 데이터 정규화 등 매번 반복해서 해결해야 하는 과제들이 있었다.

Technical Solution

  • TCP 커넥션 재사용: requests.Session() 을 통해 동일 도메인에 대한 반복 요청 시 매번 TCP 핸드셰이크 대신 기존 커넥션 재사용
  • 지수 백오프 재시도: 실패 응답 또는 429(Rate Limit) 상태 코드 수신 시 2의 거듭제곱 간격으로 대기 후 재시도 (1초, 2초, 4초...)
  • CSS 선택자 기반 데이터 추출: XPath 대신 soup.select() 를 사용하여 가독성 높은 데이터 추출
  • 제너레이터 기반 페이지네이션: 모든 페이지 데이터를 메모리에 적재하지 않고 yield 를 통해 순차 처리
  • 즉시 데이터 정규화: 데이터 추출 시점에 strip(), 통화 기호 제거, 쿼리 파라미터 제거 등 정규화 수행
  • 콘텐츠 해시 기반 중복 제거: MD5 해시를 이용해 동일한 항목 중복 여부를 Set 으로 빠르게 판별
  • 진행 상황 로깅: 처리 순서(i+1 / len(urls))와 추출 항목 수를 INFO 레벨로 기록
  • 증분 저장: 전체 스크래핑 완료 후가 아닌 항목별로 JSONL 포맷 파일에 flush() 로 즉시 디스크 기록
  • robots.txt 준수: urllib.robotparser.RobotFileParser 를 통해 스크래핑 전 해당 URL의 크롤링 허가 여부 확인
  • 명령줄 인자 기반 설정화: argparse 를 통해 --urls, --output, --max-pages, --delay 등 파라미터 외부 주입 가능화

Impact

요청 당 2~5배 속도 향상 (TCP 커넥션 재사용 시)

Key Takeaway

구성 → 페칭 → 데이터 추출 → 정규화 → 중복 제거 → 저장의 6단계 메타 패턴을 따르면, 도메인 특성만 변경하고 골격 구조를 재사용할 수 있는 확장성 높은 스크레이퍼를 설계할 수 있다.


다수의 웹 페이지에서 데이터를 수집하는 엔지니어는 requests.Session() 재사용, 지수 백오프 재시도, 증분 JSONL 저장, 진행 상황 로깅 4가지를 필수로 적용하면 장시간 실행 시 중간 결과 손실 방지와 디버깅 효율을 동시에 확보할 수 있다.

원문 읽기