@@ -0,0 +1,146 @@
|
||||
# Bron onboarden
|
||||
|
||||
Een nieuwe bron wordt nooit direct als onbeperkt actief beschouwd. Gebruik het traject **candidate → trial → active** en ga bij veiligheids- of kwaliteitsproblemen naar **quarantined**.
|
||||
|
||||
## Toegestane broncategorieën
|
||||
|
||||
Voorkeursvolgorde:
|
||||
|
||||
1. openbare carrièrepagina van de feitelijke werkgever;
|
||||
2. openbare, door de werkgever bedoelde ATS-vacaturepagina;
|
||||
3. expliciete RSS/Atom-feed of sitemap met vacatures;
|
||||
4. vacaturemail die de gebruiker zelf heeft geactiveerd;
|
||||
5. handmatige browserimport door de gebruiker.
|
||||
|
||||
Niet onboarden zonder expliciete, aantoonbare toestemming:
|
||||
|
||||
- ingelogde zoekresultaten of profielpagina's;
|
||||
- pagina's achter CAPTCHA, anti-bot challenge of toegangscontrole;
|
||||
- denylistplatformen via directe crawling;
|
||||
- verborgen/private endpoints die alleen door reverse engineering zijn gevonden;
|
||||
- bronnen waarvan robots/voorwaarden of technische signalen automatisering verbieden.
|
||||
|
||||
## Reviewchecklist
|
||||
|
||||
Leg per bron vast:
|
||||
|
||||
- naam, bronsoort, hoofddomein en exacte start-URL;
|
||||
- eigenaar/eindwerkgever en eventuele ATS-provider;
|
||||
- publieke toegankelijkheid zonder login;
|
||||
- datum en samenvatting van robots- en voorwaardenreview;
|
||||
- toegestane paden en eventuele uitgesloten paden;
|
||||
- parserstrategie: JSON-LD, RSS, gespecialiseerd ATS of generieke HTML;
|
||||
- verwachte frequentie en minimale interval;
|
||||
- maximaal documentvolume en paginatie;
|
||||
- welke velden daadwerkelijk aanwezig zijn;
|
||||
- retentiebehoefte en mogelijke persoonsgegevens;
|
||||
- contact-/user-agentinformatie indien passend;
|
||||
- rollback/quarantainecriterium.
|
||||
|
||||
`robots.txt` alleen is geen volledige juridische toestemming, en afwezigheid ervan is geen automatische toestemming. Het technische bronbeleid ondersteunt een conservatieve beslissing; de beheerder blijft verantwoordelijk voor de bronreview.
|
||||
|
||||
## Candidate aanmaken
|
||||
|
||||
Gebruik Django admin of `seed_sources` met een gecontroleerd YAML-record. Begin met:
|
||||
|
||||
```yaml
|
||||
name: Voorbeeld Werkgever
|
||||
source_type: employer
|
||||
base_url: https://careers.example.org/jobs
|
||||
status: candidate
|
||||
policy: review
|
||||
parser_key: auto
|
||||
strict_mode: true
|
||||
honor_robots: true
|
||||
crawl_interval_minutes: 720
|
||||
minimum_interval_seconds: 30
|
||||
max_concurrency: 1
|
||||
```
|
||||
|
||||
Zet `policy: allow` pas na review. Een onbekende bron blijft in strict mode zonder fetch.
|
||||
|
||||
## Fixture vóór live request
|
||||
|
||||
Bewaar een gesaneerd voorbeeld onder `fixtures/pages`, `fixtures/feeds` of `fixtures/emails`. Verwijder trackingtokens, persoonsgegevens en niet-noodzakelijke volledige teksten. Schrijf tests voor:
|
||||
|
||||
- normale vacature;
|
||||
- ontbrekende optionele velden;
|
||||
- nul vacatures;
|
||||
- gewijzigde markup of meerdere jobs;
|
||||
- kwaadaardige HTML en onveilige links;
|
||||
- idempotente replay;
|
||||
- parserconfidence en waarschuwingen.
|
||||
|
||||
## Trialrun
|
||||
|
||||
1. Zet bron op `trial` en `policy=allow`.
|
||||
2. Voer één handmatige run uit via de retryknop of Celerytask.
|
||||
3. Controleer status, final URL, bytes, parser, warnings en tellers.
|
||||
4. Open alleen gesaniteerde jobweergave; vergelijk steekproefsgewijs met de publieke bron.
|
||||
5. Controleer canonieke URL, werkgever, locatie, datum, verloopdatum, taal en duplicaten.
|
||||
6. Verifieer dat redirectdoelen, rate limit en conditional requests correct zijn.
|
||||
7. Laat minimaal twee geplande cycli goed verlopen vóór promotie naar `active`.
|
||||
|
||||
## Automatische quarantainecriteria
|
||||
|
||||
Een bron moet worden gepauzeerd of in quarantaine gezet bij:
|
||||
|
||||
- redirect naar denylist, login, private adresruimte of onverwacht domein;
|
||||
- herhaalde 401/403/429, CAPTCHA of anti-botpagina;
|
||||
- contenttype/grootte buiten beleid;
|
||||
- parseroutput met plotseling nul jobs terwijl de bron zichtbaar jobs bevat;
|
||||
- abnormale volumestijging of duplicaatstorm;
|
||||
- HTML-sanitization/securityfout;
|
||||
- voorwaardenwijziging of verlopen bronreview;
|
||||
- opeenvolgende fouten boven de vastgelegde drempel.
|
||||
|
||||
## Gespecialiseerde ATS-adapter
|
||||
|
||||
Voeg alleen een adapter toe wanneer meerdere bronnen hetzelfde stabiele publieke formaat gebruiken of de generieke adapter onvoldoende bewijs levert. De adapter:
|
||||
|
||||
- krijgt geen credentials;
|
||||
- gebruikt uitsluitend gedocumenteerde publieke jobdata of publieke pagina's;
|
||||
- implementeert het interne adaptercontract;
|
||||
- heeft providerfixtures en contracttests;
|
||||
- valt veilig terug zonder globale pipeline te breken;
|
||||
- documenteert paginatie, sluitingssignalen en rate limits.
|
||||
|
||||
## Bron verwijderen
|
||||
|
||||
Pauzeer eerst. Behoud canonieke vacatures en herkomst zolang productretentie dat vereist; verwijder niet blind clusters die ook andere aliassen hebben. Verwijder raw documents volgens retentie, trek de policy in en noteer de reden en datum.
|
||||
|
||||
## Reviewbeleid bij bronbeoordeling
|
||||
|
||||
- Een bron mag alleen automatisch gefetcht worden wanneer een actuele `SourcePolicyReview` bestaat met geldige reden, scope en vervaldatum.
|
||||
- Terms review blijft menselijk, niet automatisch door AI of heuristiek.
|
||||
- Bij ontbrekende of verlopen review of bij expliciet `pause`/`deny` besluit blokkeert de taakuitvoering.
|
||||
|
||||
## Handmatige import in de interface
|
||||
|
||||
Voor uitzonderlijke vacatures kan de beheerder handmatig importeren via de bronpagina:
|
||||
|
||||
- navigeer naar `Brongezondheid` en gebruik het "Handmatige import" formulier;
|
||||
- gebruik de bookmarklet om de huidige pagina-URL te vullen in `source_url`;
|
||||
- of plak direct relevante vacaturetekst in het tekstveld wanneer fetch niet is toegestaan.
|
||||
|
||||
De bookmarklet stuurt alleen `source_url` naar de import-URL, zonder secret of broninhoud.
|
||||
|
||||
Na import toont de bronlijst:
|
||||
|
||||
- de gekozen modus (`url` of `paste`);
|
||||
- bron-ID/bron-URL;
|
||||
- aantallen herkend, nieuw en duplicaat;
|
||||
- waarschuwingen;
|
||||
- links naar vacaturedetail voor direct vervolg.
|
||||
|
||||
## Providerdetails (VR-106)
|
||||
|
||||
Voor het onboarden van publieke ATS-bronnen moet het bronrecord minimaal een van de volgende providerspecificaties gebruiken:
|
||||
|
||||
- Greenhouse (`*.greenhouse.io` / `*.boards.greenhouse.io`) — max 15 requests/min, alleen publiek toegankelijke jobdata.
|
||||
- Lever (`jobs.lever.co`) — max 60 requests/min, alleen `jobs.lever.co` en officiële publieke endpoints.
|
||||
- Recruitee (`*.recruitee.com`) — max 60 requests/min, geen login/partner endpoint.
|
||||
- SmartRecruiters (`*.smartrecruiters.com`) — max 30 requests/min, alleen publieke vacaturepagina/feeds.
|
||||
- Workable (`apply.workable.com`) — max 30 requests/min, alleen publieke vacaturepagina/feeds.
|
||||
|
||||
Bij twijfel altijd op `review` blijven en eerst via een trialrun met gesloten evaluatiecriteria (gesloten job, lege joblijst, markeringswijziging) valideren.
|
||||
Reference in New Issue
Block a user