JpsBookOfLife/ofac-sanctioned-vessels-dashboard
GitHub: JpsBookOfLife/ofac-sanctioned-vessels-dashboard
一个整合数据采集、清洗与交互式可视化的OFAC制裁船舶追踪仪表板,并配备AI智能体以支持自然语言查询。
Stars: 0 | Forks: 0
# OFAC 制裁船舶 — 爬虫、数据处理管道与分析师仪表板
这是一个 Python 项目,它拉取**最新的 OFAC SDN (Specially Designated Nationals) 列表**,筛选出每一艘**受制裁的船舶**,对记录进行清洗和丰富,并在交互式的 **Streamlit 仪表板**中展示它们——配备完整的制裁计划 ↔ 关联公司网络图,以及一个由 **Claude 驱动的分析师智能体**,可以回答有关该舰队的问题。

## 功能介绍
- **抓取**官方 OFAC 制裁列表服务以获取最新的 SDN 列表 (`ofac_scrapper.py`)
- 使用 pandas 对原始 CSV 进行**清洗与丰富** (`clean_ofac_data.py`):
- 仅保留真实的船舶(包含有效 7 位 IMO 编号,并与经过审核的船舶参考列表进行交叉核对的行)
- 从自由文本备注中提取 IMO,并去重以确保每艘船只有一行记录
- 将行政命令计划代码合并为其基础计划(例如 `DPRK3`, `DPRK4` → `DPRK`; `RUSSIA-EO14024` → `RUSSIA`),并将它们展开为按计划划分的 Yes/No 列
- 从参考列表中填补缺失的**载重吨位**
- 在 Streamlit 中**可视化**舰队 (`dashboard.py`):核心指标、按计划和按船旗的图表、吨位分布、交互式的公司↔计划网络图,以及可过滤的原始数据
- 通过嵌入的数据集工具调用 AI 智能体**回答问题**,包括将查询移交至 MarineTraffic 以获取实时船舶位置
在撰写本文时,该数据处理管道已处理了分布在约 540 家关联公司和 58 个船旗下的约 1,480 艘受制裁船舶,其中 94% 的船舶拥有载重吨位数据。
## 截图
### 概览 — 指标、计划与船旗
侧边栏中的过滤器(制裁计划、船舶船旗)驱动着页面上的所有图表和表格。

### 载重吨位分布
一目了然地查看舰队运力——从小型拖船到超过 30 万 DWT 的原油运输船。

### 网络:制裁计划 ↔ 关联公司
红色节点代表制裁计划,蓝色节点代表在船舶备注中提及的公司("Linked To: …")。连线粗细表示船舶数量。点击节点可列出该实体的船舶,并提供各船舶对应的 MarineTraffic 链接。RUSSIA、IRAN/SDGT、DPRK、GLOMAG 和 VENEZUELA 集群可以清晰地分辨开来。

### 询问智能体 — 数据集问题
智能体(使用工具的 Claude)通过 IMO、船舶名称或关联公司搜索清洗后的数据集,并且对其能查看的数据边界非常明确。

### 询问智能体 — 实时位置移交
由于数据集没有实时 AIS 数据,对于“它现在在哪里?”的问题,智能体会识别出该船舶,并按 IMO 将其移交给 MarineTraffic。

## 工作原理
```
┌─────────────────────┐ ┌──────────────────────┐ ┌─────────────────────┐
│ ofac_scrapper.py │ │ clean_ofac_data.py │ │ dashboard.py │
│ │────▶│ │────▶│ │
│ downloads SDN.CSV │ │ filter to vessels │ │ Streamlit + Plotly │
│ from OFAC Sanctions │ │ extract IMO, dedupe │ │ + vis.js network │
│ List Service │ │ consolidate programs │ │ + Claude agent │
│ → Data/data.csv │ │ enrich deadweight │ │ │
└─────────────────────┘ │ → Data/final_data.csv│ └─────────────────────┘
└──────────────────────┘
```
**数据源**
- `Data/data.csv` — 原始 SDN 列表,每次运行时都会从 [OFAC 制裁列表服务](https://sanctionslistservice.ofac.treas.gov/)下载(未提交至仓库;可通过爬虫重新生成)
- `Data/enrichment.csv` — 以 IMO 为键的经过审核的船舶参考列表,用于确认 "IMO" 确实属于某艘船舶,并用于补全载重吨位
- `Data/final_data.csv` — 仪表板读取的清洗后的输出数据(已提交最新副本,以便仪表板开箱即用)
**智能体**直接基于 Anthropic API 构建,包含两个工具:
| 工具 | 用途 |
|------|---------|
| `find_vessels` | 通过 IMO、船舶名称或关联公司搜索清洗后的数据集;返回身份、船旗、吨位、呼号和制裁计划等信息 |
| `marinetraffic_links` | 针对实时位置 / 速度 / 航向的问题,通过 IMO 返回船舶的 MarineTraffic URL——数据集本身没有实时 AIS 数据源 |
系统提示词将智能体的范围限定在 OFAC/船舶问题上,并指示其绝不编造船舶数据。
## 运行说明
```
pip install -r requirements.txt
python ofac_scrapper.py # 1. download the latest SDN list
python clean_ofac_data.py # 2. clean + enrich -> Data/final_data.csv
streamlit run dashboard.py # 3. open the dashboard
```
本仓库附带了一份最新的 `Data/final_data.csv`,因此您可以直接跳到第 3 步进行演示。
**智能体(可选):** 在您的环境中设置 `ANTHROPIC_API_KEY` 以启用“询问智能体”部分。若未设置,仪表板的其余功能仍可正常运行。
**macOS 快捷方式:** 双击 `Launch Dashboard.command` 即可运行以上三个步骤。
## 仓库结构
```
ofac_scrapper.py # step 1 — download raw SDN list
clean_ofac_data.py # step 2 — clean, filter to vessels, enrich
dashboard.py # step 3 — Streamlit dashboard + Claude agent
Launch Dashboard.command # macOS one-click launcher (steps 1-3)
requirements.txt
Data/
enrichment.csv # vessel reference list (IMO -> deadweight)
final_data.csv # cleaned output the dashboard reads
docs/screenshots/ # images used in this README
```
## 构建技术
Python · requests · pandas · Streamlit · Plotly · streamlit-agraph (vis.js) · Anthropic API (Claude)
标签:BeEF, DLL 劫持, Kubernetes, Python, Streamlit, 大语言模型, 无后门, 爬虫, 系统分析, 网络分析, 访问控制, 逆向工具