147 lines
6.2 KiB
Markdown
147 lines
6.2 KiB
Markdown
# 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.
|