TikTok heeft inmiddels ongeveer en makers uploaden naar schatting 23 miljoen video's per dag. Als je ooit hebt geprobeerd data te verzamelen uit zelfs maar een klein stukje van die enorme stroom, weet je hoe snel dat frustrerend wordt.
Het gaat meestal ongeveer zo: je zoekt op "scrape TikTok videos with Python", kopieert een snippet uit een tutorial (of laat ChatGPT er eentje schrijven), draait het script en krijgt… niets. Lege HTML. Een 403-fout. Of het gevreesde "Process finished with exit code 0" zonder enige output. Ik heb precies deze loop eindeloos voorbij zien komen in GitHub-issues en Reddit-threads, en daarom heb ik deze gids gemaakt. We behandelen drie Python-methodes die in 2025 echt werken, geven een complete uitleg om ook de daadwerkelijke .mp4-videobestanden te downloaden (dus niet alleen metadata — waar bijna elke andere tutorial stopt), en voegen een vergelijkingstabel toe zodat je de juiste aanpak voor jouw situatie kunt kiezen. Heb je Python helemaal niet nodig? Dan laat ik ook no-code alternatieven zien zoals waarmee je dezelfde data in ongeveer twee klikken kunt binnenhalen.
Wat betekent "TikTok-video's scrapen" eigenlijk?
Voordat we de code induiken, is het handig om even helder te hebben wat mensen bedoelen als ze zeggen "TikTok-video's scrapen" — want die term kan naar twee totaal verschillende dingen verwijzen:
- Video-metadata extraheren: Beschrijvingen, hashtags, likes, reacties, deelcijfers, weergaven, publicatiedatum en auteurinformatie. Hier richten de meeste tutorials zich op.
- De echte videobestanden (.mp4) downloaden: De video zelf op je machine opslaan. Dat is wat de meeste mensen echt bedoelen als ze "TikTok-video's scrapen" typen — en precies dat deel slaat bijna iedereen over.
Deze gids behandelt beide. Elke methode hieronder kan metadata ophalen en de download-URL's geven die je nodig hebt om de .mp4-bestanden op te slaan.
Waarom TikTok-video's scrapen met Python?
Met en TikTok Shop dat genereert, zijn de zakelijke redenen om TikTok-data te gebruiken groot. Dit zijn de use cases die ik het vaakst zie:
| Use case | Wat je scrapt | Voor wie | |---|---|---| | Influencer- en marketingonderzoek | Engagement, volgersaantallen, contentformaten, hashtagprestaties | Marketingteams, bureaus | | Contentstrategie | Trending hashtags, virale videoformats, plaatsingsfrequentie | Contentmakers, social media managers | | Brand monitoring | Vermeldingen, campagnebereik, publieksgevoel | Brandmanagers, PR-teams | | Concurrentieanalyse | Videoprestaties van concurrenten, advertentiecreatives, TikTok Shop-aanbod | E-commerce, productteams | | Marktonderzoek | Opkomende trends, gebruikersgedrag, productontdekking | Analisten, hedge funds, onderzoeksbureaus | | Archivering & compliance | Videobestanden voor interne controle of dossieropbouw | Juridische teams, compliance, bureaus |
De commerciële impact is echt: de Amerikaanse TikTok-advertentieomzet wordt in 2026 geschat op $23,4 miljard, en affiliate creators genereren in de belangrijkste TikTok Shop-categorieën. Werk je in e-commerce of influencer marketing, dan heeft deze data directe waarde.
Waarom je basis-Python-code faalt op TikTok
Als je al iets als dit hebt geprobeerd en nergens uitkwam, ben je zeker niet de enige:
1import requests
2from bs4 import BeautifulSoup
3resp = requests.get("https://www.tiktok.com/@someuser")
4soup = BeautifulSoup(resp.text, "html.parser")
5# ...en daarna staat er niets bruikbaars in de HTML
De reden is simpel: TikTok is een van de lastigste platforms om te scrapen. Een gewone requests.get() levert vaak alleen een lege HTML-schaal op, omdat de echte inhoud in de browser via JavaScript wordt gerenderd. Daarbovenop gebruikt TikTok een agressieve anti-botstack met gedragsdetectie, TLS-fingerprinting, een die request-signatures genereert, en dynamische CSS-selectors die zonder waarschuwing veranderen.

