Python으로 TikTok 동영상 크롤링하는 방법 알아보기

최종 업데이트: June 29, 2026
Python으로 TikTok 동영상 크롤링하는 방법 알아보기

TikTok 월간 활성 사용자는 약 19억 명, 크리에이터가 매일 올리는 영상은 추정 2,300만 개에 달해요. 이 거대한 흐름에서 극히 일부만 건져 올리려 해도 얼마나 빡센지, 한 번이라도 시도해본 분이면 알아요.

보통은 이렇게 흘러가죠. "Python으로 TikTok 동영상 크롤링"을 검색하고, 튜토리얼 코드 조각을 복붙하거나 ChatGPT에 코드를 받아 실행해요. 그런데 결과가 없어요. 빈 HTML, 403 오류, 아니면 그 유명한 "Process finished with exit code 0"만 뜨고 데이터는 0개. GitHub 이슈와 Reddit 스레드에서 이 장면을 수십 번 봤고, 그래서 이 가이드를 준비했어요. 여기서는 2025년에 실제로 먹히는 Python 방식 3가지를 보여드리고, 단순 메타데이터가 아니라 진짜 .mp4 파일까지 내려받는 전 과정을 처음부터 끝까지 다뤄요. 마지막엔 내 상황에 맞는 방식을 고르도록 비교표도 넣었어요. Python이 꼭 필요한 게 아니라면, Thunderbit 같은 노코드 대안으로 비슷한 데이터를 클릭 두 번 정도로 가져올 수도 있어요.

"TikTok 동영상 크롤링"은 정확히 무슨 뜻일까?

코드를 보기 전에 짚을 게 있어요. 사람들이 "TikTok 동영상을 크롤링한다"고 할 때 가리키는 건 사실 전혀 다른 두 가지거든요.

  1. 동영상 메타데이터 추출: 캡션, 해시태그, 좋아요·댓글·공유 수, 조회수, 게시일, 작성자 정보 등을 가져오는 것. 대부분의 튜토리얼은 여기만 다뤄요.
  2. 실제 동영상 파일(.mp4) 다운로드: 영상 자체를 내 기기에 저장하는 것. "TikTok 동영상 크롤링"으로 검색하는 사람들이 진짜 원하는 건 보통 이쪽인데, 정작 설명하는 글은 드물어요.

이 가이드는 둘 다 다뤄요. 아래 방법들은 메타데이터를 뽑을 뿐 아니라, .mp4 저장에 필요한 다운로드 URL도 함께 얻어요.

왜 Python으로 TikTok 동영상을 크롤링할까?

사용자 1명이 하루 평균 약 280개 영상을 보고, TikTok Shop은 전 세계 광고 매출 330억 달러(약 46조 원) 이상을 굴려요. TikTok 데이터에 분명한 비즈니스 가치가 있다는 뜻이죠. 제가 가장 자주 보는 활용 사례는 이래요.

활용 사례수집 대상주요 사용자
인플루언서 및 마케팅 리서치참여율, 팔로워 수, 콘텐츠 형식, 해시태그 성과마케팅 팀, 에이전시
콘텐츠 전략유행 해시태그, 바이럴 영상 형식, 게시 주기크리에이터, 소셜 미디어 매니저
브랜드 모니터링언급량, 캠페인 도달 범위, 고객 반응브랜드 매니저, PR 팀
경쟁사 분석경쟁사 영상 성과, 광고 소재, TikTok Shop 상품 목록이커머스, 제품 팀
시장 조사새로 떠오르는 트렌드, 사용자 행동, 상품 발견 경로분석가, 헤지펀드, 리서치 기관
아카이빙 및 컴플라이언스내부 검토나 기록 보관용 동영상 파일법무, 컴플라이언스, 에이전시

실제로 돈이 걸린 일이기도 해요. 미국 TikTok 광고 매출은 2026년에 234억 달러(약 32조 원)로 전망되고, 상위 TikTok Shop 카테고리에선 제휴 크리에이터가 매출의 82~84%를 만들어내요. 이커머스나 인플루언서 마케팅을 한다면, 이 데이터는 곧 수익과 직결돼요.

왜 기본 Python 코드가 TikTok에서 실패할까?

아래 같은 코드를 이미 돌려봤는데 아무 성과가 없었다면, 혼자가 아니에요.

import requests
from bs4 import BeautifulSoup

resp = requests.get("https://www.tiktok.com/@someuser")
soup = BeautifulSoup(resp.text, "html.parser")
# ...그런데 HTML 안에는 쓸 만한 정보가 아무것도 없음

