Doel :
Informatie ophalen van een commerciële website en deze data gebruiken in een eigen Python webtoepassing.
Voorbeeld : connecteren met website bol.com over internet en daarvan bepaald productinformatie ophalen en deze tonen in een eigen webpagina.
Wat heb je nodig ?
Installeer eerst volgende pakketten in je Thonny ontwikkelomgeving (Python IDE) via het menu : ‘Hulpmiddelen – Pakketen beheren’ :
- NumPy : een pakket voor het rekenen met reeksen (arrays)
- Pandas : data analyse tool voor werken met gegevensstructuren, tijdreeksen en statistiek
- Requests : Python HTTP commando’s voor ophalen van en versturen van data naar webpagina’s
- Bs4 : dummy pakket voor BeautifulSoup, een HTML parser
Werkingsprincipe van de toepassing
We vragen de inhoud van de verschillende pagina’s van de zoekresultaten op met een for loop en het requests package. Vervolgens parsen we de content met een HTML parser van het package BeautifulSoup. Met .find_all() zoeken we op de class die ieder product meekrijgt zodat we een volledige lijst krijgen van alle producten van alle 15 pagina’s zoekresultaten.
Python code :
# webscraping bol_com.py
# ----------------------
import pandas as pd
import numpy as np
import requests
from bs4 import BeautifulSoup
producten_alle_paginas = []
zoek_prod_categorie = '24-inch-monitoren'
#https://www.bol.com/be/nl/s/?page=1&searchtext=24-inch-monitoren&view=list
for i in range(1,10):
#url_string = 'f"https://www.bol.com/be/nl/s/?page=' + i + '&searchtext=24-inch-monitoren&view=list"'
#print(url_string)
#response = requests.get(url_string)
response = requests.get(f"https://www.bol.com/be/nl/s/?page={i}&searchtext=24-inch-monitoren&view=list")
content = response.content
parser = BeautifulSoup(content, 'html.parser')
body = parser.body
print(i)
producten = body.find_all(class_="product-item--row js_item_root")
producten_alle_paginas.extend(producten)
print('aantal ', zoek_prod_categorie, ' :', len(producten_alle_paginas))
print('-------------------')
# omschrijving en prijs van eerste 5 produkten tonen
for i in range(1,5):
prijs = float(producten_alle_paginas[i].meta.get('content'))
productnaam = producten_alle_paginas[i].find(class_="product-title--inline").a.getText()
print(productnaam)
print(prijs, "euro")
print("-------------------------------------")
productlijst = []
for item in producten_alle_paginas:
if item.find(class_="product-prices").getText() == '\nNiet leverbaar\n':
prijs = None
else:
prijs = float(item.meta['content'])
product = item.find(class_="product-title--inline").a.getText()
productlijst.append([product, prijs])
print(productlijst[:3])
print('----------------------------------------')
df = pd.DataFrame(productlijst, columns=["Product", "prijs"])
print(df.shape)
print("=====")
print(df["prijs"].describe())
Output:
>>> %Run 'webscraping bol_com.py'
1
2
3
4
5
6
7
8
9
aantal 24-inch-monitoren : 216
-------------------
ASUS TUF VG24VQ - Full HD Curved VA Gaming Monitor - 144hz - 24 inch
169.0 euro
-------------------------------------
MSI Optix G241V - Full HD IPS Gaming Monitor - 75hz - 24 inch
129.0 euro
-------------------------------------
CHiQ 24P625F - 24 inch FULL HD LED IPS-monitor - 5 ms - Randloos aan drie zijden en ultra-slank - Minder blauw licht - Geen flikkeringen
113.09 euro
-------------------------------------
MSI Optix G241 - Full HD IPS Gaming Monitor - 144hz - 24 inch
189.0 euro
-------------------------------------
[['Samsung LS24R350 - Full HD IPS Monitor - 24 inch', 122.0], ['ASUS TUF VG24VQ - Full HD Curved VA Gaming Monitor - 144hz - 24 inch', 169.0], ['MSI Optix G241V - Full HD IPS Gaming Monitor - 75hz - 24 inch', 129.0]]
----------------------------------------
(216, 2)
=====
count 212.000000
mean 205.886887
std 97.888915
min 10.950000
25% 153.245000
50% 179.000000
75% 230.400000
max 786.500000
Name: prijs, dtype: float64