Post

스크래핑이 막혔을 때 대안을 찾아보자

4단계 폴백도 안 되는 케이스를 장벽 유형별로 분류하고 각각 현실적인 대안을 정리했다

스크래핑이 막혔을 때 대안을 찾아보자

스크래핑이 막혔을 때 대안을 찾아보자

curl_cffi부터 실제 Chrome 프로필까지 써도 안 되는 사이트가 있었다. 더 강한 봇 우회가 아니라 장벽 유형이 달랐고, 유형을 먼저 진단하는 게 해결책보다 중요했다.

1. 서론 (Introduction)

  • 문제/상황 (Problem):
    • 여러 단계 폴백 체인을 모두 써도 수집이 안 되는 사이트가 있었다. 단순히 방법이 부족한 게 아니었다.
  • 목적 (Purpose):
    • 수집 실패 원인을 유형별로 분류하고, 원인 하나를 받으면 맞는 대안 전략 이름과 설명을 반환하는 매핑 함수를 만든다.
  • 대상 (Target Audience):
    • 모든 방법을 써봤는데도 막힌 개발자

2. 방법 및 과정 (Methods & Process)

  • 배경 조사 및 데이터 (Data Collection):
    • 수집 실패는 크게 다섯 가지 유형으로 나뉜다. 봇 차단은 그중 하나일 뿐이고, 나머지는 우회가 아니라 접근 방식 자체를 바꿔야 하는 경우다.
    원인(enum)증상대안 전략
    bot_detection200인데 챌린지/차단 페이지StealthyFetcher 또는 실제 Chrome 프로필
    robots_blockrobots.txt 명시 차단우회 대신 공식 API·RSS 탐색
    cors브라우저에서만 오류, 서버 요청은 정상클라이언트 대신 서버에서 직접 요청
    login_wall로그인 페이지로 리다이렉트세션 쿠키 재사용 또는 북마크릿
    legal_restriction이용약관 수집 금지 조항포기 또는 정식 허가 요청
  • 접근 방법 (Approach Methods):
    • [방법 1]: BlockReason enum으로 원인을 고정 어휘로 관리하고, suggest_alternative(reason)이 (전략 이름, 설명) 튜플을 반환하게 했다.
    • [방법 2]: 상태 코드·리다이렉트 여부·CORS 오류 여부 같은 관측 가능한 증상만으로 원인을 추정하는 diagnose_from_symptom()을 별도로 뒀다. 확신이 없어도 일단 분류를 시작할 수 있게 하기 위해서다.
  • 분석 및 해결 프로세스 (Analysis Flow):
    • 도구/기술: Python, enum.Enum
    • 주요 단계: 증상 관찰 $\rightarrow$ diagnose_from_symptom()으로 원인 추정 $\rightarrow$ suggest_alternative()로 전략 조회 $\rightarrow$ 전략 실행
    • 결과 도출 및 검증: status_code=403, redirected_to_login=False, is_cors_error=False 조건을 넣으면 bot_detection으로 추정됐고, 이어서 stealth_or_real_profile 전략과 설명 문자열이 정확히 반환되는 것을 확인했다. cors, login_wall 두 원인도 각각 맞는 전략 문자열을 반환했다.

3. 결과 (Results)

  • 분석 결과 요약:
    • “수집 불가”를 하나의 문제로 뭉뚱그리지 않고 다섯 가지 원인으로 나누니 각각 다른 대안이 보였다.
    • CORS 장벽은 봇 차단이 아니라서 더 강한 우회 도구가 필요 없고, 서버에서 직접 요청하면 해결된다.
    • 원인 enum과 전략 매핑을 분리해두니 새 원인 유형이 생겨도 매핑 테이블에 한 줄만 추가하면 된다.

4. 인사이트 및 액션 (Insights & Action)

  • 인사이트 (Insight):
    • 수집 실패는 “더 강한 우회”가 아니라 “다른 전략”이 필요한 신호일 수 있다. 장벽 유형 진단이 해결책 탐색보다 먼저 와야 한다.
  • 실행 방안 (Action Plan):
    • 실패 시 응답 헤더, 상태 코드, 리다이렉트 URL을 먼저 확인해 diagnose_from_symptom()에 넣고, 반환된 전략부터 시도한다.
  • 한 줄 결론 (Key Takeaway):
    • 수집 불가는 “못하는 것”이 아니라 “방법을 바꿔야 한다는 신호”다. 샘플 코드
  • 다음 스텝 (Next Step):
    • diagnose_from_symptom()은 증상 세 가지만으로 원인을 추정해 정확도가 제한적이다. CORS와 봇 차단이 동시에 겹치는 경우처럼 증상이 섞이는 케이스는 이 단순 분류로는 구분하지 못한다.
This post is licensed under CC BY 4.0 by the author.