이유는 단순해요. TikTok은 크롤링이 유난히 까다로운 플랫폼이거든요. 기본 requests.get()은 진짜 콘텐츠가 아니라 거의 비어 있는 HTML 껍데기만 받아와요. 실제 내용은 브라우저에서 JavaScript로 렌더링되니까요. 게다가 TikTok은 행동 패턴 탐지, TLS 핑거프린팅, 요청 서명을 만드는 커스텀 JavaScript 가상 머신, 예고 없이 바뀌는 동적 CSS 셀렉터까지 갖춘 강력한 봇 방지 체계를 굴려요.

tiktok-anti-bot-wall.webp

Imperva 2025 Bad Bot Report를 보면 2024년에 자동화 트래픽이 처음으로 사람 트래픽을 넘어섰고, 지금 봇은 전체 인터넷 트래픽의 51%를 차지해요. TikTok도 이 현실을 잘 알고 거기에 맞춰 방어를 쌓아둔 거죠.

아래 빠른 진단표로 지금 무슨 문제인지 파악하고, 알맞은 방식으로 바로 건너뛸 수 있어요.

증상가능한 원인해결 방법
빈 HTML / 데이터 없음JavaScript로 렌더링되는 콘텐츠; requests는 JavaScript를 실행하지 못함방법 1(숨겨진 JSON) 또는 방법 3(Playwright)
403 / 접근 거부헤더 누락 또는 오류; 봇 탐지에 걸림적절한 헤더를 넣은 방법 1
처음엔 되다가 이후 중단요청 제한 / IP 차단프록시 로테이션(모든 방법)
로그인 벽이 뜸세션/쿠키 필요방법 3(저장된 세션이 있는 브라우저)
ChatGPT 생성 코드가 아무것도 못 가져옴TikTok 구조가 모델 학습 시점 이후 변경됨최신 방식 3가지 모두

요청 제한은 대략 IP당 분당 30~60회쯤부터 걸리기 시작하고, 그 지점부터 소프트 차단이나 CAPTCHA가 나와요. 데이터센터 IP는 몇 분 안에 표가 나기 때문에, 어느 정도 규모가 되면 주거용이나 모바일 프록시가 사실상 필수예요.

개요: Python으로 TikTok 동영상을 크롤링하는 3가지 방법

전체 로드맵은 이래요. 방법마다 장단이 갈리고, 아래에서 전부 동작하는 코드로 설명할게요.

  1. 숨겨진 JSON 추출 — TikTok 페이지에 박힌 __UNIVERSAL_DATA_FOR_REHYDRATION__ 스크립트 태그를 파싱하는 방식. 가장 빠르고 간단하며 브라우저가 필요 없어요.
  2. TikTok 내부 API 활용 — 문서에 없는 /api/post/item_list/ 엔드포인트를 직접 호출해 커서 기반 페이지네이션으로 대량 데이터를 가져와요.
  3. Playwright 브라우저 자동화 — 헤드리스 브라우저로 페이지를 렌더링해 무한 스크롤, 동적 콘텐츠, 로그인 벽까지 처리해요.

세 방법 모두 실제 .mp4 다운로드에 쓸 수 있어요. 다운로드 방법은 각 방식 뒤에 별도 섹션으로 정리했고, 마지막엔 비교표도 있어 상황에 맞게 고를 수 있어요.

방법 1: 숨겨진 JSON으로 TikTok 동영상 크롤링하기(초보자 친화적)

처음 시작할 때 가장 추천하는 방식이에요. TikTok은 거의 모든 페이지 로드 때 __UNIVERSAL_DATA_FOR_REHYDRATION__라는 id의 <script> 태그에 방대한 JSON 덩어리를 심어둬요. 여기엔 프런트엔드 JavaScript가 평소 렌더링하는 프로필·영상 데이터가 다 들어 있죠. 즉, 브라우저 없이 HTTP 요청 한 번으로 가져와요.

준비물

  • Python 3.8 이상
  • requests(또는 httpx)
  • beautifulsoup4(또는 parsel)
  • 올바른 헤더: User-Agent, Referer, Accept-Language

의존성을 설치해요.

pip install requests beautifulsoup4

단계별: 스크립트 태그에서 TikTok 동영상 데이터 추출하기

1단계: 현실적인 브라우저 헤더를 넣어 GET 요청을 보내요.

여기서 가장 많이 미끄러져요. 헤더 없이 맨손 requests.get()을 던지면 TikTok은 403이나 CAPTCHA 페이지를 돌려줘요. 최소한 최신 브라우저 User-AgentReferer 헤더는 넣으세요.

import requests
from bs4 import BeautifulSoup
import json

url = "https://www.tiktok.com/@charlidamelio"
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
    "Referer": "https://www.tiktok.com/",
    "Accept-Language": "en-US,en;q=0.9",
}

resp = requests.get(url, headers=headers)

2단계: HTML을 파싱하고 hydration 스크립트 태그를 찾아요.

soup = BeautifulSoup(resp.text, "html.parser")
script_tag = soup.find("script", id="__UNIVERSAL_DATA_FOR_REHYDRATION__")

