https://github.com/stiles/alcatraz
Data collection for the 1962 Alcatraz escape and related history
https://github.com/stiles/alcatraz
Last synced: about 2 months ago
JSON representation
Data collection for the 1962 Alcatraz escape and related history
- Host: GitHub
- URL: https://github.com/stiles/alcatraz
- Owner: stiles
- License: mit
- Created: 2026-06-07T21:01:39.000Z (about 2 months ago)
- Default Branch: main
- Last Pushed: 2026-06-07T21:48:46.000Z (about 2 months ago)
- Last Synced: 2026-06-07T23:11:16.933Z (about 2 months ago)
- Language: Python
- Size: 67.1 MB
- Stars: 0
- Watchers: 0
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Alcatraz research
Replicable data collection for the 1962 Alcatraz escape and related history.
## Setup
```bash
uv sync
```
## Scripts
| Script | Source | Output |
|--------|--------|--------|
| `scripts/scrape_inmates.py` | [National Archives – Former Alcatraz Inmates](https://www.archives.gov/san-francisco/finding-aids/alcatraz-alpha) | `data/inmates.json`, `data/inmates.csv` |
| `scripts/scrape_notable.py` | [Wikipedia – List of inmates](https://en.wikipedia.org/wiki/List_of_inmates_of_Alcatraz_Federal_Penitentiary) | `data/notable_inmates.json`, `data/inmates_enriched.json`, `data/inmates_enriched.csv` |
| `scripts/scrape_escapes.py` | [BOP – Alcatraz History](https://www.bop.gov/about/history/alcatraz.jsp) | `data/escape_attempts.json`, `data/escape_attempts.csv` |
| `scripts/scrape_places.py` | [NPS Developer API – Places](https://developer.nps.gov/api/v1/places?parkCode=alca) | `data/places.json`, `data/places.csv`, `data/places.geojson` |
| `scripts/scrape_boundary.py` | [OpenStreetMap – relation 20197830](https://www.openstreetmap.org/relation/20197830) | `data/boundary.geojson` |
| `scripts/fetch_fbi_docs.py` | [FBI Vault – Alcatraz Escape](https://vault.fbi.gov/Alcatraz%20Escape/) | `data/fbi_docs.json`, `documents/*.pdf` |
Run scripts in order — `scrape_notable.py` and `scrape_escapes.py` both read from `data/inmates.csv`:
```bash
uv run python scripts/scrape_inmates.py
uv run python scripts/scrape_notable.py
uv run python scripts/scrape_escapes.py
uv run python scripts/scrape_places.py
uv run python scripts/scrape_boundary.py
uv run python scripts/fetch_fbi_docs.py # large download, ~600 MB
```
## Data
### `data/inmates.json` / `data/inmates.csv`
1,576 prisoner records from the National Archives alphabetical index.
| Column | Description |
|--------|-------------|
| `register_number` | Bureau of Prisons register number |
| `name_raw` | Original all-caps string from source (`LAST, FIRST MIDDLE`) |
| `name_last` | Last name in title case |
| `name_given` | Given name(s) in title case |
| `name_suffix` | Generational suffix (Jr., Sr., II, III, IV) if present |
| `name_full` | Reconstructed full name: `First Middle Last [Suffix]` |
Some names include alternate surnames in brackets (e.g. `Best [Besmanoff]`) or nicknames in quotes — these are preserved from the source.
### `data/inmates_enriched.json` / `data/inmates_enriched.csv`
All 1,576 records with three columns added by `scrape_notable.py`:
| Column | Description |
|--------|-------------|
| `notable` | `true` if the prisoner appears on Wikipedia's notable inmates list |
| `wikipedia_name` | Display name as it appears on Wikipedia |
| `wikipedia_url` | Link to Wikipedia article, if one exists |
Three Wikipedia entries are unmatched in the Archives list: Wilhelm von Brincken (pre-1934 military era), Robert Simmons, and Irving "Waxey Gordon" Wexler.
### `data/escape_attempts.json` / `data/escape_attempts.csv`
14 escape attempts from the BOP history page. The JSON version includes a full `participants` array with register numbers, matched names, and how each name appears in the BOP narrative. The CSV flattens participants to a pipe-delimited `participant_registers` column.
| Column | Description |
|--------|-------------|
| `attempt_number` | 1–14 in chronological order |
| `year` | Year of the attempt |
| `nickname` | BOP's informal label (e.g. "Hollywood", "Battle of Alcatraz") |
| `date_start` / `date_end` | ISO dates (equal for single-day events) |
| `description` | Narrative text from BOP |
| `participant_registers` | Pipe-delimited register numbers of matched prisoners (CSV only) |
Known matching gaps: Thomas Limerick (#3, 1938) is called "James Limerick" in the BOP text but "Thomas Robert" in the Archives; two William Martins (registers 370 and 1308) can't be disambiguated from text alone.
### `data/places.json` / `data/places.csv` / `data/places.geojson`
65 named locations on Alcatraz Island from the NPS Developer API, including coordinates, descriptions, tags, and amenities. The GeoJSON file is ready to drop into any mapping tool.
`scrape_places.py` uses `DEMO_KEY` by default. For higher rate limits, set `NPS_API_KEY` to a [free key from the NPS developer portal](https://www.nps.gov/subjects/developer/get-started.htm).
| Column | Description |
|--------|-------------|
| `id` | NPS UUID for the place |
| `title` | Location name |
| `latitude` / `longitude` | WGS84 coordinates |
| `listing_description` | Short description |
| `tags` | Pipe-delimited tags (e.g. tour stops, wayside exhibits) |
| `url` | NPS.gov page for the location |
| `is_open_to_public` | Whether publicly accessible |
| `is_passport_stamp` | Whether a National Parks Passport stamp location |
| `nps_map_id` | Internal NPS map pin ID |
### `data/boundary.geojson`
Island boundary polygon from the OpenStreetMap `natural=coastline` way ([relation 20197830](https://www.openstreetmap.org/relation/20197830)) — 135 coordinate points, roughly one vertex every 4 metres around the ~500 m perimeter. This is the highest-resolution island outline available from a free public API. Properties include `wikidata`, `wikipedia`, `gnis_feature_id`, and the OSM way id. Drop it alongside `places.geojson` for a complete map layer stack.
### `data/fbi_docs.json`
Index of the 17 FBI vault PDFs with `title`, `view_url`, and `download_url`.
## Notes
- All scripts can be re-run safely; `fetch_fbi_docs.py` skips PDFs that already exist in `documents/`.
- The FBI vault requires a browser-like User-Agent header; the script sets one automatically.
- The Archives prisoner list has no real pagination — all five alphabetical sections are on a single page.