
本文介绍如何通过模拟表单提交与 html 解析,批量获取美国众议院财务披露网站(disclosures-clerk.house.gov)中指定年份的议员财务申报 pdf 链接,并支持按申报类型(如 ptr 或 financial)进一步筛选。
本文介绍如何通过模拟表单提交与 html 解析,批量获取美国众议院财务披露网站(disclosures-clerk.house.gov)中指定年份的议员财务申报 pdf 链接,并支持按申报类型(如 ptr 或 financial)进一步筛选。
美国众议院财务披露系统(https://www.php.cn/link/7c5c19a19d6ce2d3a58c749b478ae9a2)提供公开的议员个人财务报告(Financial Disclosure)和补充报告(Periodic Transaction Report, PTR)。虽然网站本身不提供官方 API,但其搜索功能基于标准 POST 表单提交,可通过 Python 轻松自动化抓取。
以下是一个完整、可运行的示例脚本,用于检索指定年份(如 2024)的所有 PDF 报告链接:
import requests
from bs4 import BeautifulSoup
from urllib.parse import urljoin
def fetch_disclosure_pdfs(year: str, filing_type: str = None) -> list:
"""
从众议院财务披露系统抓取指定年份的 PDF 报告链接
:param year: 目标申报年份(如 "2024")
:param filing_type: 可选,过滤 PDF 类型,支持 "ptr"(Periodic Transaction)或 "financial"
:return: 包含 (姓名, 完整URL) 元组的列表
"""
# 构造请求数据(空值表示不限定其他字段)
data = {
"LastName": "",
"FilingYear": year,
"State": "",
"District": "",
}
api_url = "https://www.php.cn/link/7c5c19a19d6ce2d3a58c749b478ae9a2/ViewMemberSearchResult"
try:
response = requests.post(api_url, data=data, timeout=15)
response.raise_for_status()
except requests.RequestException as e:
raise RuntimeError(f"请求失败:{e}")
soup = BeautifulSoup(response.content, "html.parser")
base_url = "https://disclosures-clerk.house.gov/"
pdf_links = []
for a in soup.select('a[href$=".pdf"]'):
href = a["href"].strip()
if not href:
continue
# 拼接为绝对 URL
full_url = urljoin(base_url, href)
name = a.get_text(strip=True)
# 根据 filing_type 过滤(区分 PTR 与 Financial)
if filing_type:
href_lower = href.lower()
if filing_type == "ptr" and "ptr-pdfs" not in href_lower:
continue
if filing_type == "financial" and "financial-pdfs" not in href_lower:
continue
pdf_links.append((name, full_url))
return pdf_links
# 示例:获取 2024 年所有 PDF(不限类型)
links = fetch_disclosure_pdfs("2024")
print(f"共找到 {len(links)} 个 PDF 链接:")
for name, url in links[:10]: # 仅打印前 10 条作为示意
print(f"- {name} → {url}")
# 示例:仅获取 2024 年的 Periodic Transaction Reports(PTR)
ptr_links = fetch_disclosure_pdfs("2024", filing_type="ptr")
print(f"\n其中 PTR 报告共 {len(ptr_links)} 份。")
✅ 关键说明与注意事项:
SkillSub Pro - Python 题解与代码注释双功能技能功能概述SkillSub Pro - Python 题解与代码注释双功能技能是一项面向实际任务的技能,主要用于SkillSub Pro 是一个 Python 题解生成与代码注释的 双功能合体技能 ,专为学生、算法学习者和开发者设计;✅ 一个技能,两种用途 :;核心要点📝 题解模式 :输入题目/题号,自动生成完整 Python 题解(含详细注释、解题思路、复杂度分析);💬 注释模式 :输入 Python 代码,自动添加详细中。它将相关步骤、
-
请求稳定性:该网站无反爬强策略,但建议添加
requests.Session()复用连接,并设置合理User-Agent(如需增强健壮性,可加入headers={"User-Agent": "Mozilla/5.0..."})。 -
PDF 路径逻辑:
ptr-pdfs/对应周期性交易报告(PTR),financial-pdfs/对应年度财务披露(Financial Disclosure),二者结构一致,可通过 URL 路径精准区分。 - 动态内容?无需 Selenium:搜索结果由服务端渲染,纯 POST + HTML 解析即可,无需浏览器自动化。
-
合规提醒:所有数据均为政府公开信息(U.S. House Committee on Ethics),但请遵守 robots.txt(当前允许
/FinancialDisclosure/路径)及合理请求频率(建议 ≥1 秒间隔),避免对服务器造成压力。 -
扩展建议:如需下载 PDF,可配合
requests.get(url)和open(..., 'wb')实现;若需结构化存储(如 CSV/Excel),推荐使用pandas.DataFrame(links, columns=["Name", "URL"])。
掌握此方法后,你可轻松构建定时任务,监控特定议员的申报更新,或批量归档历年财务数据,为透明度分析与合规研究提供可靠数据基础。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