script_tagNone이면, TikTok이 요청을 막았거나(상태 코드 확인) 드물게 태그 id가 바뀐 경우예요.

3단계: 스크립트 내용을 JSON으로 읽어들여요.

data = json.loads(script_tag.string)

4단계: JSON 구조를 따라가며 동영상 메타데이터를 추출해요.

데이터는 __DEFAULT_SCOPE__ 아래에 중첩돼 있어요. 사용자 프로필 페이지라면 이렇게 접근해요.

user_detail = data["__DEFAULT_SCOPE__"]["webapp.user-detail"]
user_info = user_detail["userInfo"]

# 프로필 통계
stats = user_info["stats"]
print(f"팔로워 수: {stats['followerCount']}, 좋아요 수: {stats['heartCount']}")

# 동영상 목록(첫 페이지)
item_list = user_detail.get("itemList", [])
for video in item_list:
    print(video["desc"])  # 캡션
    print(video["stats"]["playCount"])  # 조회수
    print(video["video"]["playAddr"])  # 동영상 다운로드 URL(워터마크 없음)
    print(video["video"]["downloadAddr"])  # 동영상 다운로드 URL(워터마크 포함)

5단계: 동영상 다운로드 URL을 추출해요.

playAddr 필드는 보통 더 깔끔한 버전(대개 TikTok 워터마크가 없는 쪽)을 주고, downloadAddr는 일반적인 워터마크가 박힌 버전이에요. 둘 다 .mp4로 바로 연결되는 URL이지만, 다운로드할 때 특정 헤더가 필요해요(아래 다운로드 섹션 참고).

이제 각 영상의 캡션, 통계, 생성 시간, 해시태그(challenges[]textExtra), 그리고 직접 다운로드 URL이 담긴 메타데이터 객체 목록을 손에 쥐게 돼요.

숨겨진 JSON 방식의 한계

  • 초기 페이지 로드 데이터만 가져옴 — 보통 프로필당 첫 30개 정도 영상만 가능
  • 무한 스크롤·페이지네이션 처리 불가(다음 페이지를 요청할 방법이 없음)
  • TikTok이 스크립트 태그 id나 JSON 구조를 바꾸면 파서가 깨짐(주기적으로 발생 — Pydantic 검증이 조기 발견에 도움)
  • 추천 대상: 빠른 프로필 수집, 일회성 추출, 또는 최신 영상만 필요할 때

방법 2: 내부 API로 TikTok 동영상 크롤링하기

TikTok 프런트엔드는 모든 영상을 한꺼번에 불러오지 않고, 스크롤할 때마다 내부 API로 XHR 요청을 보내요. 사용자 영상의 핵심 엔드포인트는 /api/post/item_list/예요. 이걸 Python에서 직접 때리면 커서 기반 페이지네이션으로 프로필의 모든 영상을 가져올 수 있어요(첫 페이지에만 묶이지 않아요).

내부 API 엔드포인트 찾는 법

TikTok 프로필 페이지를 Chrome DevTools에서 열고 Network 탭으로 가서, XHR로 필터링하고 아래로 스크롤해 보세요. 이런 URL로 요청이 들어오는 걸 볼 수 있어요.

https://www.tiktok.com/api/post/item_list/?WebIdLastTime=...&aid=1988&count=35&cursor=0&secUid=...

핵심 파라미터는 이래요.

  • secUid — 프로필의 고유 ID(방법 1의 JSON에서 userInfo.user.secUid로 확인)
  • cursor — 페이지네이션 오프셋(0에서 시작, 응답마다 다음 cursor 값이 옴)
  • count — 페이지당 항목 수(보통 30~35개)

단계별: Python으로 TikTok 내부 API 호출하기

1단계: 대상 프로필의 secUid를 가져와요.

숨겨진 JSON(방법 1)이나 프로필 페이지 HTML에서 확인해요.

2단계: API 요청을 구성하고 전송해요.

import requests
import json

sec_uid = "MS4wLjABAAAA..."  # 방법 1에서 가져옴
api_url = "https://www.tiktok.com/api/post/item_list/"
params = {
    "aid": "1988",
    "secUid": sec_uid,
    "count": 35,
    "cursor": 0,
}
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
    "Referer": "https://www.tiktok.com/",
}

resp = requests.get(api_url, params=params, headers=headers)
data = resp.json()

3단계: 응답을 파싱해요.

data["itemList"]의 각 항목엔 방법 1과 똑같은 영상 구조가 들어 있어요. desc, stats, video.playAddr, video.downloadAddr 등이 그렇죠.

4단계: 모든 영상을 페이지네이션으로 가져와요.

all_videos = []
cursor = 0
has_more = True

