Press "Enter" to skip to content

chrome webdriver打开一个http的网站禁止重定向到https

options.add_argument("--disable-features=HttpsUpgrades")

这个问题涉及到几个关键点,我来逐步分析并给出解决方案:

问题分析:

  1. HTTP 强制跳转 HTTPS: 你的问题核心在于,你试图通过 HTTP 访问的网站 (假设是 http://smartfin.jd.com) 自动跳转到了 HTTPS (https://smartfin.jd.com)。这是现代网站常见的做法,为了安全考虑,会将 HTTP 请求重定向到 HTTPS。
  2. 502 Bad Gateway 错误: 这个错误通常发生在服务端,表示网关或代理服务器无法从上游服务器获得有效响应。在这个场景下,你的 ChromeDriver 成功访问了 https://smartfin.jd.com,但服务器可能存在配置问题,导致无法通过 HTTPS 正常访问。
  3. TlsProtocolException 错误: 这是 ChromeDriver 尝试建立 HTTPS 连接时发生的 SSL/TLS 握手错误。错误信息 “packet length too long” 和 “record layer failure” 指示着 SSL/TLS 协商过程中出现了问题,可能是由于服务器证书配置问题、协议不兼容或其他网络问题。
  4. HTTP 可访问性: 你提到该站点的 HTTP 版本可以正常访问,这进一步证实了问题的焦点在于 HTTPS 的配置和 TLS 握手。

为什么会这样?

  • HSTS (HTTP Strict Transport Security): 网站可能设置了 HSTS 头,强制浏览器只通过 HTTPS 连接。一旦浏览器访问过该网站的 HTTPS 版本,后续即使输入 HTTP 地址,浏览器也会自动将其转换为 HTTPS。
  • 服务器重定向: 网站服务器配置了将所有 HTTP 请求重定向到 HTTPS。
  • 中间代理或 CDN: 如果你的请求经过 CDN 或代理服务器,它们可能也会强制 HTTPS 跳转。

解决方案:

由于问题核心在于网站强制 HTTPS,并且 HTTPS 存在配置问题,所以我们需要在 ChromeDriver 中禁用或绕过这种跳转,强制使用 HTTP。以下几种方法可以尝试:

方法 1:禁用 HSTS 缓存 (推荐)

HSTS 是浏览器强制 HTTPS 的主要原因。你可以通过清除 Chrome 的 HSTS 缓存来临时禁用此机制:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

chrome_options = Options()
# 添加禁用 HSTS 的参数(仅在测试环境中使用,生产环境不推荐)
chrome_options.add_argument('--disable-features=HttpsUpgrades')
# 如果是指定浏览器执行文件路径,使用如下方法
# chrome_options.binary_location = '/opt/google/chrome/chrome'
driver = webdriver.Chrome(options=chrome_options)

driver.get("http://smartfin.jd.com") # 强制使用 HTTP
# ... 其他操作 ...
driver.quit()

content_copydownloadUse code with caution.Python

说明:

  • –disable-features=HttpsUpgrades 参数会禁用 Chrome 的 HSTS 升级功能,让你可以通过 HTTP 访问网站。
  • 注意: 这个方法只会在当前 ChromeDriver 会话中生效,并且在真实用户环境中不应该禁用 HSTS,因为它会降低安全性。

方法 2:清除浏览器缓存和 Cookie

有时,浏览器缓存中的重定向信息也可能导致问题。你可以在 ChromeDriver 启动时清除缓存和 Cookie:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

chrome_options = Options()
# 清除缓存和 cookie
chrome_options.add_argument("--disable-application-cache")
chrome_options.add_argument("--disable-cache")
chrome_options.add_argument("--disable-cookies")
chrome_options.add_argument("--purge-memory-button")

driver = webdriver.Chrome(options=chrome_options)

driver.get("http://smartfin.jd.com")  # 尝试用 HTTP 打开
# ... 其他操作 ...
driver.quit()

content_copydownloadUse code with caution.Python

方法 3:使用 Whitelist (白名单,慎用)

你可以通过添加域名到白名单来尝试禁用HTTPS升级,但这并非安全最佳实践,应谨慎使用:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

chrome_options = Options()
# 添加域名到白名单来禁用HTTPS升级
chrome_options.add_argument('--ignore-certificate-errors')
chrome_options.add_argument(f'--unsafely-treat-insecure-origin-as-secure=http://smartfin.jd.com')
driver = webdriver.Chrome(options=chrome_options)
driver.get('http://smartfin.jd.com')
driver.quit()

content_copydownloadUse code with caution.Python

说明:

  • –ignore-certificate-errors:允许忽略证书错误(如果出现)。
  • –unsafely-treat-insecure-origin-as-secure:不安全地将HTTP来源视为安全。

方法 4:考虑网络环境

如果上述方法均不奏效,请检查你的网络环境。有时,网络代理、防火墙等因素也会影响 HTTPS 连接,尝试在不同的网络环境下测试。

重要提示:

  • 安全性: 在真实生产环境中,强制使用 HTTP 可能会带来安全风险。请务必理解这些解决方案的含义,并仅在测试环境中使用。
  • 问题根源: 最理想的解决方案应该是由网站管理员修复 HTTPS 配置问题。如果你能联系网站维护人员,让他们检查服务器证书配置和 HSTS 设置,也许能更彻底地解决问题。

总结:

最推荐的方法是使用 –disable-features=HttpsUpgrades 参数禁用 Chrome 的 HSTS 升级功能。如果此方法仍然无法解决问题,可以尝试其他方法或检查网络环境。 在使用这些方法时,请务必注意安全风险,并在测试环境中使用。
希望这些解决方案能帮助你解决问题!

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注