Webscraping

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

bron : https://pythoncursus.nl/webscraping-python/

Geef een reactie

Je e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *