使用Python Requests登录ING银行遇403 Forbidden错误求助
403 Forbidden when attempting to log into ING account via Python requests
问题描述
我尝试用Python的requests库登录自己的ING银行账户,目的是下载交易记录的CSV文件,但收到了403 Forbidden错误,响应内容如下:
b'\r\n
403 Forbidden \r\n\r\n\r\n 403 ForbiddenING Webserver \r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n'
我的代码如下:
import requests headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36' } with requests.Session() as s: url = "https://mijn.ing.nl/login" USERNAME = 'username' PASSWORD = 'password' s.get(url, headers=headers) login_data = dict(username=USERNAME, password=PASSWORD, next='/') s.post(url, data=login_data, ) page = s.get('https://mijn.ing.nl/Login', headers=headers) print(page.content)
请问我为什么会收到禁止访问的错误?是POST方式不正确,还是其他原因?
分析与解决
这个403错误几乎肯定是因为你的登录请求不符合ING网站的安全验证要求,下面是具体的原因和修复思路:
1. 最核心的问题:缺少CSRF令牌
现代网站几乎都用CSRF(跨站请求伪造)令牌来保护登录等敏感接口。当你用浏览器打开登录页面时,网站会在页面的表单里嵌入一个隐藏的令牌字段(通常叫_csrf、csrf-token或类似名称),同时在Cookie中同步存储对应的值。你必须把这个令牌作为POST数据的一部分提交,否则服务器会直接判定请求非法,返回403。你的代码完全没有处理这个关键参数,这是最主要的原因。
2. 其他可能的问题
- 登录接口不匹配:你当前POST的URL是登录页面地址,但银行的登录请求往往是提交到专门的API端点(比如
/api/auth/login这类),而非直接提交到登录页面。需要用浏览器抓包确认真实的登录接口地址。 - 缺失必要请求头:除了
User-Agent,网站还可能要求Referer(证明你是从登录页面跳转过来的)、Origin、Content-Type等头信息。比如Referer应该设置为登录页面的URL,Content-Type通常需要是application/x-www-form-urlencoded。 - 反爬机制拦截:作为金融机构,ING的反爬规则非常严格,可能会检测请求顺序、Cookie完整性甚至TLS版本。你的代码虽然用了
Session,但可能没有正确保留GET登录页面后生成的所有Cookie,或者请求行为和浏览器差异太大。
3. 具体修复步骤
第一步:用浏览器抓包分析正常登录流程
打开浏览器开发者工具(F12),切换到「网络」标签,勾选「保留日志」,然后手动登录一次ING账户,重点观察:
- GET登录页面的响应HTML里,表单包含哪些隐藏字段(尤其是CSRF令牌)。
- POST登录请求的目标URL(不是登录页面地址,而是真实的提交接口)。
- 正常请求携带的所有请求头(除了Cookie,
Session会自动处理)。
第二步:修正代码(示例)
下面是加入CSRF令牌处理的示例代码(假设令牌字段为_csrf,实际以抓包结果为准):
import requests from bs4 import BeautifulSoup headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36', 'Referer': 'https://mijn.ing.nl/login', 'Content-Type': 'application/x-www-form-urlencoded' } with requests.Session() as s: login_page_url = "https://mijn.ing.nl/login" USERNAME = 'your_username' PASSWORD = 'your_password' # 1. 获取登录页面,提取CSRF令牌 response = s.get(login_page_url, headers=headers) soup = BeautifulSoup(response.content, 'html.parser') csrf_token = soup.find('input', {'name': '_csrf'}).get('value') # 2. 构造完整的登录数据,包含CSRF令牌 login_data = { 'username': USERNAME, 'password': PASSWORD, '_csrf': csrf_token, 'next': '/' } # 3. POST到真实的登录接口(需从抓包中确认) login_response = s.post(login_page_url, data=login_data, headers=headers) # 4. 验证登录是否成功(替换为登录后的页面URL) dashboard_page = s.get('https://mijn.ing.nl/overview') print(dashboard_page.status_code) print(dashboard_page.content)
额外提醒
- 如果你的ING账户开启了两步验证(比如短信验证码),即使参数正确,后续还需要处理验证码环节,这会大幅增加复杂度。
- 自动化登录银行账户可能违反银行的服务条款,操作前请务必仔细阅读ING的用户协议,避免账号被封禁。
内容的提问来源于stack exchange,提问作者Cas Blok
相关产品推荐
相关产品推荐

