스크래핑이 막혔을 때 대안을 찾아보자
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]:
BlockReasonenum으로 원인을 고정 어휘로 관리하고,suggest_alternative(reason)이 (전략 이름, 설명) 튜플을 반환하게 했다. - [방법 2]: 상태 코드·리다이렉트 여부·CORS 오류 여부 같은 관측 가능한 증상만으로 원인을 추정하는
diagnose_from_symptom()을 별도로 뒀다. 확신이 없어도 일단 분류를 시작할 수 있게 하기 위해서다.
- [방법 1]:
- 분석 및 해결 프로세스 (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두 원인도 각각 맞는 전략 문자열을 반환했다.
- 도구/기술: Python,
3. 결과 (Results)
- 분석 결과 요약:
- “수집 불가”를 하나의 문제로 뭉뚱그리지 않고 다섯 가지 원인으로 나누니 각각 다른 대안이 보였다.
- CORS 장벽은 봇 차단이 아니라서 더 강한 우회 도구가 필요 없고, 서버에서 직접 요청하면 해결된다.
- 원인 enum과 전략 매핑을 분리해두니 새 원인 유형이 생겨도 매핑 테이블에 한 줄만 추가하면 된다.
4. 인사이트 및 액션 (Insights & Action)
- 인사이트 (Insight):
- 수집 실패는 “더 강한 우회”가 아니라 “다른 전략”이 필요한 신호일 수 있다. 장벽 유형 진단이 해결책 탐색보다 먼저 와야 한다.
- 실행 방안 (Action Plan):
- 실패 시 응답 헤더, 상태 코드, 리다이렉트 URL을 먼저 확인해
diagnose_from_symptom()에 넣고, 반환된 전략부터 시도한다.
- 실패 시 응답 헤더, 상태 코드, 리다이렉트 URL을 먼저 확인해
- 한 줄 결론 (Key Takeaway):
- 수집 불가는 “못하는 것”이 아니라 “방법을 바꿔야 한다는 신호”다. 샘플 코드
- 다음 스텝 (Next Step):
diagnose_from_symptom()은 증상 세 가지만으로 원인을 추정해 정확도가 제한적이다. CORS와 봇 차단이 동시에 겹치는 경우처럼 증상이 섞이는 케이스는 이 단순 분류로는 구분하지 못한다.
This post is licensed under CC BY 4.0 by the author.