crawl public speedtest result pages → ISP intelligence map
https://vdutts7.github.io/speedtests
![]() |
![]() |
result IDs opaque; no bulk export API
❌ one-off lookups: can't build ISP/regional aggregates from manual page visits
❌ third-party datasets: stale, licensed, or missing server/latency fields you need
❌ naive crawl: 403/rate limits on sequential IDs; gaps without checkpoint/resume
public speedtest.net result pages embed window.OOKLA.INIT_DATA JSON with no auth
anchor from your own run:
- open speedtest.net, run a test
- result URL in the bar- trailing digits are the ID (
/result/19360616699) - pass that ID to
sweep.py --start - sweep decrements by 1 each fetch (
19360616699,19360616698, …) - each
/result/{id}hit parses intodata/*.jsonl
+-------------+ +----------+ +--------+ +----------+
| your result | --> | sweep.py | --> | data/ | --> | query.py |
| ID | | decrement| | jsonl | | |
+-------------+ +----------+ +--------+ +----------+
python3 --version # stdlib only; sweep shells out to /usr/bin/curl# --start = ID from your own speedtest.net result URL
OUTPUT=data/ookla_results.jsonl python3 sweep.py --start 19360616699 --count 50000OUTPUT=data/ookla_results.jsonl python3 sweep.py --start 19360616699 --count 50000 --resumepython3 query.py --input data/ookla_results.jsonl --isp Airtel
python3 query.py --input data/ookla_results.jsonl --top 20
python3 query.py --input data/ookla_results.jsonl --csv > airtel_export.csv| symptom | fix | stability | why |
|---|---|---|---|
| 403 bursts | lower RATE_S or --rate |
intermittent | speedtest.net edge throttle |
| sparse hit rate | re-run your own test; use fresher --start ID |
stable | not every decremented ID exists |









