The Flextender scraper is a service that extracts job listings from the Flextender platform using authenticated HTTP requests. Since Flextender doesn't provide a public API, we use HTML parsing with JSoup to extract job data.
You need to manually extract cookies from an authenticated Flextender browser session.
/supplier/jobs/recommendedapp.flextender.nlCookie header valueExample Cookie format:
_flextender_session=eyJhbGci...; remember_user_token=W1sz...
Add your cookies to the application configuration:
Using Environment Variables (Recommended for production):
export FLEXTENDER_ENABLED=true
export FLEXTENDER_COOKIES="_flextender_session=eyJhbGci...; remember_user_token=W1sz..."
Using application.yml (For development):
flextender:
enabled: true
cookies: "_flextender_session=eyJhbGci...; remember_user_token=W1sz..."
Using .env file (If supported):
FLEXTENDER_ENABLED=true
FLEXTENDER_COOKIES=_flextender_session=eyJhbGci...; remember_user_token=W1sz...
Restart the backend application to load the new configuration:
./mvnw spring-boot:run
Use the REST API endpoint to trigger scraping:
curl -X POST http://localhost:8080/api/crawler/trigger-flextender \
-H "Content-Type: application/json"
Success Response:
{
"success": true,
"message": "Flextender scraping triggered successfully"
}
Error Response (Disabled):
{
"success": false,
"error": "Flextender scraping is disabled. Set flextender.enabled=true to enable."
}
Error Response (No Cookies):
{
"success": false,
"error": "Flextender cookies not configured. Set flextender.cookies in application.yml"
}
Monitor the logs for scraping progress:
tail -f logs/application.log | grep Flextender
Expected Log Output:
INFO n.g.s.FlextenderScraperService - Starting Flextender job scraping...
INFO n.g.s.FlextenderScraperService - Found 15 job listings on Flextender
INFO n.g.s.FlextenderScraperService - Created job: https://app.flextender.nl/supplier/jobs/view/12345 - Senior Java Developer
INFO n.g.s.FlextenderScraperService - Flextender scraping completed. 15 jobs processed, 12 new jobs created
Check the crawl history in the database:
SELECT * FROM crawl_jobs
WHERE crawl_type = 'FLEXTENDER_JOBS'
ORDER BY created_at DESC
LIMIT 10;
Or use the API endpoint:
curl http://localhost:8080/api/crawler/history?page=0&size=10
The scraper extracts the following job attributes from Flextender:
| Flextender Field | Job Entity Field | Description |
|------------------|------------------|-------------|
| .flx-jobsummary-title | title | Job title |
| .flx-jobsummary-client | company | Client/company name |
| Regio (caption-field) | region | Region (Zuid-Holland, etc.) |
| Plaats (caption-field) | city | City name |
| Duur (caption-field) | description | Contract duration |
| Uren per week (caption-field) | description | Hours per week |
| Start (caption-field) | description | Start date |
| Verloopt op (caption-field) | description | Application deadline |
| Aanvraagnummer (caption-field) | description | Request number |
| .css-formattedjobdescription | description | Full job description |
Created jobs have the following default attributes:
CONTRACT (default for Flextender jobs)Consultancy (default)SENIOR (default)FLEXTENDER (for tracking)true (automatically published)The scraper includes comprehensive browser headers to avoid detection:
.header("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36")
.header("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8")
.header("Accept-Language", "en-US,en;q=0.9,nl;q=0.8")
.header("Accept-Encoding", "gzip, deflate, br")
.header("Referer", "https://app.flextender.nl/")
.header("Sec-Fetch-Dest", "document")
.header("Sec-Fetch-Mode", "navigate")
.header("Sec-Fetch-Site", "same-origin")
.header("Sec-Fetch-User", "?1")
.header("Upgrade-Insecure-Requests", "1")
.header("Connection", "keep-alive")
These headers make requests indistinguishable from real Chrome browser requests.
Cause: flextender.enabled is set to false or not configured
Solution:
flextender:
enabled: true
Cause: flextender.cookies is empty or not set
Solution: Follow Step 1 (Obtain Authentication Cookies) above
Cause: Cookies have expired or are invalid
Solution:
Cause: Flextender detected automated access or IP is blocked
Solution:
Possible Causes:
Solution:
FlextenderScraperService.java if neededCause: Caption fields in Flextender HTML changed
Solution: Update extractCaptionField() method or CSS selectors in FlextenderScraperService.java
For issues or questions:
Last Updated: 2025-10-14 Version: 1.0 Author: Claude Code Status: Production Ready
Reacties