A Python scraper for extracting property listings from funda.nl, the leading Dutch real estate platform.
- Scrape property listings for buy (koop) and rent (huur)
- Support for multiple Dutch cities (Amsterdam, Rotterdam, Utrecht, etc.)
- Filter by property type (apartment, house, parking, land)
- Parallel detail page fetching for faster scraping
- Export to CSV format
- Comprehensive property data extraction
# Create virtual environment
python3 -m venv .venv
source .venv/bin/activate
# Install dependencies
pip install -r requirements.txtSet your ScrapingAnt API key as an environment variable:
export SCRAPINGANT_API_KEY="your_api_key_here"Or pass it directly via command line:
python main.py --api-key "your_api_key_here" --location amsterdam# Scrape properties for sale in Amsterdam
python main.py --location amsterdam
# Scrape rental properties in Rotterdam
python main.py --location rotterdam --contract rent
# Scrape only apartments in Utrecht
python main.py --location utrecht --property apartment# Limit to first 2 pages
python main.py --location amsterdam --max-pages 2
# Limit to 50 properties
python main.py --location amsterdam --limit 50
# Skip detail pages (faster, less data)
python main.py --location amsterdam --no-details
# Custom output file
python main.py --location amsterdam --output amsterdam_properties.csv
# Increase parallel workers
python main.py --location amsterdam --max-workers 10
# Verbose logging
python main.py --location amsterdam -v| Option | Short | Description |
|---|---|---|
--location |
-l |
City to search (default: amsterdam) |
--contract |
-c |
Contract type: buy, rent (default: buy) |
--property |
-p |
Property type: all, apartment, house, parking, land (default: all) |
--output |
-o |
Output CSV file path (default: properties.csv) |
--limit |
Maximum number of properties to scrape | |
--max-pages |
Maximum number of listing pages to scrape | |
--max-workers |
-w |
Maximum parallel requests (default: 5) |
--no-details |
Skip fetching detail pages | |
--api-key |
-k |
ScrapingAnt API key |
--verbose |
-v |
Enable verbose logging |
- Amsterdam
- Rotterdam
- Den Haag (The Hague)
- Utrecht
- Eindhoven
- Groningen
- Tilburg
- Almere
- Breda
- Nijmegen
- And more...
| Field | Description |
|---|---|
| url | Property listing URL |
| listing_id | Unique listing identifier |
| title | Property title |
| property_type | Type (Appartement, Huis, etc.) |
| contract_type | Koop (buy) or Huur (rent) |
| price | Asking price in EUR |
| price_per_sqm | Price per square meter |
| city | City name |
| neighborhood | Neighborhood/district |
| postal_code | Dutch postal code |
| street_address | Street address |
| rooms | Total number of rooms |
| bedrooms | Number of bedrooms |
| bathrooms | Number of bathrooms |
| living_area | Living area in m² |
| plot_size | Plot size in m² |
| volume | Building volume in m³ |
| floor | Floor level |
| has_elevator | Elevator available |
| has_parking | Parking available |
| has_balcony | Balcony available |
| has_terrace | Terrace available |
| has_garden | Garden available |
| energy_rating | Energy label (A-G) |
| year_built | Construction year |
| construction_type | New or existing construction |
| heating_type | Heating system type |
| insulation | Insulation details |
| status | Listing status |
| vve_contribution | Monthly VvE contribution |
| description | Property description |
| agency_name | Real estate agency name |
| agency_url | Agency profile URL |
| date_scraped | Scraping timestamp |
FundaScraper/
├── main.py # CLI entry point
├── scraper.py # Main scraper class
├── models.py # Property data model
├── utils.py # Parsing utilities
├── config.py # Configuration constants
├── requirements.txt # Python dependencies
└── README.md # This file
- Python 3.8+
- ScrapingAnt API key
MIT License