Volgens het Imperva 2025 Bad Bot Report overtrof geautomatiseerd verkeer in 2024 voor het eerst het menselijke verkeer — bots zijn nu goed voor . TikTok is zich daar natuurlijk van bewust en heeft zijn verdediging daarop ingericht.
Hier is een snelle diagnose-tabel zodat je kunt zien wat er misgaat en meteen naar de juiste methode kunt springen:
| Symptoom | Waarschijnlijke oorzaak | Methode die het oplost |
|---|---|---|
| Lege HTML / geen data | JS-gerenderde content; requests kan geen JavaScript uitvoeren | Methode 1 (Verborgen JSON) of Methode 3 (Playwright) |
| 403 / Toegang geweigerd | Ontbrekende of verkeerde headers; anti-botdetectie | Methode 1 met juiste headers |
| Werkt één keer, daarna niet meer | Rate limiting / IP-blokkade | Proxy-rotatie (alle methodes) |
| Login-scherm verschijnt | Sessiecookies vereist | Methode 3 (browser met opgeslagen sessie) |
| Door ChatGPT gegenereerde code geeft niets terug | TikTok-structuur is gewijzigd sinds de trainingsdata van het model | Alle 3 methodes (up-to-date aanpak) |
De rate-limit ligt grofweg rond 30–60 requests per minuut per IP voordat je zachte blokkades of CAPTCHA's ziet. Datacenter-IP's worden vaak binnen enkele minuten al gemarkeerd — residential of mobiele proxies zijn in de praktijk bijna onmisbaar als je op schaal werkt.
Overzicht: 3 methodes om TikTok-video's te scrapen met Python
Hier is de routekaart. Elke methode heeft zijn eigen voor- en nadelen, en ik behandel ze allemaal met werkende code:
- Verborgen JSON-extractie — Parse de
__UNIVERSAL_DATA_FOR_REHYDRATION__-script-tag die in TikTok-pagina's is ingebed. Snelst, simpelst, geen browser nodig. - TikTok's interne API — Roep de ongedocumenteerde
/api/post/item_list/-endpoint direct aan voor bulkdata met cursor-gebaseerde paginering. - Browserautomatisering met Playwright — Render pagina's in een headless browser om infinite scroll, dynamische content en login-schermen op te vangen.
Alle drie de methodes kunnen ook worden gebruikt om de daadwerkelijke .mp4-videobestanden te downloaden — dat leg ik uit in een apart deel na de methode-uitleg. Helemaal aan het einde staat een volledige vergelijkingstabel, zodat je een onderbouwde keuze kunt maken.
Methode 1: TikTok-video's scrapen via verborgen JSON (vriendelijk voor beginners)
Dit is de aanpak waarmee ik zou beginnen. TikTok plaatst op vrijwel elke pagina een enorm JSON-blok in een <script>-tag met de id __UNIVERSAL_DATA_FOR_REHYDRATION__. In die blob staan alle profiel- en videogegevens die de front-end JavaScript normaal zou renderen — en dat betekent dat je ze met één HTTP-request kunt ophalen, zonder browser.
Wat je nodig hebt
- Python 3.8+
requests(ofhttpx)beautifulsoup4(ofparsel)- Juiste headers:
User-Agent,Referer,Accept-Language
Installeer de dependencies:
1pip install requests beautifulsoup4
Stap voor stap: TikTok-videodata uit de script-tag halen
Stap 1: Stuur een GET-request met realistische browserheaders.
Hier gaat het bij beginners vaak mis. Als je een kale requests.get() zonder headers stuurt, geeft TikTok een 403 of een CAPTCHA-pagina terug. Minimaal heb je een actuele browser-User-Agent en een Referer-header nodig.
1import requests
2from bs4 import BeautifulSoup
3import json
4url = "https://www.tiktok.com/@charlidamelio"
5headers = {
6 "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",
7 "Referer": "https://www.tiktok.com/",
8 "Accept-Language": "en-US,en;q=0.9",
9}
10resp = requests.get(url, headers=headers)
Stap 2: Parse de HTML en zoek de hydration-script-tag.
1soup = BeautifulSoup(resp.text, "html.parser")
2script_tag = soup.find("script", id="__UNIVERSAL_DATA_FOR_REHYDRATION__")
Als script_tag None is, heeft TikTok je waarschijnlijk geblokkeerd (controleer de statuscode) of is de tag-id veranderd (zeldzaam, maar mogelijk).
Stap 3: Lees de script-inhoud in als JSON.
1data = json.loads(script_tag.string)
Stap 4: Navigeer door de JSON-structuur om videometadata te extraheren.
De structuur zit onder __DEFAULT_SCOPE__. Voor een profielpagina:
1user_detail = data["__DEFAULT_SCOPE__"]["webapp.user-detail"]
2user_info = user_detail["userInfo"]
3# Profielstatistieken
4stats = user_info["stats"]
5print(f"Volgers: {stats['followerCount']}, Likes: {stats['heartCount']}")
6# Videolijst (eerste pagina met video's)
7item_list = user_detail.get("itemList", [])
8for video in item_list:
9 print(video["desc"]) # Beschrijving
10 print(video["stats"]["playCount"]) # Weergaven
11 print(video["video"]["playAddr"]) # Download-URL van video (zonder watermerk)
12 print(video["video"]["downloadAddr"]) # Download-URL van video (met watermerk)
Stap 5: Extraheer de download-URL's van de video.
Het veld playAddr geeft meestal een schonere versie van de video (vaak zonder TikTok-watermerk), terwijl downloadAddr het standaard watermerk bevat. Beide zijn directe URL's naar het .mp4-bestand — maar om ze te downloaden heb je wel specifieke headers nodig (daar komen we zo op terug).
Je hebt nu een lijst met videometadata-objecten, elk met de beschrijving, statistieken, aanmaaktijd, hashtags (in challenges[] en textExtra) en directe video-URL's.
Beperkingen van de verborgen-JSON-methode
- Pakt alleen data van de eerste paginalaadbeurt — meestal de eerste ~30 video's op een profiel
- Kan geen infinite scroll of paginering aan (er is geen "volgende pagina" om op te vragen)
- Als TikTok de script-tag-id of de JSON-structuur wijzigt, breekt de parser (dit gebeurt periodiek — helpt dit vroeg op te vangen)
- Het beste voor: snelle profielscrapes, eenmalige datapunten of wanneer je alleen de nieuwste video's nodig hebt
Methode 2: TikTok-video's scrapen via de interne API
De front-end van TikTok laadt niet alle video's in één keer — terwijl je scrolt, worden XHR-calls naar interne API-endpoints gedaan. De belangrijkste voor gebruikersvideo's is /api/post/item_list/. Je kunt deze endpoint direct vanuit Python aanroepen, waardoor je cursor-gebaseerde paginering krijgt en toegang tot alle video's op een profiel (niet alleen de eerste pagina).
Hoe vind je het interne API-endpoint?
Open Chrome DevTools op een TikTok-profielpagina, ga naar het Network-tabblad, filter op XHR en scroll omlaag. Je ziet requests naar URL's zoals:
1https://www.tiktok.com/api/post/item_list/?WebIdLastTime=...&aid=1988&count=35&cursor=0&secUid=...
De belangrijkste parameters zijn:
secUid— de unieke ID van het profiel (die kun je uit de JSON van Methode 1 halen, onderuserInfo.user.secUid)cursor— de offset voor paginering (begint op0, elke response geeft de volgende cursorwaarde terug)count— aantal items per pagina (meestal 30–35)
Stap voor stap: TikTok's interne API aanroepen met Python
Stap 1: Haal de secUid op voor het doelprofiel.
Die kun je uit de verborgen JSON halen (Methode 1) of uit de HTML van de profielpagina.
Stap 2: Bouw en verstuur de API-request.
1import requests
2import json
3sec_uid = "MS4wLjABAAAA..." # Uit Methode 1
4api_url = "https://www.tiktok.com/api/post/item_list/"
5params = {
6 "aid": "1988",
7 "secUid": sec_uid,
8 "count": 35,
9 "cursor": 0,
10}
11headers = {
12 "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",
13 "Referer": "https://www.tiktok.com/",
14}
15resp = requests.get(api_url, params=params, headers=headers)
16data = resp.json()
Stap 3: Parse het antwoord.
Elk item in data["itemList"] bevat dezelfde videostructuur als Methode 1 — desc, stats, video.playAddr, video.downloadAddr, enzovoort.
Stap 4: Loop door alle video's met paginering.
1all_videos = []
2cursor = 0
3has_more = True
4while has_more:
5 params["cursor"] = cursor
6 resp = requests.get(api_url, params=params, headers=headers)
7 data = resp.json()
8 items = data.get("itemList", [])
9 all_videos.extend(items)
10 has_more = data.get("hasMore", False)
11 cursor = data.get("cursor", 0)
12 print(f"{len(items)} video's opgehaald, totaal: {len(all_videos)}, hasMore: {has_more}")
13print(f"Totaal aantal gescrapete video's: {len(all_videos)}")
Elke iteratie levert de volgende batch en een nieuwe cursor op. De lus gaat door totdat hasMore False is.
Beperkingen van de interne-API-methode
- TikTok wijzigt deze endpoints en vereiste parameters regelmatig — dit is de meest onderhoudsintensieve methode. In recente maanden vereisen sommige requests een
msToken,X-Bogusof andere signature-parameters die worden gegenereerd door TikTok's (spoiler: dat puur in Python nabootsen is niet triviaal). - Kan sessiecookies of aanvullende tokens vereisen voor bepaalde datatypes
- IP-gebaseerde rate limiting blijft gelden — proxy-rotatie wordt aangeraden
- Als je lege
itemList-arrays krijgt, is jemsTokenwaarschijnlijk verlopen (die roteert in de browser ongeveer elke 10 seconden) - Het beste voor: bulkdataverzameling wanneer je alle video's van een profiel nodig hebt en de beperking van alleen de eerste pagina uit Methode 1 niet genoeg is
Methode 3: TikTok-video's scrapen met Playwright (browserautomatisering)
Wanneer de eerste twee methodes vastlopen — door loginvereisten, CAPTCHA's of signature-parameters die je niet kunt nabootsen — is Playwright de uitwijkoptie. Het start een echte (headless) browser, navigeert door TikTok alsof het een mens is, en kan omgaan met JavaScript-rendering, infinite scroll en zelfs geauthenticeerde sessies.
Playwright instellen voor TikTok-scraping
Installeer Playwright en de browserbinaries:
1pip install playwright
2playwright install firefox
Ik raad Firefox aan boven Chromium voor TikTok-scraping. Communitytests laten consequent zien met Firefox, en TikTok's botdetectie is bijzonder streng tegenover headless browsers op basis van Chromium.
Voor extra stealth kun je Playwright combineren met (een gepatchte Playwright-fork) of (Firefox op C++-niveau aangepast voor anti-detectie). In haalt Camoufox bijna perfecte stealthscores tegenover grote botdetectieservices.
Stap voor stap: TikTok-profielvideo's scrapen met Playwright
Stap 1: Start een headless Firefox-browser en ga naar het profiel.
1import asyncio
2from playwright.async_api import async_playwright
3import json
4async def scrape_tiktok_profile(username):
5 async with async_playwright() as p:
6 browser = await p.firefox.launch(headless=True)
7 context = await browser.new_context(
8 user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:124.0) Gecko/20100101 Firefox/124.0",
9 viewport={"width": 1280, "height": 720},
10 )
11 page = await context.new_page()
12 await page.goto(f"https://www.tiktok.com/@{username}", wait_until="networkidle")
Stap 2: Wacht tot het videoraster is geladen.
1 # Wacht tot video-items verschijnen
2 await page.wait_for_selector('[data-e2e="user-post-item"]', timeout=15000)
Als TikTok een "Something went wrong"-overlay toont, moet je misschien op een retry-knop klikken:
1 retry_btn = page.locator('button:has-text("Retry")')
2 if await retry_btn.count() > 0:
3 await retry_btn.click()
4 await page.wait_for_selector('[data-e2e="user-post-item"]', timeout=15000)
Stap 3: Haal data uit de verborgen JSON op, zelfs in Playwright.
De meest betrouwbare aanpak blijft om de hydration-JSON op te halen, ook als je een browser gebruikt:
1 script_el = page.locator("#__UNIVERSAL_DATA_FOR_REHYDRATION__")
2 raw_json = await script_el.inner_text()
3 data = json.loads(raw_json)
4 # Zelfde JSON-navigatie als Methode 1
5 user_detail = data["__DEFAULT_SCOPE__"]["webapp.user-detail"]
6 videos = user_detail.get("itemList", [])
Stap 4: Verwerk infinite scroll voor meer video's.
Als je meer dan de eerste ~30 video's nodig hebt, scroll dan omlaag en vang extra XHR-responses op:
1 all_videos = list(videos)
2 # Intercepteer API-responses terwijl we scrollen
3 api_responses = []
4 async def capture_response(response):
5 if "/api/post/item_list" in response.url:
6 try:
7 body = await response.json()
8 api_responses.append(body)
9 except:
10 pass
11 page.on("response", capture_response)
12 # Scroll omlaag om meer ladingen te triggeren
13 for _ in range(5): # Pas het aantal scrolls aan indien nodig
14 await page.evaluate("window.scrollTo(0, document.body.scrollHeight)")
15 await asyncio.sleep(2)
16 # Verzamel video's uit de onderschepte responses
17 for api_resp in api_responses:
18 items = api_resp.get("itemList", [])
19 all_videos.extend(items)
20 print(f"Totaal aantal video's: {len(all_videos)}")
21 await browser.close()
22 return all_videos
23# Uitvoeren
24videos = asyncio.run(scrape_tiktok_profile("charlidamelio"))
Je hebt nu een lijst met video-objecten van zowel de eerste paginalaadbeurt als eventuele extra pagina's die via scrollen zijn geladen.
Beperkingen van de Playwright-methode
- Veruit de langzaamste methode (volledige paginarendering, netwerk-rondritten, scrollvertragingen)
- Meer resourceverbruik — elke browserinstantie gebruikt flink wat geheugen en CPU
- Nog steeds gevoelig voor IP-blokkades op schaal — combineer met proxy-rotatie
- Het beste voor: complexe interacties, content achter een loginmuur, CAPTCHA's of wanneer Methode 1 en 2 worden geblokkeerd
Hoe TikTok-video's (.mp4) downloaden met Python
Dit is het onderdeel dat het grootste gat vult in vrijwel elke andere TikTok-scrapingtutorial. Metadata extraheren is nuttig, maar de meeste mensen die zoeken op "scrape TikTok videos" willen de echte videobestanden.
TikTok bewaart download-URL's in het video-object:
playAddr— meestal de versie zonder watermerk of met een beperkter watermerkdownloadAddr— de versie die TikTok bedoeld heeft voor downloaden in de app (inclusief TikTok-watermerk)
Beide URL's zijn tijdgevoelig en verlopen na korte tijd (meestal enkele uren), dus je moet snel downloaden nadat je ze hebt opgehaald.
Stap voor stap: een TikTok-videobestand downloaden
Stap 1: Haal de video-URL uit een van de drie methodes hierboven.
1video_url = video["video"]["playAddr"] # Versie zonder watermerk
2# of
3video_url = video["video"]["downloadAddr"] # Met watermerk
Stap 2: Stuur een GET-request met de juiste headers.
Dit is de stap waar veel mensen op vastlopen. Als je gewoon requests.get(video_url) doet, krijg je een 403. TikTok controleert de Referer-header en verwacht een browserachtige User-Agent.
1import requests
2headers = {
3 "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",
4 "Referer": "https://www.tiktok.com/",
5}
6resp = requests.get(video_url, headers=headers, stream=True)
Stap 3: Schrijf de response weg als een .mp4-bestand.
Gebruik stream=True en schrijf in chunks — TikTok-video's kunnen groot zijn, en je wilt niet het hele bestand in het geheugen laden:
1video_id = video["id"]
2filename = f"tiktok_{video_id}.mp4"
3with open(filename, "wb") as f:
4 for chunk in resp.iter_content(chunk_size=1024 * 1024): # chunks van 1 MB
5 if chunk:
6 f.write(chunk)
7print(f"Gedownload: {filename}")
Nu heb je een afspeelbaar .mp4-bestand op je lokale machine.
Watermerk versus download zonder watermerk
TikTok bewaart zowel een versie mét als zonder watermerk. De playAddr-URL levert vaak een schonere versie op (de versie die de player gebruikt), terwijl downloadAddr het TikTok-watermerk met de gebruikersnaam van de maker bevat.
Een korte ethische noot: het watermerk is er om de maker te crediteren. Als je video's downloadt voor onderzoek, analyse of interne review, is het gebruiken van playAddr meestal prima. Als je de content opnieuw verspreidt of repost, roep je zonder maker-attributie zowel ethische als auteursrechtelijke vragen op. Meer hierover in het juridische gedeelte hieronder.
Voor een robuustere downloadpipeline kun je overwegen — de TikTok-extractor verwerkt signature-berekeningen en URL-resolutie automatisch, zodat je headers en tokenverval niet zelf hoeft te beheren.
Naast elkaar: welke Python-methode moet je gebruiken?
Hier is de vergelijkingstabel die ik graag had gehad toen ik begon met TikTok-scrapingprojecten:
| Criteria | Methode 1: Verborgen JSON | Methode 2: Interne API | Methode 3: Playwright |
|---|---|---|---|
| Moeilijkheidsgraad | Beginner | Gemiddeld | Gemiddeld |
| Snelheid | Snel (1 request per pagina) | Snel (JSON-API) | Traag (volledige paginarendering) |
| Weerstand tegen anti-bot | Gemiddeld | Laag (endpoints veranderen) | Hoog (lijkt op echte browser) |
| Downloadt .mp4-video's? | Ja (haal playAddr op) | Ja (URL in response) | Ja (netwerk onderscheppen) |
| Kan infinite scroll aan | Nee (alleen eerste pagina) | Ja (cursor-paginering) | Ja (scroll-simulatie) |
| Proxy nodig op schaal | Ja | Ja | Ja |
| Onderhoud nodig | Gemiddeld (JSON-structuur verandert) | Hoog (endpoints/signatures veranderen vaak) | Laag-gemiddeld (browser past zich aan) |
| Het beste voor | Snelle eenmalige profielscrapes | Bulk dataverzameling, alle video's | Content achter loginmuur of complexe content |
Mijn advies:
- Heb je alleen snel een snapshot van één profiel nodig? Begin met Methode 1. Die is in ongeveer 30 seconden opgezet en levert data in minder dan een seconde per pagina.
- Heb je alle video's van een profiel nodig met paginering? Dan is Methode 2 de beste keuze, maar houd rekening met onderhoud zodra TikTok zijn API-parameters wijzigt.
- Heb je te maken met login-schermen, CAPTCHA's of wil je maximale robuustheid? Kies Methode 3 met Playwright. Die is langzamer en zwaarder, maar ook het lastigst voor TikTok om te blokkeren.
In de praktijk begin ik vaak met Methode 1 en schakel ik pas over naar Methode 2 of 3 wanneer ik tegen grenzen aanloop. Zo houd je de infrastructuur eenvoudig en de kosten laag.
Geen Python nodig? Scrape TikTok-video's met no-code tools
Veel mensen die zoeken op "scrape TikTok videos with Python" hebben eigenlijk geen Python nodig. Ze hebben de data nodig. Ben je marketinganalist en wil je videometadata van een paar concurrentieprofielen, of ben je brandmanager en monitor je vermeldingen, dan is een Python-omgeving opzetten met proxy-rotatie en signature-handling vaak gewoon overdreven.

