Een Python Web Scraper in ongeveer 25 regels

Jorg van de Ven

21 Feb, 2021

Voor een simpele web scraper heb je niet meer nodig dan ongeveer 25 regels Python code. De web scraper die hier wordt besproken inventariseert de beschikbaarheid van de NVIDIA RTX 3070 videokaart op Coolblue.nl. De web scraper haalt de naam van de videokaart, de prijs, het merk, de beschikbaarheid en de URL op en verwerkt deze data in een CSV bestand. Dit bestand is te openen in Google Sheets of Excel.
De Python web scraper vind je onderaan de pagina! Oh, de web scraper is niet gemaakt om te ‘
scalpen‘!

Python Webscraping Beautiful Soup

Hoe gebruik je Python voor Web Scraping?

Er zijn twee bekende Python Libraries waar je web scraping mee toe kan passen. Dit zijn Beautiful Soup en Scrapy. Aangezien Beautiful Soup over het algemeen het meest gebruikt wordt heb ik deze ook gebruikt in mijn Python web scraper. Door de Beautiful Soup Library te importeren wordt het mogelijk om web scraping functies te gebruiken.

Daarnaast importeren we ook de Request Library en CSV uit de Writer Library. Deze libraries worden gebruikt om de scraper naar een bepaalde URL te sturen en de opgehaalde data te verwerken in een CSV bestand.

import requests
from bs4 import BeautifulSoup
from csv import writer

Wat moet de Web Scraper verwerken?

De volgende stap is om aan te geven wat de web scraper moet gaan verwerken en waar de web scraper naartoe moet. Zo geef ik in de variabele request aan dat de web scraper de data moet verzamelen van de NVIDIA RTX 3070 pagina van Coolblue. Om de Python code beter leesbaar te maken, korten we langere instructies af en verwerken we dit in één variabele. Zo wordt de instructie BeautifulSoup(response.text, ‘html.parser’) afgekort tot soupIedere keer als ik de instructie BeautifulSoup(response.text, ‘html.parser’) wil toepassen kan ik deze dus gemakkelijk aanroepen door het woordje soup te gebruiken. Daarnaast sla ik ook de class op waar alle productdata in is te vinden. De productdata sla ik op in de variabele products. Hieronder een voorbeeld:

