你猜测的可能是对的,Selenium 在处理 cookie 方面可能会有些问题,这可能导致重定向失败和 404 错误。下面是一些可能的解决方案:
- 启用隐式等待或显式等待:在 Selenium 中,页面元素的加载可能需要一些时间。如果你的代码在元素完全加载之前就尝试与其交互,可能会出现问题。你可以使用隐式等待或显式等待来确保页面元素在尝试与其交互之前已经完全加载。
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Firefox()
driver.get("http://www.example.com")
try:
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "myDynamicElement"))
finally:
driver.quit()
- 处理 cookie:你可以尝试在 Selenium 驱动器启动时加载之前会话的 cookie,或者在重定向后手动设置 cookie。
# 获取所有cookie
cookies = driver.get_cookies()
# 在需要的时候设置cookie
for cookie in cookies:
driver.add_cookie(cookie)
- 检查重定向 URL:确保 Selenium 重定向到的 URL 与人工操作重定向到的 URL 完全一致。有时候,URL 中的小差异(如查询参数或路径)可能导致 404 错误。
- 检查 headers 和其他请求参数:有些网站可能会检查请求的 headers 或其他参数,以确保请求来自有效的用户或浏览器。如果 Selenium 的默认 headers 或其他参数与真实浏览器的不同,可能会导致重定向失败。你可以尝试修改 Selenium 的 headers 或其他参数来匹配真实浏览器。
- 更新 Selenium 和 WebDriver:确保你使用的 Selenium 和 WebDriver 的版本是最新的。有时候,旧版本的软件可能存在已知的 bug 或问题。
如果以上方法都不能解决问题,你可能需要更深入地调查问题原因,例如查看网络请求和响应的详细信息,或者联系网站的管理员或开发者以获取帮助。
404是nginx返回的,我感觉是左右两边请求在nginx中匹配到了不同的location,看左侧302之后浏览器的url并没有变化,猜测 /cas?ticket=xxx 这个请求在nginx内部rewrite了,右侧302之后浏览器的url变了,等于是重新向 /cas?ticket=xxx 发起了一个get请求,两者在nginx中可能会匹配到不同的location。