while has_more:
    params["cursor"] = cursor
    resp = requests.get(api_url, params=params, headers=headers)
    data = resp.json()
    
    items = data.get("itemList", [])
    all_videos.extend(items)
    
    has_more = data.get("hasMore", False)
    cursor = data.get("cursor", 0)
    
    print(f"{len(items)}개 영상 수집, 누적: {len(all_videos)}개, hasMore: {has_more}")

print(f"총 수집된 영상 수: {len(all_videos)}")

반복마다 다음 묶음과 새 cursor가 돌아와요. hasMoreFalse가 될 때까지 루프를 돌리면 돼요.

내부 API 방식의 한계

  • TikTok은 이런 엔드포인트와 필수 파라미터를 자주 손봐요. 그래서 유지보수 부담이 제일 커요. 최근엔 일부 요청에서 msToken, X-Bogus, 또는 TikTok의 커스텀 JavaScript VM이 만드는 다른 서명 파라미터를 요구하기 시작했어요(힌트: 이걸 순수 Python으로 그대로 재현하는 건 꽤 어려워요).
  • 특정 데이터 유형에선 세션 쿠키나 추가 토큰이 필요할 수 있음
  • IP 기반 요청 제한은 여전히 적용됨 — 프록시 로테이션 권장
  • itemList 배열이 빈 채로 오기 시작하면 msToken이 만료됐을 가능성이 큼(브라우저에선 대략 10초마다 갱신됨)
  • 추천 대상: 프로필의 모든 영상을 대량으로 가져와야 하고, 방법 1의 첫 페이지 제한으로는 부족할 때

방법 3: Playwright로 TikTok 동영상 크롤링하기(브라우저 자동화)

앞의 두 방법이 막힐 때 — 로그인 요구, CAPTCHA, 복제하기 어려운 서명 파라미터 — 에는 Playwright가 답이 돼요. 진짜 브라우저(헤드리스)를 띄워 사람처럼 TikTok을 돌아다니며, JavaScript 렌더링, 무한 스크롤, 인증 세션까지 처리해요.

TikTok 크롤링을 위한 Playwright 설정

Playwright와 브라우저 바이너리를 설치해요.

pip install playwright
playwright install firefox

TikTok 크롤링엔 Chromium보다 Firefox를 추천해요. 커뮤니티 테스트를 보면 브라우저 핑거프린트 호환성이 Firefox에서 더 나은 경우가 많고, TikTok의 봇 탐지는 Chromium 계열 헤드리스 브라우저에 특히 공격적이거든요.

은닉성을 더 챙기고 싶다면 patchright(수정된 Playwright 포크)나 Camoufox(탐지 회피를 위해 C++ 레벨에서 손본 Firefox)를 곁들이는 것도 방법이에요. 독립 벤치마크에선 Camoufox가 주요 봇 탐지 서비스에 거의 완벽한 은닉 점수를 받았어요.

단계별: Playwright로 TikTok 프로필 영상 크롤링하기

1단계: 헤드리스 Firefox를 띄우고 프로필로 이동해요.

import asyncio
from playwright.async_api import async_playwright
import json

async def scrape_tiktok_profile(username):
    async with async_playwright() as p:
        browser = await p.firefox.launch(headless=True)
        context = await browser.new_context(
            user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:124.0) Gecko/20100101 Firefox/124.0",
            viewport={"width": 1280, "height": 720},
        )
        page = await context.new_page()
        
        await page.goto(f"https://www.tiktok.com/@{username}", wait_until="networkidle")

2단계: 영상 그리드가 로드될 때까지 기다려요.

        # 영상 항목이 나타날 때까지 대기
        await page.wait_for_selector('[data-e2e="user-post-item"]', timeout=15000)

TikTok에 "Something went wrong" 오버레이가 뜨면, 재시도 버튼을 눌러야 할 수도 있어요.

        retry_btn = page.locator('button:has-text("Retry")')
        if await retry_btn.count() > 0:
            await retry_btn.click()
            await page.wait_for_selector('[data-e2e="user-post-item"]', timeout=15000)

3단계: 숨겨진 JSON에서 데이터를 추출합니다(Playwright를 써도 동일).

브라우저를 쓰더라도 가장 안정적인 길은 여전히 hydration JSON을 가져오는 거예요.

        script_el = page.locator("#__UNIVERSAL_DATA_FOR_REHYDRATION__")
        raw_json = await script_el.inner_text()
        data = json.loads(raw_json)
        
        # 방법 1과 동일한 JSON 탐색
        user_detail = data["__DEFAULT_SCOPE__"]["webapp.user-detail"]
        videos = user_detail.get("itemList", [])

4단계: 더 많은 영상을 위해 무한 스크롤을 처리해요.