request = requests.get(‘https://www.coolblue.nl/videokaarten/nvidia-chipset/nvidia-geforce-rtx-3000-serie/nvidia-geforce-rtx-3070’)

soup = BeautifulSoup(request.text, ‘html.parser’)

products = soup.find_all(class_=’product-card__details js-product-details grid-unit-xs–col-8 grid-unit-l–col-12′)

Coolblue NVIDIA RTX 3070 Pagina

Hoe verwerk je de data in een CSV bestand?

Nu bepalen we hoe de resultaten van onze web scraper in een CSV bestand worden verwerkt. Als je de resultaten van je web scrape niet in een CSV wilt hebben dan kun je deze stap overslaan en is het voldoende om de Python Print() functie aan te roepen. In de onderstaande Python code kun je aangeven hoe je CSV bestand moet heten. De naam van je CSV bestand kom tussen de apostrof te staan.

In mijn voorbeeld heet het CSV bestand RTX_avail.csv. Vervolgens bepalen we in de variabele Headers de koppen van de kolommen. In mijn voorbeeld gebruik ik de koppen; ‘Title’, ‘Brand’, ‘Price’, ‘Availability’ en ‘URL’ . 

with open(‘RTX_avail.csv’, ‘w’) as csv_file:
csv_writer = writer(csv_file)
headers = [‘Title’, ‘Brand’, ‘Price’, ‘Availability’, ‘URL’]
csv_writer.writerow(headers)

Hoe bepaal je de elementen die de Web Scraper moet ophalen?

Het bepalen van de elementen hangt af van het doel van de web scraper. In mijn voorbeeld wil ik bijvoorbeeld de productnaam, de prijs, de beschikbaarheid en de URL van het product hebben. Als je andere data wilt verzamelen op een andere website dan zijn deze elementen compleet anders. De opgehaalde elementen worden verwerkt in een variabele.

Om te bepalen wat bijvoorbeeld de titel van een product is, gebruik je de inspecteerfunctie van Google Chrome. Hier kun je bepalen wat het element van de productnaam is. In dit voorbeeld zit de productnaam in een classgenaamd name. Vervolgens roep ik de get.text() functie aan om de tekst binnen dit element op te halen.
Dit verwerk ik vervolgens in de variabele title. Aan de uiteinden van de tekst zitten ook veel spaties. Dit ziet er slordig uit. Ik gebruik daarom de .strip() functie om al deze spaties te verwijderen. De onderstaande Python code laat zien hoe ik de titel ophaal:

title = product.find(class_=’grid-section-l–gap-1 js-product-item-title-wrapper’).get_text().strip()

Klik op de afbeelding om deze te vergroten.

Elementen voor Web Scrapers

Het bovenstaande proces herhaal ik totdat ik alle informatie heb verzameld die ik nodig heb. Hieronder zie je het resultaat:

title = product.find(class_=’grid-section-l–gap-1 js-product-item-title-wrapper’).get_text().strip()

link = product.find(‘a’)[‘href’]

improved_link = ‘https://www.coolblue.nl’+link

price = product.find(class_=’sales-price__current’).get_text().replace(‘,-‘,”)

inStock = product.find(class_=’color–unavailable’).get_text()

availability = ‘Not Available’ if “Tijdelijk uitverkocht” in inStock else ‘Available’

brand = title.split(‘ ‘, 1)[0]

In sommige gevallen is het mogelijk om de data creatief te verzamelen. Het merk (brand) van het product staat altijd vooraan in de producttitel. Dit is gedaan vanuit een SEO oogpunt. Door de producttitel te verdelen en daar het eerste woord van te pakken kan ik ook het merk in een variabele verwerken.

brand = title.split(‘ ‘, 1)[0]

Hoe herhaal ik dit voor ieder product op de pagina?

Als het bovenstaande je is gelukt dan heb je al een overzicht van één product. Maar je wilt natuurlijk een overzicht van alle producten die op de pagina te vinden zijn. Om dit te doen moet dezelfde actie, het ophalen van de productdata, meermaals worden uitgevoerd. Dat kan in Python (en in andere programmeertalen) met een Python For Loop. Je zet de variabelen binnen de For Loop. Het resultaat ziet er dan zo uit:

for product in products:

    title = product.find(class_=’grid-section-l–gap-1 js-product-item-title-wrapper’).get_text().strip()

    link = product.find(‘a’)[‘href’]

    improved_link = ‘https://www.coolblue.nl’+link

    price = product.find(class_=’sales-price__current’).get_text().replace(‘,-‘,”)

    inStock = product.find(class_=’color–unavailable’).get_text()

    availability = ‘Not Available’ if “Tijdelijk uitverkocht” in inStock else ‘Available’

    brand = title.split(‘ ‘, 1)[0]

Let op het tabje, de Indentation, tussen de For Loop en de variabelen, want anders werkt het niet!

Het resultaat

Als alle productdata is opgeslagen in de variabelen en deze verwerkt zijn in een For Loop kun je de resultaten uitdraaien. Dit doen we middels de print() functie in Python. Het is van belang dat je alle variabelen die je wilt uitdraaien verwerkt worden in een array ([…]) en deze in de print() functie plaatst.

print([title, brand, price, availability, improved_link]) 

Klik op de afbeelding om deze te vergroten.

Pycharm Web Scraper Resultaat Coolblue

Als je de resultaten ook in een CSV bestand wilt zien dan gebruik je ook de volgende regel Python code:

csv_writer.writerow([title, brand, price, availability, improved_link])

Hier geldt hetzelfde als bij de print() functie. Zorg ervoor dat alle variabelen die je wilt uitdraaien verwerkt worden in een array. Het CSV bestand ziet er dan als volgt uit:

Klik op de afbeelding om deze te vergroten.

Web Scrape Coolblue RTX Avail

De Python Web Scraper Code

Wil je de web scraper zelf eens proberen? Of wil je de web scraper aanpassen en toepassen op een website naar keuze? Hieronder vind je de broncode. Zorg ervoor dat je de juiste Python Libraries hebt geïnstalleerd voordat je hieraan begint.

Heb je een vraag? Stel deze gerust in de comments of op LinkedIn! Succes! 🙂

Jorg van de Ven

Jorg van de Ven

Web Analyst / SEO Specialist

Als Web Analyst en SEO specialist houd ik me dagelijks bezig met technische vraagstukken.
Kan de Crawler deze pagina bereiken? Wordt de juiste data wel naar Google Analytics verstuurd? Daar kun je mij voor inschakelen!

Ik heb o.a. gewerkt voor: Trendhopper, Kwantum, Terre des Hommes, Expert, Hero en Startselect.

Heb je een vraag voor me? Stuur me een berichtje via LinkedIn of via mijn contactpagina.

0 Comments

Submit a Comment

Your email address will not be published.

Andere blogs die je wellicht interessant vindt:

Een SEO Migratie, waar moet je op letten?

Een SEO Migratie, waar moet je op letten?

Een SEO Migratie is een hoop werk waar veel bij komt kijken. Redirects, websitesnelheid, Structured Data, koppelingen met Google Analytics en de Google Search Console en natuurlijk de URL Mapping. Voor dat laatste, de URL Mapping, heeft een web developer nu een...

read more