수집 전략을 자동으로 고르는 하이브리드 클라이언트를 만들어보자
httpx로 먼저 시도하고 미흡하면 playwright로 올라가며 도메인별 전략을 학습하는 하이브리드 클라이언트를 만들어보자
수집 전략을 자동으로 고르는 하이브리드 클라이언트를 만들어보자
수집 전략을 자동으로 고르는 하이브리드 클라이언트를 만들어보자
앞 글에서 정리한 네 방식을 하나로 묶어, 가벼운 것부터 시도하고 막히면 무거운 쪽으로 올라가는 하이브리드 클라이언트를 만들어보자.
1. 서론 (Introduction)
- 문제/상황 (Problem):
- 사이트마다 필요한 수집 방식이 달라, 매번 사람이 httpx로 충분한지 playwright가 필요한지 판단해 코드를 바꾼다.
- 목적 (Purpose):
- 클라이언트가 결과를 보고 전략을 스스로 고르게 하여, 사이트별 분기를 사람 손에서 떼어낸다.
- 대상 (Target Audience):
- 정적·동적·차단이 뒤섞인 다수 사이트를 한 코드로 수집하려는 개발자
2. 방법 및 과정 (Methods & Process)
- 배경 조사 및 데이터 (Data Collection):
- 네 방식을 무게순 사다리로 보고, 빠른 것부터 시도해 미흡할 때만 올라가도록 설계했다. 한 번 올라간 도메인은 그 전략을 기억해 다음부터 바로 시작한다.
| 전략 | 언제 쓰는가 | 비용 |
|---|---|---|
| httpx | 정적·정상 응답(2xx, 본문 충분) | 가장 빠름 |
| httpx → playwright 에스컬레이션 | 본문 미흡·4xx/5xx·JS 의존·차단 페이지 | 느림 |
| 도메인 전략 캐시 | 같은 도메인 재요청 | 판정 오버헤드 제거 |
- 접근 방법 (Approach Methods):
- [방법 1]: httpx로 먼저 받고
needs_escalation(상태코드·본문 길이·JS/차단 신호)으로 미흡 여부를 판정한다. - [방법 2]: 미흡하면 playwright로 다시 받고, 그 도메인의 성공 전략을 캐시에 저장해 다음 요청에 재사용한다.
- [방법 1]: httpx로 먼저 받고
- 분석 및 해결 프로세스 (Analysis Flow):
- 도구/기술: Python, httpx, playwright, beautifulsoup4
- 주요 단계: httpx 요청 $\rightarrow$ 미흡 판정 $\rightarrow$ 필요 시 playwright 에스컬레이션 $\rightarrow$ 도메인 전략 캐시 저장
- 결과 도출 및 검증: 요청마다 완성된 HTML(static)과 빈 셸+JS(spa)를 무작위로 주는 데모 서버에 8회 요청하니, 전략이
httpx와httpx→playwright사이에서 자동으로 갈렸다. 본문이 충분하면 httpx에서 끝나고, 빈 셸이 오면 playwright로 승격해 JS 렌더 후 제목·메타를 추출했다.
| 회차 | 전략 | title |
|---|---|---|
| 1회차 | httpx→playwright | 정적 렌더 페이지 |
| 3회차 | httpx | 정적 렌더 페이지 |
| 6회차 | httpx→playwright | JS 렌더 페이지 |
3. 결과 (Results)
- 분석 결과 요약:
- 사이트별 분기 코드가 사라지고, 클라이언트가 결과를 보고 전략을 스스로 선택한다.
- 도메인 전략 캐시로 두 번째 요청부터는 판정 단계를 건너뛰어 불필요한 시도를 줄인다.
4. 인사이트 및 액션 (Insights & Action)
- 인사이트 (Insight):
- 전략 선택은 사람이 미리 정하는 설정이 아니라, 응답을 보고 코드가 내리는 결정으로 옮길 수 있다.
- 실행 방안 (Action Plan):
- 신규 수집 작업은 이 하이브리드 클라이언트를 기본 진입점으로 삼고, 판정 규칙은 사이트 경험이 쌓일수록 보강한다.
- 한 줄 결론 (Key Takeaway):
- 가벼운 것부터 시도하고 막히면 올라가는 전략을 코드에 맡기자. 샘플 코드
- 다음 스텝 (Next Step):
- 수집 전략을 자동화했으니, 브라우저 자동화 자체를 클래스로 다듬어 재사용해보자.
This post is licensed under CC BY 4.0 by the author.