초기 30개 이상의 영상을 원한다면, 아래로 스크롤하면서 추가 XHR 응답을 잡아내야 해요.

        all_videos = list(videos)
        
        # 스크롤 중 API 응답 가로채기
        api_responses = []
        
        async def capture_response(response):
            if "/api/post/item_list" in response.url:
                try:
                    body = await response.json()
                    api_responses.append(body)
                except:
                    pass
        
        page.on("response", capture_response)
        
        # 아래로 스크롤해 추가 로드를 유도
        for _ in range(5):  # 필요에 따라 스크롤 횟수 조정
            await page.evaluate("window.scrollTo(0, document.body.scrollHeight)")
            await asyncio.sleep(2)
        
        # 가로챈 응답에서 영상 수집
        for api_resp in api_responses:
            items = api_resp.get("itemList", [])
            all_videos.extend(items)
        
        print(f"총 영상 수: {len(all_videos)}")
        await browser.close()
        return all_videos

# 실행
videos = asyncio.run(scrape_tiktok_profile("charlidamelio"))

이제 초기 페이지 로드와 스크롤로 더해진 페이지에서 모은 영상 객체 목록이 손에 들어와요.

Playwright 방식의 한계

  • 세 방법 중 가장 느림(전체 페이지 렌더링, 네트워크 왕복, 스크롤 지연 포함)
  • 리소스 사용량이 큼 — 브라우저 인스턴스 하나만 띄워도 메모리와 CPU를 꽤 먹어요
  • 대규모 작업에선 IP 차단 위험이 여전함 — 프록시 로테이션과 함께 쓰길 권장
  • 추천 대상: 복잡한 상호작용, 로그인 벽이 있는 콘텐츠, CAPTCHA 처리, 또는 방법 1·2가 막혔을 때

Python으로 TikTok 동영상(.mp4) 다운로드하는 방법

이 섹션이 다른 어떤 TikTok 크롤링 튜토리얼보다 큰 빈틈을 메워 줘요. 메타데이터 추출도 쓸모 있지만, "TikTok 동영상 크롤링"으로 검색하는 사람 대부분은 동영상 파일 자체를 원하거든요.

TikTok은 영상 데이터 객체 안에 다운로드 URL을 넣어둬요.

  • playAddr — 보통 워터마크가 없거나 덜한 버전
  • downloadAddr — TikTok이 앱 내 다운로드용으로 주는 버전(워터마크 오버레이 포함)

두 URL 모두 유효 시간이 짧아요. 보통 몇 시간 지나면 만료되니, 뽑은 뒤 최대한 빨리 받아야 해요.

단계별: TikTok 동영상 파일 다운로드하기

1단계: 위 세 방법 중 하나로 동영상 URL을 추출해요.

video_url = video["video"]["playAddr"]  # 워터마크 없음
# 또는
video_url = video["video"]["downloadAddr"]  # 워터마크 포함

2단계: 올바른 헤더로 GET 요청을 보내요.

여기서 많은 사람이 막혀요. 단순히 requests.get(video_url)만 하면 403이 떠요. TikTok은 Referer 헤더를 확인하고, 브라우저처럼 보이는 User-Agent를 기대하거든요.

import requests

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

resp = requests.get(video_url, headers=headers, stream=True)

3단계: 응답 내용을 .mp4 파일로 저장해요.

stream=True를 쓰고 chunk 단위로 기록하세요. TikTok 영상은 용량이 클 수 있으니, 파일 전체를 메모리에 올리지 않는 게 좋아요.

video_id = video["id"]
filename = f"tiktok_{video_id}.mp4"

with open(filename, "wb") as f:
    for chunk in resp.iter_content(chunk_size=1024 * 1024):  # 1MB 청크
        if chunk:
            f.write(chunk)

print(f"다운로드 완료: {filename}")

이제 로컬에서 재생 가능한 .mp4 파일이 생겨요.

워터마크 버전 vs. 무워터마크 버전

TikTok은 영상마다 워터마크 버전과 비워터마크 버전을 둘 다 저장해요. playAddr URL은 보통 더 깔끔한 버전(플레이어가 쓰는 쪽)을 주고, downloadAddr는 크리에이터 사용자명이 박힌 TikTok 워터마크가 포함돼요.

윤리 얘기도 짚을게요. 워터마크는 크리에이터의 저작권 표시예요. 연구·분석·내부 검토용 다운로드라면 playAddr를 써도 대체로 무난해요. 하지만 콘텐츠를 재배포하거나 재업로드한다면, 크리에이터 표시를 지우는 건 윤리적·저작권적 문제를 동시에 부를 수 있어요. 이 부분은 아래 법적 섹션에서 더 다뤄요.

더 탄탄한 다운로드 파이프라인이 필요하면 yt-dlp를 살펴보세요. TikTok 추출기가 서명 계산과 URL 해석을 알아서 해줘서, 헤더나 토큰 만료를 직접 챙길 필요가 없어요.

비교: 어떤 Python 방식을 써야 할까?

