Python Web Scraping in 2026: httpx + BeautifulSoup + Toneelschrijver – wanneer moet je welke gebruiken?
De meeste tutorials over "Python web scraping" uit 2018 bevelen nog steeds requests + BeautifulSoup aan. Het gedeelte 'verzoeken' is prima, maar er zijn nu betere standaardinstellingen, en de helft van het moderne internet geeft inhoud weer in JavaScript, zodat de klassieke stapel stilletjes lege pagina's retourneert.
Deze gids behandelt de beslissingsboom van 2026: wanneer httpx + BeautifulSoup gelijk heeft (nog steeds meer dan 90% van de sites), wanneer u de hulp van Toneelschrijver moet inroepen, hoe u kunt voorkomen dat u wordt geblokkeerd, en de twee regels die uw schraper zowel legaal als ethisch houden.
De beslisboom in één afbeelding
Dat is het. Negentig procent van de scraping-taken bestaat uit statische HTML – de klassieke stapel (hernoemd) is het juiste hulpmiddel. De rest heeft JS-uitvoering nodig en Playwright is het moderne antwoord.
Stap 1: httpx + BeautifulSoup (het 90% geval)
httpx is de drop-in-vervanging voor requests. Dezelfde API, plus HTTP/2-ondersteuning en native async. BeautifulSoup is ongewijzigd ten opzichte van 2015 - de keuze van de parser is belangrijk (lxml is 5x sneller dan de standaardinstelling).
Belangrijkste keuzes:
- `headers={"User-Agent": ...}` — stel altijd een echte UA in (een contactadres is beleefd). Standaard
httpxUA wordt vaak geblokkeerd. - `timeout=10` — doe nooit een onbegrensd verzoek; vastgelopen verbindingen lekken bestandsdescriptors.
- `raise_for_status()` — raises op 4xx/5xx, dus fouten zijn luid en niet stil.
- `"lxml"` parser — 5x sneller dan de standaard
html.parser, en vergevingsgezinder met verkeerd opgemaakte HTML. - `soup.select("css-selector")` — behandel scraping als "doe alsof je JavaScript's
document.querySelectorAllgebruikt". CSS-selectors zijn meestal wat u zoekt, niet de tree-walking-API.
Stap 2: Toneelschrijver (wanneer JS de inhoud weergeeft)
Veel moderne SPA's (React, Vue, Angular) verzenden een lege <div id="root"> en hydrateren alles aan de clientzijde. Met httpx.get krijgt u een lege shell — de gewenste gegevens worden geladen via fetch nadat de pagina is geladen.
Test: httpx.get(url).text — zoek naar de gewenste gegevens. Als het er niet is, heeft de site JS-uitvoering nodig.
Installeren: pip install playwright && playwright install chromium (de browserdownload is ~150MB - de moeite waard een keer, pijnlijk bij elke CI-run zonder caching).
Kosten: Toneelschrijver is 10-50x langzamer dan httpx (laden van pagina + JS-uitvoering + browseroverhead). Grijp er alleen naar als de gegevens niet in de statische HTML staan.
De vier manieren om geblokkeerd te worden
De meeste anti-schraapsystemen letten op deze vier vingerafdrukken:
1. Ontbrekende/duidelijke User-Agent
2. Geen vertraging tussen verzoeken
Ruwe opeenvolgende verzoeken hameren op een server. Voeg een vertraging toe die evenredig is aan de reactietijd. Als het 500 ms duurt voordat een pagina wordt weergegeven, wacht dan 500-2000 ms tussen de verzoeken. asyncio.sleep(willekeurig.uniform(0.5, 2.0)).
3. /robots.txt niet-toegestane paden opvragen
Sommige sites gebruiken robots.txt voor legitieme tariefsignalen - controleer dit voordat u scrapt:
4. TLS / browservingerafdruk komt niet overeen
Geavanceerde anti-scraping (Cloudflare, DataDome) vingerafdrukken van uw TLS-handshake en JS-omgeving. httpx lijkt in niets op Chrome op de TLS-laag. Opties:
curl_cffi— een op curl-imitatie gebaseerde bibliotheek die echte browser-TLS nabootst.- Toneelschrijver: per definitie echte browser-TLS.
- Roteer residentiële volmachten – de nucleaire optie.
Voor 99% van de gebruiksscenario's (niet-vijandige sites, matig volume, geen login vereist) is respect voor httpx + echte UA + vertraging + robots.txt voldoende. Als je door Cloudflare beveiligde sites op grote schaal wilt schrappen, heb je echte browsers of betaalde deblokkeringsservices nodig.
Snelheid die jezelf beperkt (de semafoor + slaappatroon)
Combineer voor bulkschrapen asyncio.Semaphore (max. gelijktijdige) met asyncio.sleep (vertraging per verzoek):
Door een maximum van 5-10 gelijktijdige + 500 ms-2s vertraging per verzoek blijft u op de meeste locaties ruim onder de snelheidslimietalarmen.
Juridische + ethische regels
1. Lees de Servicevoorwaarden van de site. Velen verbieden scraping ronduit - u kunt het nog steeds doen (ToS is contractenrecht, in de meeste rechtsgebieden geen strafrecht), maar u loopt wel juridische risico's. LinkedIn v. hiQ (2022) stelde vast dat het schrapen van publiekelijk zichtbare gegevens geen overtreding van de CFAA is in de VS, maar dat het dragen van een hoodie je niet onzichtbaar maakt.
2. Schraap geen persoonlijke gegevens. AVG/CCPA/al het andere bestraft het verzamelen van persoonlijke gegevens zonder toestemming. Als u een dataset van "werknemers bij bedrijf X" aan het opbouwen bent, stop dan.
Ethische toevoegingen die iedereen vergeet:
- Stuur een echt contactadres in uw UA. Als uw bot problemen veroorzaakt, zou de site-eigenaar u een e-mail moeten kunnen sturen.
- Als u de gegevens van de site in de cache opslaat, doe dat dan op een agressieve wijze. Zorg ervoor dat u niet elke keer de servers raakt.
- Geef de voorkeur aan openbare API's, zelfs als ze worden betaald. Goedkoper dan juridisch risico.
Het gereedschapsoverzicht van 2026
| Taak | Reik naar |
|---|---|
| Statische HTML-pagina's | httpx + BeautifulSoup(html, "lxml") |
| JS-gerenderde SPA | Toneelschrijver (Chroom zonder hoofd) |
| Cloudflare / anti-bot | curl_cffi of toneelschrijver + residentiële proxy |
| Schrapen van grote hoeveelheden | httpx.AsyncClient + Semafoor + slaap |
| Gestructureerde API-gegevens | httpx.get + .json() — geen soep nodig |
Webscrapen is in 2026 voor 90% nog steeds 'httpx + BeautifulSoup', plus weten wanneer je moet escaleren naar een echte browser. Beheers de beleefdheidsgewoonten (echte UA, semafoor, slaap, robots.txt) en je bouwt duurzame datapijplijnen zonder geblokkeerd of aangeklaagd te worden.
Volgende stap: de Data Science track bevat 15 lessen over scraping, ETL en panda's. Je bouwt een echte end-to-end pijplijn van HTTP-fetch tot DataFrame en CSV-export.