You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Selenium Python WebDriver检测无效链接?解决SSL报错

解决Selenium+Python检测无效链接时的SSL报错问题

我之前也碰到过一模一样的情况,你的代码之所以出现MaxRetryError和SSLEOFError,核心问题在于:用requests直接发送HEAD请求时,没有复用浏览器的会话、Cookie和请求头,导致目标服务器(比如Google)拒绝了这种非浏览器环境的请求,进而引发SSL握手失败或者重试超限。

下面给你两种可行的解决方案,按可靠性排序:

方案一:用浏览器上下文直接检测链接(推荐)

利用Selenium执行JavaScript代码,在浏览器环境内发送请求,这样完全复用了浏览器的会话、SSL配置和请求头,和用户实际点击链接的行为一致,不会被服务器拦截。

修正后的代码:

from selenium import webdriver

chrome_driver_path = "D:\\drivers\\chromedriver.exe"
driver = webdriver.Chrome(chrome_driver_path)
driver.get('https://google.co.in/')

# 定义JavaScript函数检测链接状态
def check_link_status(url):
    check_script = f"""
    return new Promise((resolve) => {{
        const xhr = new XMLHttpRequest();
        xhr.open('HEAD', '{url}', true);
        xhr.onload = function() {{
            resolve(xhr.status);
        }};
        xhr.onerror = function() {{
            resolve('请求失败');
        }};
        xhr.send();
    }});
    """
    return driver.execute_script(check_script)

# 获取页面所有链接并检测
links = driver.find_elements_by_css_selector("a")
for link in links:
    href = link.get_attribute('href')
    # 过滤掉无效链接(比如mailto、javascript开头的)
    if href and href.startswith(('http://', 'https://')):
        status = check_link_status(href)
        print(f"链接: {href} | 状态: {status}")

driver.quit()

这个方法的优势:

  • 完全模拟用户浏览器的请求行为,避免反爬拦截
  • 不需要额外处理SSL、Cookie等问题,浏览器已经帮你搞定了

方案二:让requests模拟浏览器请求

如果坚持要用requests,需要把浏览器的Cookie、User-Agent等请求头复制给requests,让请求尽可能接近浏览器的请求。

代码示例:

import requests
from selenium import webdriver

chrome_driver_path = "D:\\drivers\\chromedriver.exe"
driver = webdriver.Chrome(chrome_driver_path)
driver.get('https://google.co.in/')

# 提取浏览器的Cookie,转换为requests可用的格式
browser_cookies = {cookie['name']: cookie['value'] for cookie in driver.get_cookies()}
# 提取浏览器的User-Agent
user_agent = driver.execute_script("return navigator.userAgent;")

# 构建模拟浏览器的请求头
request_headers = {
    'User-Agent': user_agent,
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
    'Accept-Language': 'en-US,en;q=0.5',
    'Connection': 'keep-alive'
}

# 检测链接
links = driver.find_elements_by_css_selector("a")
for link in links:
    href = link.get_attribute('href')
    if href and href.startswith(('http://', 'https://')):
        try:
            # 发送HEAD请求,带上浏览器的Cookie和请求头
            response = requests.head(
                href,
                headers=request_headers,
                cookies=browser_cookies,
                verify=True,
                timeout=10
            )
            print(f"链接: {href} | 状态码: {response.status_code}")
        except Exception as e:
            print(f"链接: {href} | 检测失败: {str(e)}")

driver.quit()

注意:这种方法虽然能解决大部分问题,但对于像Google这类有严格反爬机制的网站,还是可能被拦截,所以方案一更稳妥。

内容的提问来源于stack exchange,提问作者venky

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:45:07