Kies het beste speciaalbiertje met hulp van Power BI
Stel, het is bijna tijd voor de vrijdagmiddagborrel. Je hebt meegedaan aan Dry January en je wilt jezelf belonen met een lekker speciaalbiertje. Je opent je favoriete website om bier te bestellen, maar wordt dan geconfronteerd met honderden biertjes… En om nu elk biertje handmatig op Untappd op te zoeken is gewoonweg geen doen. Welke moet je nu kiezen? Mark schiet te hulp! Met behulp van API’s heeft hij de belangrijkste gegevens over deze honderden biertjes van verschillende websites gescraped en in Power BI samengevoegd tot een handig overzicht dat je kunt sorteren op waardering, prijs per 100 ml en meer. Hij legt hieronder ook nog eens in detail uit hoe hij dit heeft gedaan, zodat je het zelf ook kunt toepassen. Proost!
Meer informatie over Mark
Mark Vos
API
Tegenwoordig zijn er veel partijen die hun data ter beschikking stellen door middel van API’s. Je ‘praat’ tegen een endpoint en wanneer je gemachtigd bent om gegevens te ontvangen, krijg je een resultaat terug. Vaak in de vorm van JSON of XML. Soms zijn er ook websites met waardevolle informatie, maar zonder API. Hoe zorg je er dan voor dat je de beschikking krijgt over deze gegevens?
Scrapen
Eén mogelijkheid hiervoor is het toepassen van webscraping. Het komt er op neer dat je gegevens van een website haalt en ergens opslaat. Dit kan heel eenvoudig door op een website handmatig de gewenste tekst te kopiëren en op te slaan in bijvoorbeeld een Excel-bestand. Mooier is het uiteraard om dit geautomatiseerd te doen. Een veelgebruikte methode hiervoor is Python in combinatie met Beautiful Soup. Met Beautiful Soup kun je de achterliggende HTML-code van een website parsen (ontleden) en doorzoeken. HTML kent een duidelijke structuur waardoor dit erg geschikt is om te doen. Een eenvoudig stukje Python-code als voorbeeld:
import requests
from bs4 import BeautifulSoup
url = 'https://newnexusds.nl/blogs/'
r = requests.get(url)
r_html = r.text
soup = BeautifulSoup(r_html,"html.parser")
for anchor in soup.find_all('a'):
print(anchor.get('href', '/'))
Dit stukje code gaat op zoek naar alle verwijzingen (“a href”) die aanwezig zijn op https://newnexusds.nl/blogs. Het automatisch scrapen van relatief statische pagina’s gaat op deze manier prima, maar wat doe je wanneer de gewenste informatie verspreid is over meerdere pagina’s en je op een “Next” of “Volgende” knop moet drukken om naar de volgende pagina te gaan. Dit vereist een stukje actie die met Beautiful Soup niet mogelijk is. Gelukkig is daar Selenium. Met Selenium is het mogelijk om gebruikersacties, zoals een klik naar een volgende pagina, te automatiseren.
Een praktijkvoorbeeld: Dry January, de VrijMiBo, Untappd en HonestBrew
Laten we eens een voorbeeld nemen. Stel, het is vrijddagmiddag en tijd voor de vrijdagmiddagborrel. Je hebt meegedaan aan Dry January en op de eerste vrijdag van februari wil je jezelf belonen met een lekker speciaalbiertje. Je opent Chrome, gaat naar je favoriete website om bier te bestellen (www.honestbrew.co.uk), maar wordt dan geconfronteerd met honderden biertjes! Welke moet je kiezen, welke moet je echt proberen? Als echte liefhebber van speciaalbier heb je natuurlijk ook een account op Untappd. Hier kun je van elk biertje dat ooit geproduceerd is een waardering opzoeken. Maar ja, om nu elk biertje handmatig op Untappd op te zoeken is gewoonweg geen doen. Gelukkig beschikt Untappd ook over een API en kun je dus via programmacode automatisch een zoekactie starten in de enorme bak aan gegevens waarover Untappd beschikt. Op https://untappd.com/api/docs kun je alle endpoints terugvinden die je kunt benaderen. Wij gaan er twee gebruiken:
- Beer Search
Om op basis van de titels van de biertjes op HonestBrew te zoeken en om basisgegevens van het biertje op te halen. Daarnaast gebruiken we deze om het unieke ID van het biertje op te halen. - Beer Info
Op basis van het unieke ID gaan we op zoek naar extra gegevens van het biertje, zoals de waardering, het aantal keer dat het biertje gewaardeerd is, de bitterheid (IBU), het alcoholpercentage (ABV), de omschrijving, de stijl van het bier en eventueel de logo’s van de brouwer en het biertje.
Voordat we gaan bouwen in Python gaan we eerst goed nadenken welke stappen globaal uitgevoerd moeten worden. Deze zijn als volgt:
- Open een Chrome-browser en ga naar de pagina https://honestbrew.co.uk/shop/ om te kijken welke biertjes te koop zijn;
- Scrape alle namen van de biertjes van de pagina. Per naam ga je zoeken op Untappd met de Beer Search endpoint van Untappd. Als een biertje gevonden wordt ga je met hulp van Beer Info op zoek naar de extra gegevens;
- Schrijf alle gegevens weg in een tabel die op Azure aanwezig is;
- Kijk of er nog meer pagina’s aanwezig zijn en zo ja, navigeer naar de volgende pagina en herhaal de stappen 1 tot en met 3 totdat er geen pagina’s meer zijn.
Probeer het zelf!
We gaan in deze blog niet de gehele code in detail bekijken. Daar is het te groot voor. Het komt uiteindelijk in een whitepaper die ter download beschikbaar wordt gesteld, maar ik wil wel graag laten zien hoe je eenvoudig met een paar regels code in Python met behulp van Beautiful Soup alle namen van de biertjes van een website kunt scrapen. Ik nodig je uit om het zelf ook eens te proberen! Ga met een browser (ik gebruik Chrome) naar https://honestbrew.co.uk/shop/. Een lijst met biertjes verschijnt. Klik met de rechtermuisknop op de titel van een biertje en kies voor Inspecteren. Aan de rechterkant verschijnt de console en zie je de code die hier verantwoordelijk voor is:
Zo valt te zien dat de volledige informatie over dit biertje te vinden is binnen een div-tag van de class “productdetails”. Daaronder zit een h2-tag van de class “alg-hit__title”. Hierbinnen zit een verwijzing naar de productpagina en vinden we ook de titel van het biertje terug. Nu we dit weten kunnen we het volgende Python script uitvoeren om alle titels van de biertjes die op de pagina staan te printen.
import requests
from bs4 import BeautifulSoup
from selenium import webdriver
#Bepalen URL van de site die we gaan scrapen
url = 'https://honestbrew.co.uk/shop/'
#Een nieuwe instantie van Chrome starten, de URL opvragen en de sourcecode van de pagina ophalen
driver = webdriver.Chrome()
webpage = driver.get(url)
src = driver.page_source
#BeautitfulSoup gebruiken om de sourcecode te parsen
soup = BeautifulSoup(src,"html.parser")
#Zoeken naar alle DIV-tags op de pagina van de klasse "product-details" en het aantal gevonden artikel printen
productDetails = soup.find_all("div", {"class": "product-details"})
print "Aantal artikelen op pagina: " + str(len(productDetails))
#Door alle titels loopen en de titel printen
for productDetail in productDetails:
productTitleH2 = productDetail.find("h2")
productTitle = productTitleH2.find("a")
title = productTitle.get('title')
print "Titel van het biertje is: " + title
driver.quit()
Zo eenvoudig kan het zijn! Je kunt het script zelf uitbreiden of een andere site kiezen om te scrapen.
Visualiseren in Power BI
Wanneer alle titels zijn opgehaald, de extra informatie is opgehaald met behulp van de API van Untappd en het resultaat is weggeschreven naar een database, is het tijd om te visualiseren. Hiervoor kies ik Power BI. Je kunt heel snel en eenvoudig rapporten en dashboards maken met dit programma. Ik kies voor een eenvoudige tabel met daarin de meest belangrijke gegevens. Daaronder een tabel met een omschrijving van het biertje dat je hebt geselecteerd. Je kunt de gegevens nog filteren op je favoriete brouwerij of je favoriete bierstijl.
Je wilt uiteraard het beste biertje dat er is, dus je kunt de tabel sorteren op Rating. Maar je bent ook prijsbewust. De kleur in Rating geeft aan hoe duur het biertje per 100 milliliter is ten opzichte van alle biertjes die voorkomen. Uiteraard ga je voor bang for bucks en kies je de biertjes met een hoge rating en een felgroene kleur. Toch ben je benieuwd naar de mening van anderen en kun je door te klikken op URL UT naar Untappd gaan om nog wat marktonderzoek te doen. Ben je nog steeds enthousiast over het biertje, dan klik je op de link die in URL HB staat om naar de website van HonestBrew te gaan en te bestellen. Saillant detail is dat onderaan de lijst van best gewaardeerde biertjes de alcoholvrije biertjes staan. Dit maakt Dry January nog extra moeilijk!