YouTube Trending analyseren: van YouTube API naar BigQuery-database
Voor mijn artikel over YouTube Trending heb ik een maand lang twee keer per dag bijgehouden welke video’s trending waren in Nederland. Handmatig bijhouden was geen optie, dus ik heb dit proces geautomatiseerd. In dit artikel leg ik uit hoe ik met behulp van de YouTube API geautomatiseerd de trending-inzichten heb opgehaald.
Dit is mijn eerste artikel waarin ik in gaan op programmeren. Hoewel ik een beginner ben, hoop ik je hiermee inzicht te geven hoe ik de data voor mijn trending-artikel heb verzameld.
Mijn eerste stapjes in de YouTube API
Op mijn blog heb je eerder toplijstjes kunnen lezen, zoals wie de meeste abonnees op YouTube heeft. In 2018 ben ik begonnen met het bijhouden van de populairste kanalen door de strijd tussen PewDiePie en T-Series om de titel YouTube-kanaal met de meeste abonnees. Daarna ben ik het aantal abonnees van verscheidene kanalen handmatig gaan bijhouden in een excelletje. Dit kost echter tijd en is foutgevoelig. Bovendien wilde ik de data vaker ophalen dan een paar keer per jaar. Daarom heb ik besloten om in de publieke YouTube API te duiken zodat ik wekelijks het aantal abonnees van de populairste kanalen wereldwijd en in Nederland kan ophalen.
Door mijn werk bij AVROTROS ben ik mij de afgelopen maanden meer gaan interesseren in Python en API’s. Hierdoor is de YouTube API een mooie speeltuin voor mij om te leren. Ik begon met ophalen van zoveel mogelijk statistieken van mijn eigen (inactieve) YouTube-kanaal. Daarna ben ik begonnen met het ophalen van de kanaalstatistieken van een stuk of honderd internationale en Nederlandse YouTube-kanalen.
De YouTube API is heel uitgebreid en je kunt van elk willekeurig kanaal een hoop interessante gegevens ophalen. YouTube heeft haar API ook goed gedocumenteerd.
Van API naar opslaan in een database
Het ophalen van data uit een API is stap één, maar als je de data niet opslaat, blijft het een momentopname. Je kunt er voor kiezen om de data lokaal op te slaan in bijvoorbeeld een CSV of een database. Ik heb er voor gekozen om de data op te slaan in BigQuery (een product uit de Google Cloud). Ik ken BigQuery namelijk goed door mijn werk bij AVROTROS. Google Cloud is een betaald product waarbij je betaalt naar ratio.
Ophalen van kanaalgegevens in YouTube API
Met onderstaande Python-code kun je de lifetime statistieken van een YouTube-kanaal (in dit geval mijn kanaal) ophalen:
Python-code
from google.oauth2 import service_account
from googleapiclient.discovery import build
channel_id = 'UCrmJ1s5fdCqoZKevEcnPUwg'
SERVICE_ACCOUNT_FILE = 'file_name.json' # path voor de json met credentials
SCOPES = ["https://www.googleapis.com/auth/youtube.readonly"]
credentials = service_account.Credentials.from_service_account_file(
SERVICE_ACCOUNT_FILE, scopes=SCOPES)
service = build('youtube', 'v3', credentials=credentials)
request = service.channels().list(part="statistics", id=channel_id)
response = request.execute()
print(response)
Als je dit Python-script uitvoert, krijg je de volgende informatie terug:
Response
{'kind': 'youtube#channelListResponse', 'etag': 'rFLFTwdxRzz-FSCmcO90p3c5XvY', 'pageInfo': {'totalResults': 1, 'resultsPerPage': 5}, 'items': [{'kind': 'youtube#channel', 'etag': 'Z6pji1DUuZOl0GBBjLdaosR1UhY', 'id': 'UCrmJ1s5fdCqoZKevEcnPUwg', 'statistics': {'viewCount': '21175', 'subscriberCount': '23', 'hiddenSubscriberCount': False, 'videoCount': '14'}}]}
De belangrijkste informatie staat bij statistics:
- viewCount: 21.175
- subscriberCount: 23
- videoCount: 14
In mijn uiteindelijke script heb ik nog een stukje code geschreven waarmee ik deze specifieke velden uit de API-response haal en deze data schrijf ik weg naar de database.
Met deze code ben je er nog niet, tenzij je dagelijks zelf dit script wil runnen. Op de Google Cloud heb je nog twee andere producten waarmee je het proces volledig kunt automatiseren. Via Google Cloud Functions kun je Python-code daadwerkelijk in de cloud laten uitvoeren. Als je de code succesvol hebt uitgerold, kun je de functie structureel laten uitvoeren met de Google Cloud Scheduler (het gemakkelijkste is om de functie te triggeren via Pub/Sub).
Ophalen van YouTube Trending in YouTube API
Nadat ik een tijdje had geëxperimenteerd met de YouTube API, kwam ik er achter dat er ook een gemakkelijke manier is om de data van de trending-pagina op te halen. In de API-call om data van video’s op te halen, kun je namelijk een variabele instellen waarmee je niet de data van specifieke video’s ophaalt, maar de data van de trending video’s van dat moment.
Daarbij moet je in het veld chart mostPopular invullen en daarnaast moet je bij regionCode nl invullen. Met de regionCode specifieer je van welk land je de data wil ophalen.
In Python ziet je request er als volgt uit:
Python-code
request = service.videos().list(part="snippet,statistics", chart="mostPopular", regionCode="nl")
Bij het uitvoeren van het script is dit het eerste deel van wat ik terug krijg:
Response
{'kind': 'youtube#videoListResponse', 'etag': 'ElPmwld_BiJCg-Z9zko7tRJP6VM', 'items': [{'kind': 'youtube#video', 'etag': 'TWU_gyT_p_UEjm6Rj8y4JVeEDko', 'id': 'o7RIBP-_7Oo', 'snippet': {'publishedAt': '2021-05-29T15:00:23Z', 'channelId': 'UCK5Fn7Z6-iFMdxEye2FsKXg', 'title': 'KLAAS SCHREEUWT HET UIT | De Stilste Show #1 met Klaas van Kruistum' [...]
Voor de zekerheid heb ik daarna een blik op de YouTube Trending-pagina geworpen en krijg ik hetzelfde resultaat:
De volgorde waarmee de video’s in de API worden weergeven is overigens ook de volgorde die ze op de trending-pagina hebben. Bij het wegschrijven van de data naar een database is het dus belangrijk om een extra veld toe te voegen waarin je de positie in de API opslaat.
Als je uiteindelijk een script hebt geschreven waarmee je de trending-data ophaalt en dagelijks wegschrijft in een database (bijvoorbeeld BigQuery), dan kun je daarna in de database gemakkelijk selecteren welke video’s trending zijn:
Mijn trending-analyse
Voor mijn trending-artikel heb ik ervoor gekozen om de trending-data twee keer per dag op te halen (12:00 uur en 0:00 uur). De trending-pagina wordt overigens elk kwartier geüpdatet, waardoor het kan zijn dat ik niet elke video in mijn dataset heb zitten. Het is overigens niet zo dat de volgorde elk kwartier verandert.
In mijn analyse heb ik daarnaast veel randgegevens aan de dataset toegevoegd. Zo vond ik het voor mijn analyse bijvoorbeeld belangrijk hoe lang een video duurt en in welke categorie de video is geplaatst. Mijn analyse is bijna volledig gebaseerd op de tabel waar ik twee per dag data aan toevoeg. Begin juni heb ik daarnaast voor alle kanalen in de trending-dataset het aantal abonnees, lifetime videoweergaven en totaal aantal video’s opgehaald.
Ik hoop dat je deze blik achter de schermen interessant vond. Mocht je vragen of opmerkingen hebben, laat het dan vooral even weten via het contactformulier.