제가 TikTok 크롤링 프로젝트를 처음 시작했을 때 있었으면 했던 비교표예요.

기준방법 1: 숨겨진 JSON방법 2: 내부 API방법 3: Playwright
난이도초급중급중급
속도빠름(페이지당 1회 요청)빠름(JSON API)느림(전체 페이지 렌더링)
봇 방어 회피력중간낮음(엔드포인트가 자주 바뀜)높음(실제 브라우저처럼 동작)
동영상 .mp4 다운로드 가능?가능(playAddr 추출)가능(응답에 URL 포함)가능(네트워크 가로채기)
무한 스크롤 처리불가(첫 페이지만)가능(커서 페이지네이션)가능(스크롤 시뮬레이션)
대규모 작업 시 프록시 필요필요필요필요
유지보수 필요도중간(JSON 구조 변경)높음(엔드포인트/서명 자주 변경)낮음~중간(브라우저가 적응)
추천 용도빠른 일회성 프로필 수집대량 데이터 추출, 전체 영상 수집로그인 벽 또는 복잡한 콘텐츠 처리

제 추천은 이래요.

  • 한 프로필의 빠른 스냅샷만 필요하다면? 방법 1부터요. 세팅은 30초면 되고, 페이지당 1초도 안 걸려 데이터를 받아요.
  • 페이지네이션이 있는 프로필 전체 영상이 필요하다면? 방법 2가 맞아요. 단, TikTok이 API 파라미터를 바꿀 때마다 유지보수가 따라온다는 건 감안하세요.
  • 로그인 벽, CAPTCHA, 또는 최대한의 안정성이 필요하다면? Playwright를 쓰는 방법 3이 좋아요. 느리고 무겁지만, TikTok이 가장 막기 어려운 방식이에요.

실무에선 보통 방법 1로 시작하고, 한계에 부딪힐 때만 2나 3으로 올려요. 그러면 인프라도 단순하고 비용도 낮게 유지돼요.

Python이 꼭 필요하지 않다면? 노코드 도구로 TikTok 동영상 크롤링하기

"Python으로 TikTok 동영상 크롤링"을 검색하는 많은 분이 사실 Python 자체가 아니라 데이터만 필요해요. 경쟁사 프로필 몇 개에서 영상 메타데이터를 가져오려는 마케팅 분석가나 브랜드 언급을 추적하는 브랜드 매니저라면, 프록시 로테이션과 서명 처리까지 포함한 Python 환경을 직접 꾸리는 건 과해요.

python-vs-nocode-ai-comparison.webp

접근 방식별로 솔직히 비교하면 이래요.

방식기술 수준비용유지보수추천 대상
Python(직접 구현)중급 이상무료(+프록시 비용)높음(스크립트가 자주 깨짐)완전한 제어, 맞춤형 파이프라인
Thunderbit(Chrome 확장 프로그램)초급무료 플랜 제공없음(AI가 매번 새로 읽음)빠른 영상 데이터 추출, Sheets/Excel로 내보내기
Apify TikTok Scraper초급유료(실행당 과금)낮음(Apify가 유지보수)일정에 맞춘 대량 자동 실행
TikAPI개발자유료 구독중간TikTok 데이터 기반 앱 개발

Thunderbit가 TikTok 크롤링을 처리하는 방식

Thunderbit는 Thunderbit에서 만든 AI 웹 스크래퍼로, 기존 크롤링 도구와는 방식이 달라요. 미리 박아둔 CSS 셀렉터나 XPath 규칙에 기대지 않거든요(TikTok 레이아웃이 바뀔 때마다 깨지는 방식이죠). 대신 Thunderbit의 AI가 매번 페이지 구조를 새로 읽고 캡션, 좋아요 수, 해시태그, 동영상 URL, 작성자 같은 알맞은 열을 추천해요.

실제 흐름은 클릭 두 번이면 끝이에요.

  1. Chrome에서 TikTok 프로필로 가서 Thunderbit 확장 프로그램을 클릭하고 "AI로 필드 제안"을 눌러요. Thunderbit가 페이지를 분석해 표 구조를 제안해요.
  2. 제안된 열을 확인하고 필요하면 손본 뒤 "크롤링"을 눌러요.

데이터는 Google Sheets, Excel, Airtable, Notion으로 바로 내보내요. CSS 셀렉터 관리도, 코드 디버깅도, 프록시 설정도 필요 없어요. 프로필 몇 개의 영상 메타데이터만 필요한 마케팅 분석가라면, Python 환경을 꾸리는 것보다 확실히 빠르고 TikTok이 프런트를 바꿔도 잘 안 깨져요(커뮤니티 보고를 보면 몇 주 간격으로 바뀌는 경우가 많아요).

