TikTok Crawling (yt-dlp)
Use for TikTok crawling, content retrieval, and analysis
Use for TikTok crawling, content retrieval, and analysis
Real data. Real impact.
Emerging
Developers
Per week
Open source
Skills give you superpowers. Install in 30 seconds.
yt-dlp is a CLI for downloading video/audio from TikTok and many other sites.
# macOS brew install yt-dlp ffmpegpip (any platform)
pip install yt-dlp
Also install ffmpeg separately for merging/post-processing
yt-dlp "https://www.tiktok.com/@handle/video/1234567890"
yt-dlp "https://www.tiktok.com/@handle" \ -P "./tiktok/data" \ -o "%(uploader)s/%(upload_date)s-%(id)s/video.%(ext)s" \ --write-info-json
Creates:
tiktok/data/ handle/ 20260220-7331234567890/ video.mp4 video.info.json
for handle in handle1 handle2 handle3; do yt-dlp "https://www.tiktok.com/@$handle" \ -P "./tiktok/data" \ -o "%(uploader)s/%(upload_date)s-%(id)s/video.%(ext)s" \ --write-info-json \ --download-archive "./tiktok/downloaded.txt" done
# Search by keyword yt-dlp "tiktoksearch:cooking recipes" --playlist-end 20Hashtag page
yt-dlp "https://www.tiktok.com/tag/booktok" --playlist-end 50
Videos using a specific sound
yt-dlp "https://www.tiktok.com/music/original-sound-1234567890" --playlist-end 30
# List available formats yt-dlp -F "https://www.tiktok.com/@handle/video/1234567890"Download specific format (e.g., best video without watermark if available)
yt-dlp -f "best" "https://www.tiktok.com/@handle/video/1234567890"
# On or after a date --dateafter 20260215Before a date
--datebefore 20260220
Exact date
--date 20260215
Date range
--dateafter 20260210 --datebefore 20260220
Relative dates (macOS / Linux)
--dateafter "$(date -u -v-7d +%Y%m%d)" # macOS: last 7 days --dateafter "$(date -u -d '7 days ago' +%Y%m%d)" # Linux: last 7 days
# 100k+ views --match-filters "view_count >= 100000"Duration between 30-60 seconds
--match-filters "duration >= 30 & duration <= 60"
Title contains "recipe" (case-insensitive)
--match-filters "title ~= (?i)recipe"
Combine: 50k+ views from Feb 2026
yt-dlp "https://www.tiktok.com/@handle"
--match-filters "view_count >= 50000"
--dateafter 20260201
yt-dlp "https://www.tiktok.com/@handle" \ --simulate \ --print "%(upload_date)s | %(view_count)s views | %(title)s"
# Single JSON array yt-dlp "https://www.tiktok.com/@handle" --simulate --dump-json > handle_videos.jsonJSONL (one object per line, better for large datasets)
yt-dlp "https://www.tiktok.com/@handle" --simulate -j > handle_videos.jsonl
yt-dlp "https://www.tiktok.com/@handle" \ --simulate \ --print-to-file "%(uploader)s,%(id)s,%(upload_date)s,%(view_count)s,%(like_count)s,%(webpage_url)s" \ "./tiktok/analysis/metadata.csv"
# Top 10 videos by views from downloaded .info.json files jq -s 'sort_by(.view_count) | reverse | .[:10] | .[] | {title, view_count, url: .webpage_url}' \ tiktok/data/*/*.info.jsonTotal views across all videos
jq -s 'map(.view_count) | add' tiktok/data//.info.json
Videos grouped by upload date
jq -s 'group_by(.upload_date) | map({date: .[0].upload_date, count: length})'
tiktok/data//.info.json
Tip: For deeper analysis and visualization, load JSONL/CSV exports into Python with
. Useful for engagement scatter plots, posting frequency charts, or comparing metrics across creators.pandas
The
--download-archive flag tracks downloaded videos, enabling incremental updates:
yt-dlp "https://www.tiktok.com/@handle" \ -P "./tiktok/data" \ -o "%(uploader)s/%(upload_date)s-%(id)s/video.%(ext)s" \ --write-info-json \ --download-archive "./tiktok/downloaded.txt"
Run the same command later—it skips videos already in
downloaded.txt.
# Use cookies from browser (recommended) yt-dlp --cookies-from-browser chrome "https://www.tiktok.com/@handle"Or export cookies to a file first
yt-dlp --cookies tiktok_cookies.txt "https://www.tiktok.com/@handle"
# crontab -e # Run daily at 2 AM, log output 0 2 * * * cd /path/to/project && ./scripts/scrape-tiktok.sh >> ./tiktok/logs/cron.log 2>&1
Example
scripts/scrape-tiktok.sh:
#!/bin/bash set -eHANDLES="handle1 handle2 handle3" DATA_DIR="./tiktok/data" ARCHIVE="./tiktok/downloaded.txt"
for handle in $HANDLES; do echo "[$(date)] Scraping @$handle" yt-dlp "https://www.tiktok.com/@$handle"
-P "$DATA_DIR"
-o "%(uploader)s/%(upload_date)s-%(id)s/video.%(ext)s"
--write-info-json
--download-archive "$ARCHIVE"
--cookies-from-browser chrome
--dateafter "$(date -u -v-7d +%Y%m%d)"
--sleep-interval 2
--max-sleep-interval 5 done echo "[$(date)] Done"
| Problem | Solution |
|---|---|
| Empty results / no videos found | Add — TikTok rate-limits anonymous requests |
| 403 Forbidden errors | Rate limited. Wait 10-15 min, or use cookies/different IP |
| "Video unavailable" | Region-locked. Try or a VPN |
| Watermarked videos | Check for alternative formats; some may lack watermark |
| Slow downloads | Add for faster downloads |
| Profile shows fewer videos than expected | TikTok API limits. Use explicitly, try with cookies |
# Verbose output to diagnose issues yt-dlp -v "https://www.tiktok.com/@handle" 2>&1 | tee debug.log
| Option | Description |
|---|---|
| Output filename template |
| Base download directory |
| Videos on/after date (YYYYMMDD) |
| Videos on/before date |
| Stop after N videos |
| Filter by metadata (views, duration, title) |
| Save metadata JSON per video |
| Track downloads, skip duplicates |
/ | Dry run, no download |
/ | Output metadata as JSON |
| Use cookies from browser |
| Wait between downloads (avoid rate limits) |
| Variable | Example Output |
|---|---|
| |
| |
| |
| First 50 chars of title |
| |
| |
| |
No automatic installation available. Please visit the source repository for installation instructions.
View Installation Instructions1,500+ AI skills, agents & workflows. Install in 30 seconds. Part of the Torly.ai family.
© 2026 Torly.ai. All rights reserved.