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

如何用Python验证网站有效性?批量校验1000个HTTPS网站时全部显示正常的问题排查

解决HTTPS网站校验误判的问题

我明白你的问题——你的代码现在只要是HTTPS开头的网站就一律判定为正常,但实际很多是无效的,这肯定让人头疼。咱们先拆解原代码的问题,再一步步把它改得准确好用。

原代码的核心问题

你的当前代码只针对单个固定URL做了校验,而且存在几个关键漏洞:

  • 只要urlopen没抛出异常就判定网站正常,但有些无效HTTPS网站会被重定向到域名服务商的占位页(返回200状态码),导致误判
  • 没有设置请求超时,遇到慢网站会卡住整个程序
  • 缺少浏览器请求头(User-Agent),很多网站会拦截这类无标识的请求,返回错误却没被正确捕获
  • 没有全面检查响应状态码,比如404、500这类错误可能被遗漏(虽然urllib会抛出HTTPError,但重定向到有效页面的情况不会触发)

改进后的校验代码

下面是适配批量网站校验的版本,解决了上述问题:

from urllib.request import Request, urlopen
from urllib.error import URLError, HTTPError
import ssl
import time

def check_website_validity(url, timeout=10, allow_redirects=True):
    # 自动补全协议头,避免无http/https的URL报错
    if not url.startswith(('http://', 'https://')):
        url = f'https://{url}'
    
    # 添加浏览器请求头,绕过基础反爬
    headers = {
        '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'
    }
    req = Request(url, headers=headers)
    
    # 处理SSL证书(可选:如果有自签名证书的网站,可临时关闭验证,生产环境不推荐)
    ssl_context = ssl.create_default_context()
    if not allow_redirects:
        ssl_context.check_hostname = True
        ssl_context.verify_mode = ssl.CERT_REQUIRED
    
    try:
        with urlopen(req, context=ssl_context, timeout=timeout) as response:
            # 校验状态码:200-399代表成功或合法重定向,可根据需求调整范围
            status_code = response.getcode()
            if 200 <= status_code < 400:
                # 可选:如果要进一步排除占位页,可以检查响应内容关键词
                # content = response.read().decode('utf-8', errors='ignore')
                # if "该域名已过期" in content or "404 Not Found" in content:
                #     return False, f"占位页/无效内容 - 状态码: {status_code}"
                return True, f"✅ 正常 - 状态码: {status_code}"
            else:
                return False, f"❌ 无效 - 状态码: {status_code}"
    except HTTPError as e:
        return False, f"❌ HTTP错误 - 状态码: {e.code}"
    except URLError as e:
        return False, f"❌ 连接失败 - 原因: {str(e.reason)}"
    except Exception as e:
        return False, f"❌ 未知错误: {str(e)}"

# 批量校验你的网站列表示例
if __name__ == "__main__":
    website_list = [
        "https://example.com",
        "https://invalid-domain-12345.com",
        "http://stackoverflow.com",
        "example.org"  # 测试自动补全协议头
    ]
    
    for site in website_list:
        valid, result = check_website_validity(site)
        print(f"{site:<40} | {result}")
        # 批量请求时加延迟,避免被封IP
        time.sleep(1)

关键改进点说明

  • 自动补全协议头:处理列表中可能缺失http/https的URL
  • 添加User-Agent:模拟浏览器请求,避免被网站拦截
  • 超时设置:防止单个网站卡住整个校验流程
  • 状态码校验:明确判定200-399为有效范围,排除无效状态码
  • 可选内容校验:如果需要更严格的校验,可以检查响应内容中的关键词(比如域名过期提示、404页面标识)
  • SSL证书处理:可根据需求开启/关闭证书验证,适配不同场景
  • 批量友好:添加延迟,避免短时间大量请求被目标网站封禁IP

额外建议

如果你的1000个网站数量较大,建议用多线程/异步请求来提升校验速度(比如用concurrent.futures.ThreadPoolExecutor),但要注意控制并发数,避免给目标服务器造成压力或被封IP。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 13:09:07