Thunderbit는 서브페이지 크롤링도 지원해요. 개별 영상 페이지를 하나씩 방문해 댓글 수, 음악 정보, 영상 길이 같은 정보를 표에 더 채울 수 있어요.

Thunderbit Chrome Extension에서 무료로 써볼 수 있어요. 작동 방식이 더 궁금하면 YouTube 채널을 확인해 보세요.

TikTok 크롤링 시 알아야 할 법적·윤리적 가이드라인

이 주제의 상위권 튜토리얼 중 합법성을 언급하는 글은 거의 없어요. TikTok이 크롤링 서비스에 실제로 법적 조치를 해왔다는 걸 생각하면 꽤 중요한 누락이죠. 알아둘 내용을 정리했어요.

**TikTok 이용약관(§ 4.1)**은 자동화된 접근을 명시적으로 금지해요. 약관 위반은 형사 범죄가 아니라 계약 위반이지만, 계정 정지, IP 차단, 민사 소송으로 번질 수 있어요.

공개 데이터에 대한 법적 환경은 많은 사람이 생각하는 것보다 더 유연해요. 대표 판례는 Meta Platforms v. Bright Data(미국 북캘리포니아 연방법원, 2024년 1월)예요. 법원은 로그아웃 상태에서 공개적으로 접근 가능한 데이터를 크롤링하는 것이 Meta 약관 위반이 아니라고 봤죠. Meta는 사건을 취하했고 항소도 접었어요. 그보다 앞선 hiQ v. LinkedIn 제9순회 항소법원 판결(Van Buren 이후 재확인)은 공개 접근 가능 데이터 크롤링이 CFAA 위반이 아니라는 점을 못 박았어요. 다만 hiQ는 결국 합의해 50만 달러를 냈고 영구 금지명령에도 동의했는데, 약관 집행이 여전히 현실 리스크라는 사실을 보여줘요.

GDPR과 CCPA는 EU나 캘리포니아 사용자의 개인정보를 모을 때 적용돼요. 공개 게시물을 수집하는 것과 개인 사용자 정보를 모아 데이터베이스를 만드는 건 전혀 다른 문제죠.

실무 가이드라인:

  • 요청 속도를 제한하세요(TikTok 서버를 과하게 두드리지 말 것)
  • 비공개 계정이나 미성년자 콘텐츠는 수집하지 마세요
  • 저작권이 있는 동영상을 상업적으로 재배포하지 마세요
  • robots.txt를 존중하세요(TikTok은 대부분의 자동 크롤링을 금지해요)
  • 개인 연구·분석 목적의 다운로드와 재업로드는 달라요 — 이 차이를 분명히 인식하세요

면책 고지: 이 글은 교육용 콘텐츠이며 법률 자문이 아니에요. 크롤링한 TikTok 데이터로 상용 제품을 만들고 있다면 변호사와 상의하세요.

마무리: 핵심 요약

2025년의 TikTok 크롤링은 계속 움직이는 표적이에요. TikTok의 봇 방지 체계는 웹에서 손꼽히게 정교하고, 단순한 방법(평범한 requests, ChatGPT가 뱉은 코드 조각, 오래된 튜토리얼)은 실패하기 십상이죠. 하지만 올바른 방식이면 충분히 돼요.

핵심만 정리하면 이래요.

  • **방법 1(숨겨진 JSON)**은 가장 빠르고 간단해요. 빠른 프로필 수집은 여기서 시작하세요.
  • **방법 2(내부 API)**는 페이지네이션과 대량 수집에 유리하지만, 엔드포인트와 서명 요구가 자주 바뀌어 유지보수가 가장 많이 필요해요.
  • **방법 3(Playwright)**은 봇 방어에 가장 강한 대신, 속도와 리소스 사용량을 감수해야 해요.
  • 세 방법 모두 동영상 다운로드 URL을 뽑을 수 있고, 이 가이드는 올바른 헤더로 실제 .mp4를 받는 과정까지 안내하는 거의 유일한 자료예요.
  • 비개발자라면 Thunderbit가 코드를 짜거나 유지보수하지 않고도 같은 데이터를 얻는 더 빠른 길이 될 수 있어요. AI 기반이라 TikTok 레이아웃이 바뀌어도 잘 안 깨지죠. 커뮤니티 보고를 보면 이런 변경이 꽤 잦아요.

Python 세팅 없이 바로 시작하고 싶다면, Thunderbit Chrome Extension을 써보세요 — 무료 플랜만으로도 프로필 몇 개에 테스트해 업무 흐름에 맞는지 가늠하기 충분해요. Python으로 갈 분들은 방법 1로 시작해 데이터를 검증한 뒤 필요에 따라 넓혀가면 돼요.

웹 스크래핑 기술을 더 깊게 파고 싶다면 어떤 웹사이트든 데이터 추출하는 방법, 웹 스크래핑 모범 사례, Google Sheets로 크롤링하는 방법도 함께 보세요.

