使用urllib/urllib2获取会话Cookie登录页面遇403错误求助
解决urllib/urllib2登录时的403 Forbidden问题
看了你的代码后,发现几个关键问题,这大概率是导致403错误的核心原因,咱们一步步来修正:
1. 表单参数名不匹配
你的requests代码里用的是userName作为用户名的参数键,但urllib代码里写成了userId——服务器根本无法识别这个错误的参数,自然会拒绝你的认证请求,后续访问目标站点肯定拿不到合法权限。
2. 缺少必要的请求头
requests会自动帮你设置合理的User-Agent和表单提交的Content-Type,但urllib2默认的请求头非常简陋,很多服务器会直接拦截这类非浏览器风格的请求:
User-Agent:默认的Python-urllib/2.x很容易被识别为爬虫或旧客户端Content-Type:提交表单时需要明确设置为application/x-www-form-urlencoded,否则服务器可能无法解析你的请求数据
修正后的完整代码
import urllib import urllib2 import cookielib # 初始化CookieJar,用于保存会话Cookie cj = cookielib.CookieJar() opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) # 不建议用install_opener修改全局默认opener,直接用当前opener发送请求更可控 # 注意:参数名要和requests代码保持一致,是userName而非userId! values = { "userName": "username", "password": "password", "apiKey": "myApiKey" } auth_url = 'https://sso.somewebsite.com/api/authenticateme' encoded_data = urllib.urlencode(values) # 构造认证POST请求,添加必要请求头 auth_req = urllib2.Request(auth_url, encoded_data) auth_req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36') auth_req.add_header('Content-Type', 'application/x-www-form-urlencoded') try: # 发送认证请求,Cookie会自动存入cj auth_resp = opener.open(auth_req) print(f"认证成功,响应状态码:{auth_resp.getcode()}") # 用同一个opener访问目标站点,自动携带会话Cookie target_req = urllib2.Request('https://download.somewebsite.com') target_req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36') target_resp = opener.open(target_req) print(f"目标站点访问成功,响应状态码:{target_resp.getcode()}") # 如需查看响应内容,可取消注释 # content = target_resp.read() except urllib2.HTTPError as e: print(f"HTTP错误:{e.code} {e.reason}") except Exception as e: print(f"其他错误:{str(e)}")
额外排查建议
- 如果还是报错,可以用浏览器开发者工具(F12)查看真实请求的所有头信息,把
Accept、Referer等必要头也添加到urllib2的Request中,确保请求和浏览器发送的完全一致。 - 可以打印认证后的CookieJar内容,确认是否成功获取到会话Cookie:
print([cookie for cookie in cj])
内容的提问来源于stack exchange,提问作者hod




