爬取中国工商银行人民币即期外汇牌价数据
爬取单日数据 前期准备 我要爬取的网站是 https://www.icbc.com.cn/ICBC/%e9%87%91%e8%9e%8d%e4%bf%a1%e6%81%af/%e8%a1%8c%e6%83%85%e6%95%b0%e6%8d%ae/%e4%ba%ba%e6%b0%91%e5%b8%81%e5%8d%b3%e6%9c%9f%e5%a4%96%e6%b1%87%e7%89%8c%e4%bb%b7/ 数据是这样的:币种、银行买入价、银行卖出价、发布时间 环境:python 3.12.2 寻找网络请求接口 在浏览器中按F12打开开发者工具,然后点击Network,勾选 Preserve log 选择 Fetch / XHR XMLHttpRequest (XHR) 和 Fetch API都是网页向服务器发起 HTTP 请求的机制。Fetch API 是一种现代的、基于 Promise 的替代方案,用于取代老旧的、基于回调的 XHR,它提供了更简洁的语法和更适合现代网页开发的功能。 手动操作页面: 选择一个日期(比如 2021-01-25) 点击【查询】 Network 列表里 新出现的 POST 请求 可以确定工商银行新版 PAPI 的“历史外汇牌价接口”:POST https://papi.icbc.com.cn/exchanges/ns/history 如何使用接口 请求方式 POST Content-Type: application/json 请求体 1 2 3 4 5 { "date": "2021-01-13", "currType": "", "serverType": "1" } 👉 这个接口不支持“时间区间” 👉 需要一天一天请求 编写代码 点击展开/折叠代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 import requests url = "https://papi.icbc.com.cn/exchanges/ns/history" headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)", "Content-Type": "application/json", "Origin": "https://www.icbc.com.cn", "Referer": "https://www.icbc.com.cn/ICBC/%E9%87%91%E8%9E%8D%E4%BF%A1%E6%81%AF/%E8%A1%8C%E6%83%85%E6%95%B0%E6%8D%AE/%E4%BA%BA%E6%B0%91%E5%B8%81%E5%8D%B3%E6%9C%9F%E5%A4%96%E6%B1%87%E7%89%8C%E4%BB%B7/" } payload = { "date": "2021-01-13", "currType": "", "serverType": "1" } r = requests.post(url, headers=headers, json=payload, timeout=10) r.raise_for_status() print(r.json()) 报错:[SSL: UNSAFE_LEGACY_RENEGOTIATION_DISABLED] 当前的 Python + OpenSSL 与工行 PAPI 服务器的 TLS 协商不兼容 更准确地说: 请求触发了“不安全的旧式 TLS 重新协商”,而 Python 默认已经禁止它 为什么浏览器能访问,我的 Python 不能? 浏览器(Chrome / Edge): ...