在使用Selenium进行模拟登录自动化开发时,不少开发者会遇到登录接口返回302状态码重定向后,页面直接出现404错误的问题,这种情况往往不是目标页面真的不存在,而是重定向过程中的会话、请求参数或浏览器配置出现了异常。

问题常见成因
302重定向后出现404错误,核心原因通常集中在以下几类:
- 会话信息丢失:登录成功后服务器返回的Cookie没有正确传递到重定向请求中,服务器无法识别用户会话,返回404
- 重定向地址异常:登录接口的302响应头中的Location地址被篡改,或者地址本身需要额外的请求参数,直接跳转会触发404
- 请求头不匹配:重定向请求的User-Agent、Referer等请求头和登录请求不一致,被服务器拦截返回404
- 浏览器拦截:部分浏览器的安全策略会拦截自动重定向,或者重定向过程中触发了反爬校验,返回虚假404
解决方案与代码示例
方案一:手动处理重定向流程,同步Cookie
我们可以拦截登录请求的响应,获取302的Location地址和Cookie,手动发起跳转,避免自动重定向丢失信息。以下是使用Selenium+requests配合处理的示例:
from selenium import webdriver
import requests
# 初始化浏览器
options = webdriver.ChromeOptions()
# 禁用自动化特征,避免被拦截
options.add_argument("--disable-blink-features=AutomationControlled")
driver = webdriver.Chrome(options=options)
# 打开登录页
driver.get("https://ipipp.com/login")
# 输入账号密码
driver.find_element("id", "username").send_keys("test_user")
driver.find_element("id", "password").send_keys("test_pwd")
# 点击登录按钮
driver.find_element("id", "login_btn").click()
# 等待登录完成,获取当前浏览器的Cookie
selenium_cookies = driver.get_cookies()
# 提取302重定向地址,这里可以通过抓包工具提前获取登录接口的302 Location,或者从浏览器日志中提取
redirect_url = "https://ipipp.com/home"
# 将Selenium的Cookie转换为requests可用的格式
req_cookies = {}
for cookie in selenium_cookies:
req_cookies[cookie["name"]] = cookie["value"]
# 携带Cookie手动请求重定向地址,验证是否可达
res = requests.get(redirect_url, cookies=req_cookies, allow_redirects=False)
print(f"手动请求重定向地址状态码:{res.status_code}")
if res.status_code == 200:
# 如果可达,再用浏览器跳转到该地址
driver.get(redirect_url)
else:
print("重定向地址请求异常,检查Cookie或地址是否正确")方案二:设置浏览器选项,避免重定向被拦截
部分浏览器的默认配置会拦截自动重定向,我们可以通过设置浏览器选项,允许所有重定向,同时同步登录后的会话:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
# 禁用沙箱模式,避免部分环境重定向被拦截
chrome_options.add_argument("--no-sandbox")
# 禁用GPU加速,减少环境差异导致的问题
chrome_options.add_argument("--disable-gpu")
# 设置User-Agent,保持和正常浏览器一致
chrome_options.add_argument("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")
driver = webdriver.Chrome(options=chrome_options)
# 先访问登录页
driver.get("https://ipipp.com/login")
# 执行登录操作
driver.find_element("id", "username").send_keys("test_user")
driver.find_element("id", "password").send_keys("test_pwd")
driver.find_element("id", "login_btn").click()
# 等待登录完成,获取当前页面的所有Cookie
cookies = driver.get_cookies()
# 如果需要跳转到其他需要登录的页面,先删除旧的Cookie,再添加登录后的Cookie
driver.delete_all_cookies()
for cookie in cookies:
driver.add_cookie(cookie)
# 跳转到重定向目标地址
driver.get("https://ipipp.com/home")方案三:通过浏览器日志获取真实重定向地址
如果不确定302重定向的真实地址,可以通过开启浏览器性能日志,获取网络请求的详细信息:
from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
# 开启浏览器性能日志
caps = DesiredCapabilities.CHROME
caps["goog:loggingPrefs"] = {"performance": "ALL"}
driver = webdriver.Chrome(desired_capabilities=caps)
driver.get("https://ipipp.com/login")
# 执行登录
driver.find_element("id", "username").send_keys("test_user")
driver.find_element("id", "password").send_keys("test_pwd")
driver.find_element("id", "login_btn").click()
# 获取性能日志,查找302重定向的Location
import json
logs = driver.get_log("performance")
for log in logs:
log_data = json.loads(log["message"])
if log_data["message"]["method"] == "Network.responseReceived":
response = log_data["message"]["params"]["response"]
if response["status"] == 302:
print(f"302重定向地址:{response.get('headers', {}).get('Location')}")注意事项
处理这类问题时,需要注意以下几点:
- 如果目标网站有反爬机制,不要频繁发起请求,避免账号被封禁
- 部分网站的登录接口会校验请求头中的Referer字段,需要手动设置和登录页一致的Referer
- 如果重定向后出现404,可以先手动在浏览器中登录,对比自动登录和手动登录的请求头、Cookie差异,快速定位问题
如果以上方案都无法解决问题,可以尝试使用无头浏览器模式,或者更换浏览器内核,部分网站的兼容性问题会导致特定浏览器出现重定向异常。