TikTok 동영상의 모든 댓글을 자동으로 수집하고 분석할 수 있는 Python 프로그램을 개발한 과정을 공유합니다. API 페이지네이션 처리부터 사용자 친화적인 진행률 표시까지, 실제 서비스 수준의 댓글 수집 도구를 만들어보겠습니다.
프로젝트 개요
개발 목표
- TikTok API를 활용한 댓글 자동 수집
- 페이지네이션을 통한 대량 데이터 처리
- 실시간 진행률 표시 및 사용자 피드백
- JSON 파일로 구조화된 데이터 저장
- Rate limiting 및 오류 처리
기술 스택
- 언어: Python 3
- HTTP 클라이언트: httpx (비동기 지원)
- 데이터 처리: JSON, datetime
- 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/>",
}
포인트:
- 최신 Chrome 브라우저 User-Agent 사용
- Referer 헤더로 정상적인 웹 트래픽 모방
- 필요시 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))
특징:
- cursor 기반의 안정적인 페이지네이션
has_more
플래그로 종료 조건 확인- 동적 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:,}개")
개선사항:
- 직관적인 진행률 표시
- 천 단위 구분 기호로 가독성 향상
- 총 댓글 수를 알 때와 모를 때 다른 표시 방식
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. 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 파일로 저장되었습니다.
확장 가능성
현재 구현의 강점
- 대량 데이터 안정적 처리
- 사용자 친화적인 실시간 피드백
- 구조화된 데이터 저장
- 오류 상황 안전 처리
- Rate limiting 고려
향후 개선 방향
- 비동기 처리로 성능 향상
- 다중 동영상 배치 처리
- 댓글 감정 분석 추가
- 데이터베이스 연동
- 웹 인터페이스 구현
- 실시간 댓글 모니터링
개발 팁
1. API 탐색 방법
브라우저 개발자 도구의 Network 탭에서 TikTok 댓글 로딩 요청을 분석하여 API 엔드포인트와 파라미터를 파악했습니다.
2. 헤더 최적화
실제 브라우저의 요청 헤더를 복사하여 사용하면 차단 확률을 크게 줄일 수 있습니다.
3. 테스트 전략
- 작은 동영상으로 먼저 테스트
- 다양한 댓글 수의 동영상으로 검증
- 네트워크 오류 상황 시뮬레이션
마무리
이번 프로젝트를 통해 다음과 같은 중요한 개발 원칙들을 적용해볼 수 있었습니다:
- 사용자 경험 중심 설계: 실시간 피드백과 직관적인 진행률 표시
- 안정적인 데이터 처리: 페이지네이션과 오류 처리
- 확장 가능한 구조: 모듈화된 함수 설계
- 실용적인 기능: JSON 저장과 메타데이터 관리
TikTok API의 변경에 대비하여 헤더나 파라미터를 쉽게 수정할 수 있도록 설계했으며, 다른 소셜 미디어 플랫폼으로도 확장 가능한 구조로 만들었습니다.
다음 개발기에서는 수집한 댓글 데이터를 활용한 감정 분석과 시각화 도구 개발 과정을 다뤄보겠습니다!
댓글