Bronnen en methoden
Opmerking toevoegen
Je kunt opmerkingen plaatsen via Opmerking toevoegen aan de rechterkant van de pagina.
Doel
Per externe bron de juiste detectiemethode kiezen, zodat we elke relevante opdracht op tijd binnen hebben zonder bronnen te overbelasten. Deze pagina beschrijft de drie methoden die we vandaag inzetten, wanneer we welke gebruiken, en hoe ze technisch in elkaar steken.
Keten per methode
flowchart TD
subgraph BR["Bron"]
BR1[DAS-portaal HTML]
BR2[Open JSON-koppeling]
BR3[Endpoint met snel signaal]
BR4[Sequentiële job-id's]
end
BR1 --> H[n8n browserrobot]
BR2 --> A[API-poller]
BR3 --> W[Cheap-signal watcher]
BR4 --> F[Fast-watch ingester]
H --> P[Snippets: snapshot + changed-only + map + add_job]
A --> P
W -- "fingerprint flip" --> A
F --> P
P --> J[(Vacature in database)]Welke methode wanneer
| Bron-type | Voorbeeld | Methode | Cadens |
|---|---|---|---|
| HTML-portaal zonder open koppeling | Harvey Nash, Maandag, Circle8, TenderNet | n8n browserrobot | 2 uur (TenderNet 6 uur) |
| HTML-portaal met sequentiële job-id's | Flextender | n8n browserrobot + fast-watch (sub-5s) | 2 uur (n8n) / 3 sec (watcher) |
| Structuurrijke JSON-koppeling | Striive CMS API | API-poller | 15 min |
| JSON-koppeling met snelheidseis | Striive CMS API + watcher | Cheap-signal watcher die API-poller triggert | 10 s tijdens werkuren, 5 min daarbuiten |
| Geen scraper actief | Yacht, werken-voor-nederland, Maandag (parent) | Placeholder in database, nog te bouwen | n.v.t. |
n8n browserrobot
1
Workflow start
Een planning in n8n start de workflow elke 2 uur. Per platform een eigen workflow met dezelfde gedeelde bouwstenen.
2
Pagina's ophalen
Een Playwright-browser bezoekt de inhuurpagina's, klikt door tot lijst van openstaande opdrachten en leest titels, eisen, wensen en sluitingsdatum uit.
3
Verwerken
Snippets normaliseren de data, filteren ongewijzigde items eruit en upserten in de database. Voor de gebruiker zichtbaar: nieuwe opportunity in werkbakje binnen 2 uur na publicatie.
4
Cancelled/failed signaal
Faalt een workflow, dan zie je dat als rode rij in /scrapers en in de incident-feed. Er volgt automatische escalatie als het twee runs achter elkaar misgaat.
API-poller
1
Bronregistratie
Per bron staat een record in jobs.platform met method=api-poll en een eigen source_slug, bijvoorbeeld striive-api. Zo blijven HTML- en API-runs apart traceerbaar.
2
Periodieke ronde
De daemon haalt elke 15 minuten alle opdrachten van de bron, doorloopt de pagina-iteratie en past dezelfde snippets toe als n8n.
3
Triggerronde
Buiten de periodieke ronde kan een watcher de daemon vragen om direct een ronde te draaien voor één bron, via een interne POST naar /trigger/:source. De daemon weigert overlappende runs voor dezelfde bron.
4
Zichtbaarheid
Resultaat zie je op /sources in de ops-console. Per bron staat methode, laatste run, duur, succesratio en het aantal nieuwe of gewijzigde rijen.
Cheap-signal watcher
1
Stream-and-abort probe
De watcher start een GET-request, leest alleen de eerste paar kilobytes en sluit de verbinding. In die kilobytes haalt hij twee getallen: het totaal aantal opdrachten en de identifier van de nieuwste.
2
Fingerprint vergelijken
Van die twee maakt hij een hash. Is de hash gelijk aan vorige keer, dan is er niets veranderd. Verschilt hij, dan is er een nieuwe of verdwenen opdracht.
3
Triggeren
Bij een wijziging stuurt hij meteen een trigger naar de API-poller, die dezelfde minuut nog een volledige ronde draait. De watcher zelf doet geen ingestie.
4
Werkuren-bewust
Tijdens werktijd (Mon-Vri 08:00-17:00 Europe/Amsterdam) probeert hij elke 10 seconden, daarbuiten elke 5 minuten. Dat scheelt onnodige verzoeken 's nachts en in het weekend.
Fast-watch (variant zonder triggerstap)
1
Sequentiële id-probe
Sommige bronnen, zoals Flextender, geven elke nieuwe opdracht een oplopend nummer. De watcher checkt elke 3 seconden of <code>laatste-nummer + 1</code> een geldige pagina oplevert. Lukt het, dan is er een nieuwe opdracht uit.
2
Direct verwerken
In plaats van een trigger te sturen leest deze variant de pagina meteen zelf, normaliseert de velden en schrijft direct in de database. Snelheid in plaats van een handshake met de poller.
3
Update-sweep
Naast de nieuwe-id-loop draait er elk uur een ronde langs eerder gepubliceerde opdrachten om wijzigingen op te vangen (verschoven sluitingsdatum, herziene tarieven). De drift-detectie gebeurt downstream via een hash-vergelijking.
4
Belt-and-suspenders
De n8n browserrobot blijft daarnaast op cadens 2 uur lopen. Beide kanalen botsen niet: ze landen op dezelfde dedup-sleutel en updaten één rij.
Welke methode actief is per platform zie je altijd op één plek: de coverage map in scrapers/README.md. Daar staat ook of een platform op intake, staging, live of sunset staat.