cover_image

温故而知新--读取最新&历史人民币汇率数据

静听烟雨任平生 静听烟雨任平生

📋 功能介绍

为了帮助"半自动LOF基金套利交易小组”的朋友,将来能自己修改代码,今天继续分享两个实用的人民币中间价爬取小工具:

1)爬取中国外汇交易中心最新当天人民币汇率中间价

2)爬取从国家外汇管理局官方网站人民币汇率中间价历史数据,使用 Selenium 技术,能够,具体功能包括:

  • 📅 历史数据查询:支持自定义日期范围,轻松获取任意时间段的汇率数据
  • 💾 缓存机制:智能检查本地缓存,只爬取缺失数据,提高效率
  • 💵 精准提取:只提取日期和美元汇率数据,符合大多数用户需求
  • 📊 数据保存:自动将数据保存到 CSV 文件,方便后续分析


📈 第一个工具:获取最新交易日的中间价汇率

如何自己计算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

使用方法

  1. 安装依赖

    pip install requests
  2. 运行脚本

    python Test_read_data_ChinaMoney_CNY_Midprice.py
  3. 查看结果

    • 脚本会在终端显示最新的美元/人民币汇率
    • 生成的 JSON 文件:chinamoney_rate_api.json

工具特点

  • 快速获取:使用 API 接口,数据获取速度快
  • 自动保存:自动保存完整的汇率数据到 JSON 文件
  • 简单易用:代码结构清晰,易于理解和修改
  • 实时数据:获取的是最新发布的汇率数据


🔧 第二个工具:获取历史汇率的核心技术实现

爬虫核心代码

def 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

🚀 使用方法

基本使用步骤

  1. 安装依赖

    pip install selenium webdriver-manager
  2. 运行脚本

    python Test_read_data_safe_rmb_history.py
  3. 查看结果

    • 脚本会在终端显示部分数据
    • 生成的 CSV 文件:rmb_history_YYYYMMDD_YYYYMMDD_YYYYMMDD.csv
    • 缓存文件:safe_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"

⚠️ 注意事项

  1. 网络连接:需要稳定的网络连接
  2. 浏览器驱动:脚本会自动下载 ChromeDriver
  3. 数据更新:国家外汇管理局只在工作日发布汇率数据
  4. 缓存机制:首次运行会爬取数据,之后会检查缓存
  5. 文件编码:使用 UTF-8-SIG 编码,支持中文
  6. 错误处理:包含完善的异常处理和调试信息

🛠️ 依赖项

依赖项
版本
用途
Python
>= 3.7
运行环境
Selenium
>= 4.0.0
自动化浏览器操作
webdriver-manager
>= 3.5.0
自动管理浏览器驱动
csv
标准库
读写 CSV 文件
datetime
标准库
日期处理
os
标准库
文件操作

🔍 常见问题

爬取失败

  • 原因:可能是网站结构变化或网络问题
  • 解决:查看终端输出的错误信息

数据不完整

  • 原因:可能是等待时间不足或网站限制
  • 解决:增加等待时间,或减小日期范围

缓存文件损坏

  • 原因:可能是文件写入失败或手动修改
  • 解决:删除缓存文件,重新运行脚本

📊 示例输出

⚠️ 缓存中缺少 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
============================================================


🎯 总结

本工具主要是实现了从国家外汇管理局网站爬取"历史汇率"数据的功能,支持自定义日期范围查询,并通过缓存机制提高效率。程序结构清晰,代码注释完善,便于维护和扩展。

通过本工具,可以方便地获取历史人民币汇率中间价数据,为金融分析、投资决策等提供参考。


免责声明:本工具仅用于学习和研究目的,使用时请遵守相关网站的使用条款和法律法规。


继续滑动看下一个
静听烟雨任平生
向上滑动看下一个