A Python scraper for extracting property-for-sale listings from Rightmove by UK outcode (e.g. EH16, SW1A). Supports multi-threaded scraping for faster data collection.
Note: This tool is for educational purposes only. Always respect Rightmove's terms of service and
robots.txtbefore scraping.
- Scrape all property listings for a given UK outcode
- Extract rich property details from each listing:
- Address (display address, outcode, incode, country)
- Bedrooms and bathrooms
- Price (primary and secondary)
- Location (latitude/longitude)
- Property sub-type and ownership details (including shared ownership)
- Features: heating, parking, garden, broadband, electricity, accessibility, sewerage, water
- Flood risk: flood sources, flood defences, flooded in last 5 years
- Living costs: council tax band, ground rent, service charge
- Property sizings
- Multi-threaded scraping with configurable worker count
- Polite request pacing with configurable delay between requests
- Progress bars via
tqdm - Early stopping when no further listings are found
- Python 3.13+
- uv (recommended) or pip
git clone https://github.com/th-tsai/rightmove-scraper.git
cd rightmove-scraper
uv syncOr with pip:
pip install requests selectolax tqdmEdit the outcode variable in main.py and run:
python main.pyBy default it scrapes EH16 using all available CPU cores minus one.
from src.RightmoveScraper import RightmoveScraper, RightmoveScraperParams
params = RightmoveScraperParams()
scraper = RightmoveScraper(params)
properties = scraper.scrape_property_data_by_outcode(
outcode="SW1A",
multi_threading=True,
max_workers=7,
)RightmoveScraperParams accepts the following options:
| Parameter | Default | Description |
|---|---|---|
base_url |
Rightmove search URL | Base URL for property search |
headers |
Chrome user-agent | HTTP headers sent with requests |
max_listing_page |
42 |
Maximum listing pages to paginate through |
delay_between_requests |
1.0 |
Seconds to wait between property detail requests |
outcode_mapping_file_path |
./data/rightmove_outcode_mappings.json |
Path to the outcode-to-ID mapping file |
Each property is returned as a dictionary. Example fields:
{
"url": "https://www.rightmove.co.uk/properties/12345678",
"status_code": 200,
"display_address": "1 Example Street, Edinburgh",
"outcode": "EH16",
"incode": "5AY",
"uk_country": "Scotland",
"bedrooms": 3,
"bathrooms": 2,
"price": "£350,000",
"latitude": 55.9234,
"longitude": -3.1821,
"council_tax_band": "D",
"property_sub_type": "Terraced",
"flood_sources": [],
"heating": ["Gas central heating"],
"parking": ["Driveway"],
...
}rightmove_scraper/
├── main.py # Entry point
├── src/
│ └── RightmoveScraper.py # Scraper implementation
├── data/
│ └── rightmove_outcode_mappings.json # Outcode → Rightmove location ID mapping
└── pyproject.toml
For educational and personal use only. Not for commercial use.