자동화 slecs

웹 크롤링 정확도 높이고 속도 제한 회피

목차

한국 그룹을 자동 발견하는 과정에서 두 가지 문제가 누적돼 있었다. 검색 결과에 부적절한 그룹들이 섞여 들어오는 것과, 외부 위키 API를 너무 빨리 두드려서 속도 제한(429)에 걸리는 것. 이번 fix에서 relevance 필터와 throttle 메커니즘을 함께 넣어서 정확도와 안정성을 동시에 높였다.

문제: 노이즈와 API 응답 불안정

자동화 봇이 그룹 정보를 수집할 때 꼭 맞닥뜨리는 두 가지 함정이 있다.

첫째, 검색 결과의 노이즈다. "한국 그룹"으로 필터링할 때 단순히 키워드나 멤버십 기반으로만 판단하면 엉뚱한 데이터가 들어온다. 예컨대 그룹 제목은 영문인데 한국 사용자가 많아서 포함되거나, 메타데이터는 부정확하면서 마침 한국 관련 키워드가 들어간 경우들이다. 이런 noise는 나중에 데이터 품질을 떨어뜨리고, 팀에서 결과를 신뢰하기 어렵게 만든다.

둘째, 외부 API 속도 제한이다. 위키나 웹 API에 무한정 요청을 보내면, 결국 서버는 너무 많은 요청이라며 429 Too Many Requests를 내뱉고 차단해 버린다. 그러면 배치 작업이 중간에 끊기고, 재시도 로직이 없으면 데이터 수집이 불완전해진다. 이건 단순한 에러가 아니라 "봇이 신뢰할 수 없다"는 신호다.

해결책: relevance 필터 + throttle

변경한 두 파일의 역할과 각각의 개선을 정리하면:

파일 목적 변경 내용
bot/discover_groups.py 한국 그룹 검색 및 필터링 Relevance 스코어 기반 필터 추가
bot/seed_groups.py 초기 데이터 수집 및 보강 위키 API 요청 throttle 적용

discover_groups.py: relevance 필터 도입

한국 그룹을 찾을 때 단순히 "한국 사용자가 X명 이상" 같은 기준만으로는 부족하다. 이제 여러 신호를 조합해서 relevance 스코어를 계산한다:
- 그룹 제목·설명에 한국어/한국 관련 키워드가 있는가
- 멤버십 분포가 한국 중심인가
- 활동 시간대가 한국 시간과 부합하는가
- 태그나 카테고리가 한국 관련인가

이 스코어가 일정 threshold 이상인 그룹만 최종 결과에 포함시킴으로써, noise를 확연히 줄인다.

seed_groups.py: throttle 메커니즘 추가

외부 API를 호출할 때마다 의도적으로 delay를 삽입한다. 예를 들어:

# 개념적 패턴
for group in groups_to_enrich:
    response = wiki_api.fetch(group)
    time.sleep(0.5)  # 요청 간 500ms 대기

이렇게 하면 초당 요청 수를 제어해서 서버 부하를 줄이고, 429 에러를 대부분 피할 수 있다. 또한 exponential backoff를 함께 쓰면, 혹시 throttling이 발생해도 자동으로 대기 시간을 늘려서 재시도한다.

왜 이 둘을 함께 처리했나

언뜻 보면 두 문제는 독립적이다. 하지만 함께 처리해야 할 이유가 있었다.

relevance 필터만 추가하면, 발견하는 그룹 수는 줄지만 API 요청은 여전히 많다 (필터링 전에 일단 다 조회하니까). throttle만 추가하면, API는 안정적이지만 부정확한 결과가 계속 쌓인다.

팀 입장에서 보면, 정확한 데이터를 시간에 맞춰 수집받는 게 중요하다. 둘 다 없으면 "결과는 많은데 믿을 수 없고", "결과는 정확한데 자주 실패"가 되는데, 둘 다 있으니 "정확하고 안정적"이 된다.

배운 점: 자동화는 강건함을 먼저

자동화 봇의 버그는 보통 두 가지 유형이다. 하나는 논리 버그(잘못된 필터링), 다른 하나는 환경 버그(API 응답 실패). 단순히 "코드가 맞으면 된다"고 생각하면 첫 번째만 본다. 하지만 프로덕션에서 도는 자동화는 외부 시스템과 엮여 있으므로, 환경 버그도 마찬가지로 심각하다.

이번 fix를 통해 팀에 전달한 메시지는 이거다:
- 정확성(relevance)과 안정성(throttle)은 동시에 고려하는 게 맞다
- 배치 작업이 자주 실패하거나 결과가 부정확하면, 각각의 원인을 분석해서 모두 손봐야 한다
- 외부 API와 상호작용할 때는 rate limiting을 기본으로 생각하자

다음엔 비슷한 수집 로직에서도 같은 패턴을 먼저 적용할 수 있을 것 같다.


🛒 이 글과 어울리는 추천 상품

*위 링크는 쿠팡파트너스 활동의 일환이며, 일정액의 수수료를 제공받을 수 있습니다.

댓글 0

첫 댓글 달아줘.