Je hebt data van een website nodig. Schrijf je een Python-scraper? Start je Playwright op? Gebruik je een browserextensie? Na het extraheren van data van honderden verschillende sites heb ik een framework ontwikkeld om de juiste tool te kiezen.
De Opties
| Aanpak | Draait op | JS-ondersteuning | Login-support | Opzettijd |
|---|---|---|---|---|
| Python + requests | Server | ❌ | Handmatige cookies | 5 min |
| Python + BeautifulSoup | Server | ❌ | Handmatige cookies | 5 min |
| Playwright/Puppeteer | Server | ✅ | Scriptbaar | 15 min |
| Browserextensie | Browser gebruiker | ✅ | Automatisch | 0 min |
| Kopiëren-plakken | Browser gebruiker | ✅ | Automatisch | 0 min |
Elke optie heeft afwegingen. Laten we ze doornemen.
Optie 1: Python + Requests/BeautifulSoup
Beste voor: Statische HTML-pagina's, API's, geautomatiseerde pipelines
import requests
from bs4 import BeautifulSoup
response = requests.get("https://example.com/data")
soup = BeautifulSoup(response.text, "html.parser")
table = soup.find("table")
rows = []
for tr in table.find_all("tr"):
row = [td.get_text(strip=True) for td in tr.find_all(["td", "th"])]
rows.append(row)
Voordelen:
- Snelle uitvoering
- Eenvoudig te plannen (cron, Airflow)
- Geen browseroverhead
Beperkingen:
- Voert geen JavaScript uit
- Veel moderne sites renderen tabellen client-side
- Authenticatie vereist handmatige cookie-afhandeling
Wanneer het faalt: Probeer een React-dashboard te scrapen. De HTML die je krijgt is een lege <div id="root"></div>.
Optie 2: Headless Browsers (Playwright/Puppeteer)
Beste voor: JavaScript-gerenderde pagina's, geautomatiseerde pipelines, sites die interactie vereisen
const { chromium } = require('playwright');
(async () => {
const browser = await chromium.launch();
const page = await browser.newPage();
await page.goto('https://example.com/dashboard');
// Wacht tot de tabel gerenderd is
await page.waitForSelector('table');
const data = await page.evaluate(() => {
const table = document.querySelector('table');
return Array.from(table.rows).map(row =>
Array.from(row.cells).map(cell => cell.textContent.trim())
);
});
console.log(data);
await browser.close();
})();
Voordelen:
- Voert JavaScript uit
- Kan met pagina's interageren (klikken, scrollen, formulieren invullen)
- Scriptbare authenticatieflows
Beperkingen:
- Langzamer dan directe HTTP
- Veel resources nodig (geheugen, CPU)
- Complexere foutafhandeling
- Sites kunnen headless browsers detecteren
Wanneer het faalt: Veel sites detecteren Puppeteer/Playwright via navigator-eigenschappen, WebGL-fingerprinting of gedragsanalyse. Stealth-plugins helpen, maar zijn niet waterdicht.
Optie 3: Browserextensies
Beste voor: Ad-hoc extractie, beveiligde sites, gebruiker-geïnitieerde workflows
Een browserextensie draait in de werkelijke browsersessie van de gebruiker, met volledige toegang tot:
- Geauthenticeerde sessies
- JavaScript-gerenderde inhoud
- Exact dezelfde DOM die de gebruiker ziet
Bekijk de vergelijking in De 5 Beste Chrome-extensies voor het Exporteren van Tabellen.
// Content script in een Chrome-extensie
chrome.runtime.onMessage.addListener((msg, sender, sendResponse) => {
if (msg.type === "EXTRACT_TABLE") {
const table = document.querySelector("table");
const data = Array.from(table.rows).map(row =>
Array.from(row.cells).map(cell => cell.textContent.trim())
);
sendResponse({ data });
}
});
Voordelen:
- Geen authenticatie-afhandeling nodig — je bent al ingelogd
- Ziet precies wat jij ziet (geen JS-renderingproblemen)
- Werkt op elke site (geen botdetectie)
- Geen serverinfrastructuur nodig
Beperkingen:
- Vereist handmatige trigger (gebruiker klikt)
- Kan niet ingepland worden
- Beperkt tot browsercontext
Wanneer het faalt: Je moet data van 10.000 pagina's automatisch extraheren. Extensies zijn voor gebruiker-geïnitieerde workflows, niet voor batchverwerking.
Keuzeframework
Gebruik Python + requests wanneer:
- ✅ De pagina server-gerenderd HTML is
- ✅ Je geautomatiseerde/geplande extractie nodig hebt
- ✅ Je een datapipeline bouwt
- ✅ Authenticatie via API-keys of eenvoudige cookies gaat
Gebruik Playwright/Puppeteer wanneer:
- ✅ De pagina JavaScript-rendering vereist
- ✅ Je geautomatiseerde/geplande extractie nodig hebt
- ✅ Je moet interageren (scrollen, klikken, pagineren)
- ✅ Je botdetectie-tegenmaatregelen kunt afhandelen
Gebruik een Browserextensie wanneer:
- ✅ Je al ingelogd bent op de site
- ✅ Je af en toe data nodig hebt (niet geautomatiseerd)
- ✅ De site sterke botdetectie heeft
- ✅ Je data NU wilt zonder code te schrijven
Gewoon kopiëren-plakken wanneer:
- ✅ Eenmalige extractie
- ✅ Eenvoudige tabelstructuur
- ✅ Je het niet in een specifiek formaat nodig hebt
Praktijkvoorbeelden
Voorbeeld 1: Wikipedia-tabellen
Beste aanpak: Browserextensie of Python
Wikipedia is server-gerenderd HTML zonder authenticatie. Python werkt prima:
import pandas as pd
url = "https://en.wikipedia.org/wiki/List_of_countries_by_population"
tables = pd.read_html(url)
df = tables[0]
Maar Wikipedia-tabellen hebben vaak complexe rowspans en navigatierijen. Een specifieke extensie handelt deze automatisch af.
Voorbeeld 2: Financieel Dashboard (Achter Login)
Beste aanpak: Browserextensie
Je broker toont portfoliodata na inloggen. Opties:
Python: Reverse-engineer de authenticatieflow, handel 2FA af, onderhoud sessiecookies. Mogelijk maar fragiel.
Playwright: Script de login, handel 2FA-prompts af, navigeer naar de data. Werkt maar complex.
Extensie: Log normaal in, klik "Tabel Exporteren." Klaar.
Voor incidentele exports wint de extensie op tijd-tot-data.
Voorbeeld 3: Dagelijkse Prijsmonitoring (1000 Pagina's)
Beste aanpak: Playwright + wachtrij
Je moet prijzen op 1000 productpagina's dagelijks controleren. Dit vereist:
// Pseudocode voor batch-extractie
const urls = loadUrlsFromDatabase();
for (const url of urls) {
const page = await browser.newPage();
await page.goto(url);
await page.waitForSelector('.price');
const price = await page.evaluate(() =>
document.querySelector('.price').textContent
);
await saveToDatabase(url, price);
await page.close();
// Snelheidsbeperking
await sleep(randomBetween(1000, 3000));
}
Extensies kunnen dit niet — ze vereisen gebruikersinteractie. Playwright is hier de juiste tool.
Voorbeeld 4: Eenmalige Sportstatistieken-export
Beste aanpak: Browserextensie
FBREF heeft complexe headers met twee niveaus. Je hebt dit seizoens stats eenmalig nodig.
Python-aanpak: 30 minuten een aangepaste parser schrijven voor hun tabelstructuur.
Extensie-aanpak: Klik op exporteren. 10 seconden.
Voor eenmalige extractie: niet over-engineeren.
Hybride Aanpakken
Soms heb je allebei nodig:
-
Gebruik extensie om authenticatiecookies te exporteren
- Exporteer cookies vanuit een ingelogde sessie
- Importeer in Python/Playwright voor automatisering
-
Gebruik extensie om structuur te inspecteren, Python om op te schalen
- Bekijk de DOM handmatig met extensietools
- Schrijf een gerichte scraper zodra je de structuur begrijpt
-
Gebruik Playwright voor navigatie, extensie voor extractie
- Script navigeert naar de pagina
- Roept extensie-API aan voor complexe tabelparsing
Mijn Stack
Voor de 80% van de gevallen waarin ik webtabeldata nodig heb:
- Eenmalig, geauthenticeerd: HTML Table Exporter (browserextensie die ik heb gebouwd)
-
Eenmalig, openbare data:
pd.read_html()of extensie - Geautomatiseerde pipeline: Playwright met aangepaste parsers
- API beschikbaar: Directe API-aanroepen (altijd de voorkeur)
De beste tool hangt af van de specifieke extractie. Pas de complexiteit van je oplossing aan op de complexiteit van je probleem.
Wat is jouw favoriete extractie-aanpak? Meer info op gauchogrid.com/nl/html-table-exporter of probeer de extensie gratis in de Chrome Web Store.