为了帮助"半自动LOF基金套利交易小组”的朋友,将来能自己修改代码,今天继续分享两个实用的人民币中间价爬取小工具:
1)爬取中国外汇交易中心最新当天的人民币汇率中间价
2)爬取从国家外汇管理局官方网站人民币汇率中间价历史数据,使用 Selenium 技术,能够,具体功能包括:
如何自己计算KWEB调试和平仓群中的折价数据 无敌在去年这篇文章的后半部分给出了一个接口可以获取最新汇率,按照这个 ChinaMoney 的 API 接口我实现了: Test_read_data_ChinaMoney_CNY_Midprice.py,能够快速获取最新的人民币汇率中间价。
defget_cny_midprice(): """从中国货币网获取人民币汇率中间价""" # 使用API路径 url = "https://www.chinamoney.com.cn/r/cms/www/chinamoney/data/fx/ccpr.json" # 模拟浏览器请求头 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36", "Accept": "application/json, text/javascript, */*; q=0.01", "X-Requested-With": "XMLHttpRequest" } try: # 发送请求 response = requests.get(url, headers=headers, proxies={}, timeout=30, verify=False) if response.status_code == 200: # 保存原始JSON到文件 with open('chinamoney_rate_api.json', 'w', encoding='utf-8') as f: f.write(response.text) # 解析JSON数据 data = response.json() # 获取日期信息 date_info = data['data']['lastDate'] if'data'in data and'lastDate'in data['data'] else"" # 查找美元兑人民币汇率 if'records'in data: for record in data['records']: if'vrtName'in record and'price'in record: if'美元'in record['vrtName'] or'USD'in record['vrtName']: rate = record['price'] print(f"✅ 找到美元兑人民币汇率: {rate} (日期: {date_info})") return rate elif'data'in data and'records'in data['data']: for record in data['data']['records']: if'vrtName'in record and'price'in record: if'美元'in record['vrtName'] or'USD'in record['vrtName']: rate = record['price'] print(f"✅ 找到美元兑人民币汇率: {rate} (日期: {date_info})") return rate except Exception as e: print(f"爬取过程中出错: {e}") returnNone安装依赖:
pip install requests运行脚本:
python Test_read_data_ChinaMoney_CNY_Midprice.py查看结果:
chinamoney_rate_api.jsondef get_rmb_history(start_date, end_date):
# 配置Chrome选项(无头模式)
chrome_options = Options()
chrome_options.add_argument('--headless')
# 启动浏览器
service = Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=service, options=chrome_options)
try:
# 打开目标网页
url = "https://www.safe.gov.cn/safe/rmbhlzjj/index.html"
driver.get(url)
# 切换到iframe
wait = WebDriverWait(driver, 30)
wait.until(EC.presence_of_element_located((By.TAG_NAME, 'iframe')))
iframe = driver.find_element(By.TAG_NAME, 'iframe')
driver.switch_to.frame(iframe)
# 定位日期输入框
wait.until(EC.presence_of_element_located((By.ID, 'startDateId')))
start_date_input = driver.find_element(By.ID, 'startDateId')
end_date_input = driver.find_element(By.ID, 'endDateId')
# 输入日期
driver.execute_script(f"arguments[0].value = '{start_date}';", start_date_input)
driver.execute_script(f"arguments[0].value = '{end_date}';", end_date_input)
# 定位并点击查询按钮
search_button = driver.find_element(By.XPATH, '//input[@onclick="javascript:validate()"]')
search_button.click()
# 等待查询结果加载
time.sleep(15)
# 定位表格并解析数据
table = driver.find_element(By.ID, 'InfoTable')
rows = table.find_elements(By.TAG_NAME, 'tr')
# 提取表头和数据
header_row = rows[0]
th_cells = header_row.find_elements(By.TAG_NAME, 'th')
headers = [cell.text.strip() for cell in th_cells]
# 只提取日期和美元数据
dollar_index = -1
for i, header in enumerate(headers):
if'美元'in header:
dollar_index = i
break
# 解析数据行
for row in rows[1:]:
cells = row.find_elements(By.TAG_NAME, 'td')
if cells and len(cells) > dollar_index:
date = cells[0].text.strip()
dollar_rate = cells[dollar_index].text.strip()
if date and dollar_rate:
row_data = {
'日期': date,
'美元': dollar_rate
}
results.append(row_data)
finally:
driver.quit()
return results
安装依赖:
pip install selenium webdriver-manager
运行脚本:
python Test_read_data_safe_rmb_history.py
查看结果:
rmb_history_YYYYMMDD_YYYYMMDD_YYYYMMDD.csvsafe_rmb_history_cache.csv修改 main() 函数中的 get_date_range() 参数:
# 获取最近60天的数据
start_date, end_date = get_date_range(60)
# 或者指定具体日期
start_date = "2026-01-01"
end_date = "2026-03-31"
⚠️ 缓存中缺少 21 天的数据,需要爬取
============================================================
【2026-04-12 13:48:39】从国家外汇管理局获取历史汇率数据
日期范围: 2026-03-13 至 2026-04-12
============================================================
正在查找iframe...
已切换到iframe
正在查找日期输入框...
通过id找到日期输入框
输入开始日期: 2026-03-13
输入结束日期: 2026-04-12
通过onclick属性找到查询按钮
点击查询按钮
等待查询结果加载...
通过id找到表格
表格行数: 21
美元列索引: 1
解析到数据: 2026-04-10 - 美元: 686.54
解析到数据: 2026-04-09 - 美元: 686.49
...
成功获取 20 条历史汇率数据
✅ 历史汇率数据已保存: rmb_history_20260313_20260412_20260412.csv
✅ 数据已保存到缓存文件: safe_rmb_history_cache.csv
============================================================
【部分历史汇率数据】
============================================================
1. 日期: 2026-04-10, 美元/人民币: 686.54
2. 日期: 2026-04-09, 美元/人民币: 686.49
3. 日期: 2026-04-08, 美元/人民币: 686.8
4. 日期: 2026-04-07, 美元/人民币: 688.54
5. 日期: 2026-04-03, 美元/人民币: 689.29
... 共 20 条数据
============================================================
【任务完成】2026-04-12 13:49:22
============================================================
本工具主要是实现了从国家外汇管理局网站爬取"历史汇率"数据的功能,支持自定义日期范围查询,并通过缓存机制提高效率。程序结构清晰,代码注释完善,便于维护和扩展。
通过本工具,可以方便地获取历史人民币汇率中间价数据,为金融分析、投资决策等提供参考。
免责声明:本工具仅用于学习和研究目的,使用时请遵守相关网站的使用条款和法律法规。