使用Python requests登录网站返回403 forbidden错误如何解决
问题排查与修复
现有代码错误点
- 语法错误:
r=requests.get(url,proxies=proxies),headers=headers)存在括号匹配错误,headers参数位置错误 - 会话未复用:未使用Session对象维持登录态,登录请求产生的身份凭证cookie不会被后续请求携带,相当于登录后直接丢失凭证
- 登录逻辑错误:多数站点登录请求不会发送到首页,需指定正确的登录接口地址;部分站点要求先获取CSRF令牌再提交登录请求,否则会被拦截
- 403错误常见诱因:请求头缺失浏览器标识User-Agent、缺少Referer字段、Basic Authorization格式错误
- 文件写入逻辑错误:调用
r.write属于方法调用错误,应使用文件对象调用write方法写入响应内容
修复后可用代码
import requests # 配置参数,需替换为实际站点对应地址 base_url = 'https://example.com' login_url = 'https://example.com/login' # 实际登录接口地址 csv_download_url = 'https://example.com/abc.csv' # 实际csv文件下载地址 username = '实际用户名' password = '实际密码' proxies= {"https":"http://10.10.10.10:8080"} # 不需要代理可删除该配置 # 配置和浏览器一致的请求头,避免被站点拦截 headers = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36', 'Referer': base_url } # 初始化Session维持会话,自动管理cookie session = requests.Session() session.headers.update(headers) if proxies: session.proxies.update(proxies) try: # 先请求首页获取初始cookie、CSRF令牌等必要参数 session.get(base_url) # 提交登录请求 login_resp = session.post( login_url, data={ "username": username, "password": password # 抓包发现其他必填参数(如csrf_token)可在此补充 } ) login_resp.raise_for_status() # 登录成功后下载csv文件 csv_resp = session.get(csv_download_url) csv_resp.raise_for_status() # 保存文件到本地 with open("abc.csv", 'wb') as f: f.write(csv_resp.content) print("abc.csv下载完成") except Exception as e: print(f"操作失败:{str(e)}")
补充排查方案
- 可通过浏览器F12开发者工具抓取正常登录的请求包,确认登录接口地址、提交参数名,若存在CSRF、token类隐藏参数,需补充到post请求的data中
- 可将浏览器请求头全部复制到代码的headers配置中,完全模拟浏览器请求可解决绝大多数403拦截问题
- 若站点使用Basic Auth认证,直接在请求中添加
auth=(用户名, 密码)参数即可,无需单独发送POST登录请求
内容的提问来源于stack exchange,提问作者Psp0108
相关产品推荐
相关产品推荐

