TokyoAJ

도쿄아재

PYTHON 2025.06.28

TikTok 댓글 수집기 개발기 - 페이지네이션 & 사용자 친화적 UI

TikTok 동영상의 모든 댓글을 자동으로 수집하고 분석할 수 있는 Python 프로그램을 개발한 과정을 공유합니다. API 페이지네이션 처리부터 사용자 친화적인 진행률 표시까지, 실제 서비스 수준의 댓글 수집 도구를 만들어보겠습니다.


프로젝트 개요

개발 목표

  1. TikTok API를 활용한 댓글 자동 수집
  2. 페이지네이션을 통한 대량 데이터 처리
  3. 실시간 진행률 표시 및 사용자 피드백
  4. JSON 파일로 구조화된 데이터 저장
  5. Rate limiting 및 오류 처리

기술 스택

  1. 언어: Python 3
  2. HTTP 클라이언트: httpx (비동기 지원)
  3. 데이터 처리: JSON, datetime
  4. API: TikTok 댓글 API

핵심 기술 구현

1. API 요청 및 헤더 설정

브라우저를 모방하여 차단을 방지하는 헤더 설정이 핵심입니다:

HEADERS = {
"User-Agent": (
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/113.0.0.0 Safari/537.36"
),
"Referer": "<https://www.tiktok.com/>",
}

포인트:

  1. 최신 Chrome 브라우저 User-Agent 사용
  2. Referer 헤더로 정상적인 웹 트래픽 모방
  3. 필요시 Cookie 헤더 추가 가능

2. 페이지네이션 처리

TikTok API의 cursor 기반 페이지네이션을 효율적으로 처리:

while True:
params = {
"aid": "1988",
"aweme_id": aweme_id,
"count": str(COMMENTS_PER_PAGE),
"cursor": str(cursor),
}
response = httpx.get(API_URL, params=params, headers=HEADERS)
data = response.json()
comments = data.get("comments", [])
if not comments or not data.get("has_more", False):
break
all_comments.extend(comments)
cursor = data.get("cursor", cursor + len(comments))

특징:

  1. cursor 기반의 안정적인 페이지네이션
  2. has_more 플래그로 종료 조건 확인
  3. 동적 cursor 업데이트

3. 사용자 친화적 진행률 표시

실시간으로 수집 상황을 사용자에게 알려주는 UI 구현:

def print_progress(page, current_page_count, total_collected, total_from_api):
if total_from_api:
progress = (total_collected / total_from_api) * 100
print(f"페이지 {page}: {current_page_count}개 수집 | "
f"누적: {total_collected:,}개 / {total_from_api:,}개 ({progress:.1f}%)")
else:
print(f"페이지 {page}: {current_page_count}개 수집 | 누적: {total_collected:,}개")

개선사항:

  1. 직관적인 진행률 표시
  2. 천 단위 구분 기호로 가독성 향상
  3. 총 댓글 수를 알 때와 모를 때 다른 표시 방식

4. 구조화된 데이터 저장

수집한 댓글을 분석 가능한 형태로 저장:

save_data = {
"aweme_id": aweme_id,
"total_comments_from_api": total_from_api,
"collected_comments_count": len(comments),
"collection_success_rate": (len(comments) / total_from_api * 100) if total_from_api else None,
"collected_at": timestamp,
"total_pages": total_pages,
"comments": comments
}

메타데이터 포함:

  1. 수집 성공률 계산
  2. 타임스탬프 기록
  3. 페이지 정보 저장

고급 기능 구현

1. Rate Limiting 방지

REQUEST_DELAY = 0.5 # 0.5초 대기
time.sleep(REQUEST_DELAY)

API 호출 간격을 두어 서버 부하를 줄이고 차단을 방지합니다.

2. 댓글 미리보기

def print_preview_comments(comments, preview_count=2):
for i, comment in enumerate(comments[:preview_count], 1):
comment_text = comment.get('text', '').replace('\n', ' ')[:40]
ellipsis = '...' if len(comment.get('text', '')) > 40 else ''
print(f" {comment_text}{ellipsis}")

실시간으로 수집되는 댓글의 내용을 미리보기로 제공합니다.

3. 오류 처리 및 복구

try:
response = httpx.get(API_URL, params=params, headers=HEADERS, timeout=REQUEST_TIMEOUT)
if response.status_code != 200:
print(f"요청 실패! 상태 코드: {response.status_code}")
break
except Exception as e:
print(f"오류 발생: {e}")
break

네트워크 오류나 API 오류에 대한 안전한 처리를 구현했습니다.

실행 결과 예시

TikTok 동영상 ID: 7495754257346448648
모든 댓글을 가져오는 중...
======================================================================
페이지 1 요청 중... (cursor: 0)
HTTP Status: 200
총 댓글 수 (API): 1,234개
--------------------------------------------------
페이지 1: 20개 수집 | 누적: 20개 / 1,234개 (1.6%)
정말 재미있는 영상이네요!
이런 콘텐츠 더 올려주세요~
페이지 2 요청 중... (cursor: 20)
...
======================================================================
수집 완료 요약:
동영상 ID: 7495754257346448648
API 총 댓글 수: 1,234개
실제 수집한 댓글: 1,198개
수집 성공률: 97.1%
총 페이지 수: 60개

댓글이 comments/7495754257346448648_20250628_125249_comments_list.json 파일로 저장되었습니다.

확장 가능성

현재 구현의 강점

  1. 대량 데이터 안정적 처리
  2. 사용자 친화적인 실시간 피드백
  3. 구조화된 데이터 저장
  4. 오류 상황 안전 처리
  5. Rate limiting 고려

향후 개선 방향

  1. 비동기 처리로 성능 향상
  2. 다중 동영상 배치 처리
  3. 댓글 감정 분석 추가
  4. 데이터베이스 연동
  5. 웹 인터페이스 구현
  6. 실시간 댓글 모니터링

개발 팁

1. API 탐색 방법

브라우저 개발자 도구의 Network 탭에서 TikTok 댓글 로딩 요청을 분석하여 API 엔드포인트와 파라미터를 파악했습니다.

2. 헤더 최적화

실제 브라우저의 요청 헤더를 복사하여 사용하면 차단 확률을 크게 줄일 수 있습니다.

3. 테스트 전략

  1. 작은 동영상으로 먼저 테스트
  2. 다양한 댓글 수의 동영상으로 검증
  3. 네트워크 오류 상황 시뮬레이션

마무리

이번 프로젝트를 통해 다음과 같은 중요한 개발 원칙들을 적용해볼 수 있었습니다:

  1. 사용자 경험 중심 설계: 실시간 피드백과 직관적인 진행률 표시
  2. 안정적인 데이터 처리: 페이지네이션과 오류 처리
  3. 확장 가능한 구조: 모듈화된 함수 설계
  4. 실용적인 기능: JSON 저장과 메타데이터 관리

TikTok API의 변경에 대비하여 헤더나 파라미터를 쉽게 수정할 수 있도록 설계했으며, 다른 소셜 미디어 플랫폼으로도 확장 가능한 구조로 만들었습니다.

다음 개발기에서는 수집한 댓글 데이터를 활용한 감정 분석과 시각화 도구 개발 과정을 다뤄보겠습니다!

댓글