如何用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
相关产品推荐
相关产品推荐