자주 묻는 질문(FAQs)

Python으로 TikTok 동영상을 크롤링하는 것은 합법인가요?

공개 접근 가능한 데이터를 크롤링하는 건 딱 잘라 불법이라 보기 어려운 회색지대예요. Meta v. Bright Data(2024) 판결은 로그아웃 상태의 공개 데이터 크롤링이 플랫폼 약관 위반이 아니라는 입장을 받쳐줘요. 다만 TikTok 약관은 자동화된 접근을 명시적으로 금지하고, 개인정보엔 GDPR/CCPA 의무도 따라붙어요. 많은 사람이 걱정하듯 곧바로 불법은 아니지만, 리스크가 없는 것도 아니죠. 구체적인 사용 사례는 법률 전문가와 상담하세요.

TikTok 크롤링에 가장 좋은 Python 라이브러리는 무엇인가요?

방식에 따라 갈려요. 숨겨진 JSON 추출(방법 1)이면 requestsbeautifulsoup4로 충분해요. 내부 API 호출(방법 2)도 requestshttpx로 가능하고요. 브라우저 자동화(방법 3)에선 지금 playwright가 표준이에요. 신규 크롤링 프로젝트에서 Selenium보다 채택이 앞서고, 월간 PyPI 다운로드 약 5,900만 회로 Selenium의 약 5,300만 회를 넘어섰어요. 더 고수준 인터페이스가 필요하면 TikTok-Api 래퍼(깃허브 별 약 6.3K개)도 후보지만, 다소 불안정할 수 있어요.

Python으로 워터마크 없이 TikTok 동영상을 다운로드할 수 있나요?

네. TikTok 자체 데이터엔 보통 표준 워터마크 오버레이가 없는 버전을 주는 playAddr URL이 들어 있어요. 이 가이드는 세 방법 중 어느 것으로든 해당 URL을 뽑고, 올바른 헤더로 .mp4를 받는 법을 보여줘요. 반대로 downloadAddr 필드는 워터마크가 포함돼요.

왜 내 TikTok 스크래퍼는 빈 데이터를 반환하나요?

가장 흔한 원인은 TikTok이 콘텐츠 렌더링에 JavaScript를 쓰기 때문이에요. 기본 requests.get()은 HTML 껍데기만 받고, 진짜 데이터는 숨겨진 JSON 스크립트 태그(방법 1)에 있거나 JavaScript로 동적 로드돼요(방법 3). 빈 HTML이 보이면 우선 방법 1을 시도하세요. 그래도 안 되면 헤더를 확인하고(Referer 누락이 403의 가장 흔한 원인이에요), 필요하면 Playwright를 쓰는 방법 3으로 넘어가세요.

TikTok 크롤링 시 차단을 피하려면 어떻게 해야 하나요?

현실적인 브라우저 헤더(User-Agent, Referer, Accept-Language)를 쓰고, 주거용이나 모바일 프록시를 로테이션하세요(데이터센터 IP는 몇 분 안에 표가 나요). 요청 사이엔 무작위 지연(최소 1~3초)을 두고, 너무 잦은 빈도로 수집하지 마세요. 방법 3(Playwright)은 실제 브라우저 세션을 흉내 내서 차단 회피력이 가장 높아요. 규모가 커지면 프록시 비용도 예산에 넣어야 하는데, 주요 제공업체의 입문형 주거용 프록시는 GB당 약 2~4달러 수준이에요.

  • 더 알아보기
Shuai Guan
Shuai Guan
Thunderbit CEO | AI 데이터 자동화 전문가 Shuai Guan은 Thunderbit의 CEO이자 University of Michigan 공학과 출신입니다. 10년 가까운 기술 및 SaaS 아키텍처 경험을 바탕으로, 복잡한 AI 모델을 누구나 바로 활용할 수 있는 노코드 데이터 추출 도구로 바꾸는 데 전문성을 갖고 있습니다. 이 블로그에서는 웹 스크래핑과 자동화 전략에 대한 필터링 없는 실전 경험과 검증된 인사이트를 공유하며, 더 똑똑하고 데이터 중심적인 워크플로를 만드는 데 도움을 드립니다. 데이터 워크플로를 최적화하지 않을 때는, 같은 꼼꼼함으로 사진이라는 취미에 몰두합니다.
Topics
Scrape Tiktok pythonTiktok data extraction pythonPython Tiktok scraper scriptHow to scrape Tiktok videos with python

Thunderbit를 사용해 보세요

단 2번의 클릭으로 리드와 기타 데이터를 수집하세요. AI 기반.

Thunderbit 받기 무료예요
AI로 데이터 추출하기
Google Sheets, Airtable, Notion으로 데이터를 손쉽게 옮겨보세요
Chrome Store Rating
PRODUCT HUNT#1 Product of the Week