A reliable Singapore Parliamentary Hansard scraper that pulls daily report JSON from the SPRS endpoint and stores normalized records in an incremental Excel master file.
- Scrapes Hansard report data by date from
https://sprs.parl.gov.sg/search/getHansardReport/. - Parses section HTML content into clean text.
- Stores one row per sitting date in
hansard_master.xlsx. - Supports incremental updates by continuing from the latest date already in the master file.
- Handles non-sitting dates gracefully.
- Full architecture and component flow: docs/architecture.md
- Create and activate a virtual environment.
- Install dependencies:
pip install -r requirements.txtRun incremental scraping (default):
python hansardscrape.pyRun for a specific range:
python hansardscrape.py --start-date 01-01-2025 --end-date 31-12-2025Run full rescrape from default baseline (01-01-2020):
python hansardscrape.py --full-rescrapeUse a custom output file:
python hansardscrape.py --master-file my_hansard.xlsx--start-date DD-MM-YYYY: Start date override.--end-date DD-MM-YYYY: End date override (default: today).--master-file PATH: Output Excel file path (default:hansard_master.xlsx).--full-rescrape: Ignore incremental behavior and scrape from baseline start date.--sleep-seconds FLOAT: Delay between API requests (default:0.2).
Each row in the master file contains:
DateParliamentNoSessionNoVolumeNoSittingNoSittingTypeLanguageSectionCountAttendanceCountPTBACountVernacularDocCountSectionTitlesDebateText
- The API may return
HTTP 500for dates without sittings; this script treats those as no-data days. - Data is deduplicated by
Datebefore writing. - Excel writing requires
openpyxl.