Hier is een eerlijke vergelijking van de aanpakken:
| Aanpak | Niveau | Kosten | Onderhoud | Het beste voor | |---|---|---|---|---| | Python (zelf doen) | Gemiddeld+ | Gratis (+ proxykosten) | Hoog (scripts breken) | Volledige controle, maatwerk pipelines | | (Chrome-extensie) | Beginner | Gratis plan beschikbaar | Geen (AI leest de site telkens opnieuw) | Snel video-data ophalen, export naar Sheets/Excel | | Apify TikTok Scraper | Beginner | Betaald (per run) | Laag (onderhouden door Apify) | Geautomatiseerde bulk-runs op schema | | TikAPI | Developer | Betaald abonnement | Gemiddeld | Apps bouwen bovenop TikTok-data |
Hoe Thunderbit TikTok-scraping aanpakt
is de AI-webscraper die we bij Thunderbit hebben gebouwd, en die werkt anders dan traditionele scrapingtools. In plaats van te leunen op vooraf ingestelde CSS-selectors of XPath-regels (die breken zodra TikTok zijn layout wijzigt), leest Thunderbit's AI de paginaconstructie elke keer opnieuw en stelt relevante kolommen voor — beschrijving, likes, hashtags, video-URL, auteur, enzovoort.
De workflow is echt twee klikken:
- Ga in Chrome naar een TikTok-profiel, klik op de Thunderbit-extensie en druk op "AI Suggest Fields". Thunderbit scant de pagina en stelt een tabelstructuur voor.
- Controleer de voorgestelde kolommen, pas ze eventueel aan en klik op "Scrape".
De data exporteer je direct naar Google Sheets, Excel, Airtable of Notion. Geen CSS-selectors om te onderhouden, geen code om te debuggen, geen proxyconfiguratie. Voor de marketinganalist die videometadata van een handvol profielen nodig heeft, is dit aantoonbaar sneller dan een Python-omgeving opzetten — en het breekt niet wanneer TikTok de front-end aanpast (wat volgens community-rapporten om de paar weken gebeurt).
Thunderbit ondersteunt ook — het kan elke individuele videopagina bezoeken om je datatabel aan te vullen met extra details zoals volledige reacties, muziekinfo of videoduur.
Je kunt het gratis proberen via de . Voor meer uitleg over hoe het werkt, bekijk ons .
Juridische en ethische grenzen bij TikTok-scraping
Geen van de best scorende tutorials over dit onderwerp bespreekt de legaliteit, en dat is opvallend gezien het feit dat TikTok actief juridische stappen heeft ondernomen tegen scrapingdiensten. Dit moet je weten.
TikTok's Servicevoorwaarden (§ 4.1) verbieden expliciet geautomatiseerde toegang. Een overtreding van de voorwaarden is een contractbreuk, geen strafbaar feit — maar het kan wel leiden tot accountblokkades, IP-blokkades of civiele stappen.
Het juridische landschap is soepeler dan veel mensen denken voor openbare data. Het belangrijkste precedent is Meta Platforms v. Bright Data (N.D. Cal., jan. 2024), waarin de rechtbank oordeelde dat het scrapen van publiek toegankelijke data terwijl je bent uitgelogd niet in strijd is met de Servicevoorwaarden van Meta. Meta trok de zaak in en zag af van hoger beroep. De eerdere uitspraak van het Ninth Circuit in hiQ v. LinkedIn (bevestigd na Van Buren) stelde vast dat het scrapen van publiek toegankelijke data geen CFAA-schending is — al schikte hiQ uiteindelijk, betaalde $500K en stemde in met een permanent verbod, wat laat zien dat handhaving van TOS nog steeds pijn kan doen.
GDPR en CCPA zijn van toepassing als je persoonsgegevens verzamelt van gebruikers uit de EU of Californië. Openbare posts scrapen is één ding; databases bouwen met persoonlijke informatie van individuele gebruikers is iets anders.
Praktische richtlijnen:
- Beperk je requests (overbelast TikTok's servers niet)
- Scrape geen privé-accounts of content van minderjarigen
- Verspreid auteursrechtelijk beschermde video-content niet commercieel opnieuw
- Respecteer
robots.txt(TikTok staat de meeste geautomatiseerde crawls niet toe) - Video's downloaden voor persoonlijk onderzoek of analyse is iets anders dan ze opnieuw posten — begrijp dat verschil
Disclaimer: Dit is educatieve content, geen juridisch advies. Bouw je een commercieel product op gescrapete TikTok-data, raadpleeg dan een jurist.
Afronding: belangrijkste conclusies
TikTok-scraping in 2025 is een bewegend doelwit. TikTok's anti-botstack is een van de meest geavanceerde op het web, en naïeve aanpakken (gewone requests, door ChatGPT gegenereerde snippets, verouderde tutorials) zullen falen. Maar met de juiste methode is het absoluut haalbaar.
Dit is wat je moet onthouden:
- Methode 1 (Verborgen JSON) is het snelst en simpelst — begin hier voor snelle profielscrapes.
- Methode 2 (Interne API) geeft je paginering en bulktoegang, maar vraagt het meeste onderhoud omdat endpoints en signaturevereisten vaak veranderen.
- Methode 3 (Playwright) is het meest robuust tegen anti-botmaatregelen, maar kost wel snelheid en resources.
- Alle drie methodes kunnen video-download-URL's extraheren — en deze gids is de enige die je ook echt stap voor stap laat zien hoe je de .mp4-bestanden met de juiste headers downloadt.
- Voor niet-technische gebruikers biedt een echt snellere weg naar dezelfde data, zonder code te schrijven of te onderhouden. De AI-aanpak betekent dat het niet breekt wanneer TikTok zijn layout wijzigt — wat volgens community-rapporten vaker gebeurt dan iedereen lief is.
Wil je starten zonder Python-setup? — het gratis plan is genoeg om het op een paar profielen te testen en te zien of het in je workflow past. Kies je voor de Python-route, begin dan met Methode 1, valideer je data en schaal daarna verder op.
Wil je dieper ingaan op scrapingtechnieken? Bekijk dan onze gidsen over , en .
FAQ's
Is het legaal om TikTok-video's te scrapen met Python?
Het scrapen van publiek toegankelijke data zit in een juridisch grijs gebied, niet in een glasheldere overtreding. De uitspraak in Meta v. Bright Data (2024) ondersteunt de stelling dat het scrapen van openbare data terwijl je bent uitgelogd niet in strijd is met de platformvoorwaarden. TikTok's Servicevoorwaarden verbieden echter expliciet geautomatiseerde toegang, en voor persoonlijke data gelden GDPR/CCPA-verplichtingen. Het is niet illegaal op de manier waar de meeste mensen bang voor zijn, maar het is ook niet risicoloos. Raadpleeg voor jouw specifieke situatie een jurist.
Wat is de beste Python-library voor TikTok-scraping?
Dat hangt af van je aanpak. Voor het extraheren van verborgen JSON (Methode 1) heb je genoeg aan requests + beautifulsoup4. Voor interne API-calls (Methode 2) werken requests of httpx prima. Voor browserautomatisering (Methode 3) is playwright momenteel de standaard — het heeft Selenium ingehaald bij nieuwe scrapingprojecten, met tegenover Selenium's ~53 miljoen. De TikTok-Api-wrapper (~6,3K GitHub-stars) is ook het overwegen waard als je een interface op hoger niveau wilt, al kan die kwetsbaar zijn.
Kan ik TikTok-video's zonder watermerk downloaden met Python?
Ja. TikTok levert zelf een playAddr-URL die doorgaans een versie van de video zonder het standaard watermerk bevat. Deze gids laat zien hoe je die URL uit elk van de drie methodes haalt en vervolgens het .mp4-bestand met de juiste headers downloadt. Het veld downloadAddr bevat juist het watermerk.
Waarom geeft mijn TikTok-scraper lege data terug?
De meest voorkomende oorzaak is dat TikTok JavaScript nodig heeft om content te renderen. Een simpele requests.get() haalt alleen de shell-HTML op — de echte data zit óf in een verborgen JSON-script-tag (Methode 1), óf wordt dynamisch geladen via JavaScript (Methode 3). Krijg je lege HTML, probeer dan eerst Methode 1. Lukt dat niet, controleer je headers (een ontbrekende Referer is de belangrijkste oorzaak van 403-fouten) of schakel over naar Methode 3 met Playwright.
Hoe voorkom ik dat ik geblokkeerd word bij het scrapen van TikTok?
Gebruik realistische browserheaders (inclusief User-Agent, Referer en Accept-Language), roteer residential of mobiele proxies (datacenter-IP's worden vaak binnen enkele minuten gemarkeerd), voeg willekeurige vertragingen tussen requests toe (minimaal 1–3 seconden) en scrape niet op extreem hoge volumes. Methode 3 (Playwright) is het meest bestand tegen blokkades omdat het een echte browsersessie nabootst. Reken voor serieuze volumes op proxykosten — instap-residential proxies kosten bij grote aanbieders ongeveer .