TikTok 영상의 좋아요, 댓글, 공유, 재생수 같은 동영상 통계 데이터를 자동으로 추출하고 싶을 때가 있습니다. 웹 크롤러와는 다르게, FastAPI와 httpx를 활용하면 API처럼 쉽게 필요한 정보를 가져오는 서비스를 만들 수 있습니다.
이 글에서는 FastAPI로 TikTok 영상의 통계 정보를 반환하는 API를 직접 만드는 방법을 코드와 함께 소개합니다.
1. 프로젝트 개요
목표: TikTok 동영상 URL을 입력받아, 좋아요/댓글/공유/재생수 등의 통계 데이터를 반환하는 API 만들기
주요 기술: FastAPI, httpx (비동기 HTTP 클라이언트), 정규식 파싱
작동 방식:
- 사용자가 TikTok 동영상 URL을 요청
- API가 해당 페이지의 HTML을 가져옴
- HTML에서 통계 데이터(stats)만 추출
- 결과를 JSON으로 반환
2. 주요 코드 설명
FastAPI 앱 구조
from fastapi import FastAPI, HTTPException, Query
from pydantic import BaseModel
import httpx
import re
import json
app = FastAPI(
title="TikTok HTML Parser",
description="TikTok URL을 입력받아 HTML 코드를 취득하는 API",
version="1.0.0"
)
통계 데이터 추출 함수
HTML에서 "stats": { ... } 부분만 정규식으로 추출
json.loads로 딕셔너리 변환
def extract_stats_from_html(html_content: str) -> Optional[dict]:
try:
stats_pattern = r'"stats":\s*\{[^}]+\}'
match = re.search(stats_pattern, html_content)
if match:
stats_str = match.group(0)
json_str = stats_str.split(':', 1)[1].strip()
json_str = json_str.replace('\\"', '"')
stats_data = json.loads(json_str)
return stats_data
# statsV2 등 다른 패턴도 지원
statsv2_pattern = r'"statsV2":\s*\{[^}]+\}'
match = re.search(statsv2_pattern, html_content)
if match:
stats_str = match.group(0)
json_str = stats_str.split(':', 1)[1].strip()
json_str = json_str.replace('\\"', '"')
stats_data = json.loads(json_str)
return stats_data
return None
except Exception as e:
print(f"Stats 추출 중 오류 발생: {e}")
return None
HTML 요청 함수
httpx.AsyncClient로 실제 TikTok 페이지 HTML을 가져옴
적절한 User-Agent를 사용해서 "로봇 차단" 우회
async def fetch_html(url: str) -> tuple[str, int]:
headers = {
"User-Agent": "... (Chrome UA 문자열) ...",
"Accept": "...",
# (중략)
}
async with httpx.AsyncClient(timeout=30.0, follow_redirects=True, headers=headers) as client:
response = await client.get(url)
return response.text, response.status_code
API 엔드포인트
GET 방식 /tiktok-stats-get
파라미터: url (TikTok 동영상 URL)
반환: stats 정보 (JSON)
@app.get("/tiktok-stats-get")
async def parse_tiktok_stats_get(url: str = Query(..., description="TikTok 동영상 URL")):
if "tiktok.com" not in url:
raise HTTPException(status_code=400, detail="TikTok URL만 허용됩니다.")
try:
html_content, status_code = await fetch_html(url)
stats_data = extract_stats_from_html(html_content)
if stats_data is None:
raise HTTPException(status_code=404, detail="통계 데이터를 찾을 수 없습니다.")
return {
"url": url,
"stats": stats_data,
"status_code": status_code
}
except httpx.TimeoutException:
raise HTTPException(status_code=408, detail="요청 시간이 초과되었습니다.")
except httpx.RequestError as e:
raise HTTPException(status_code=500, detail=f"요청 처리 중 오류가 발생했습니다: {str(e)}")
except Exception as e:
raise HTTPException(status_code=500, detail=f"예상치 못한 오류가 발생했습니다: {str(e)}")
서버 실행
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8000)
3. 실제 사용 예시
API 서버가 구동된 상태에서 아래와 같이 요청하면 됩니다.
GET /tiktok-stats-get?url=https://www.tiktok.com/@xxxxxx_xxxx/video/01234567890123
반환 예시
{
"url": "https://www.tiktok.com/@xxxxxx_xxxx/video/01234567890123",
"stats": {
"diggCount": 1234,
"shareCount": 1234,
"commentCount": 12,
"playCount": 1234,
"collectCount": 0
},
"status_code": 200
}
4. 개발/운영 팁
User-Agent 헤더: TikTok은 로봇 차단이 강하므로, 실제 브라우저와 동일한 User-Agent를 쓰는 게 중요합니다.
정규식 튜닝: TikTok 내부 구조가 바뀌면 정규식이 동작하지 않을 수 있으니, 주기적으로 점검 필요
법적/윤리적 이슈: API를 서비스로 제공할 때 TikTok의 정책과 현지법을 반드시 확인
5. 결론
이 방법을 사용하면 별도의 TikTok 공식 API 없이도 빠르게 동영상 통계 데이터를 가져올 수 있습니다.
데이터 분석, 대시보드, 모니터링, 인플루언서 마케팅 등 다양한 분야에 활용이 가능합니다.
댓글