如何用Python检测不存在的域名或无法访问的网站?
域名/网站可达性检测的Python实现与代码优化
当然可以用Python检测不存在的域名或无法访问的网站,针对你提供的代码,这里给出具体优化建议和改进后的实现:
原代码存在的问题
- 裸
except捕获所有异常,无法区分具体错误类型(比如域名不存在、连接超时、拒绝连接等) - 未设置请求超时,可能导致程序长时间挂起
- 变量名
request与模块名requests冲突,易引发混淆 - 状态码判断中
(failed)是语法错误,HTTP状态码没有该值 - 仅判断少数状态码,覆盖不全面
- 使用
GET请求会下载页面内容,效率较低,仅需检测可达性的话用HEAD请求更合适
优化后的代码实现
import requests import socket def check_site_reachable(url): result = { "url": url, "status": "", "message": "" } try: # 使用HEAD请求减少数据传输,设置超时时间(可根据需求调整) resp = requests.head(url, timeout=5) resp.raise_for_status() # 主动抛出4xx/5xx类的HTTP错误 result["status"] = "reachable" result["message"] = f"HTTP {resp.status_code} - 网站可访问" except requests.exceptions.HTTPError as e: # 处理HTTP错误(4xx/5xx) result["status"] = "http_error" result["message"] = str(e) except requests.exceptions.ConnectionError: # 处理连接错误,可能是域名不存在、拒绝连接等 try: # 尝试解析域名,判断是否是域名不存在 socket.gethostbyname(url.split("//")[-1].split("/")[0]) result["status"] = "connection_refused" result["message"] = "连接被拒绝" except socket.gaierror: result["status"] = "domain_not_exist" result["message"] = "域名不存在" except requests.exceptions.Timeout: result["status"] = "timeout" result["message"] = "请求超时" except Exception as e: # 其他未覆盖的异常 result["status"] = "unknown_error" result["message"] = f"未知错误: {str(e)}" return result # 示例使用 Phishing = ["https://example.com", "https://nonexistent-domain-xyz123.com", "https://httpstat.us/500"] exist = [] for site in Phishing: check_result = check_site_reachable(site) print(f"{site}: {check_result['message']}") if check_result["status"] == "reachable": exist.append(site) print("\n可访问的网站列表:", exist)
关键优化点说明
- 区分异常类型:细分不同异常场景,明确返回域名不存在、连接拒绝、超时等具体错误信息
- 设置超时:避免请求长时间阻塞,提升检测效率
- 使用HEAD请求:仅获取响应头,无需下载页面内容,减少带宽消耗
- 结构化结果:用字典返回检测结果,便于后续处理和分析
- 主动抛出HTTP错误:通过
raise_for_status()自动处理4xx/5xx状态码,无需逐个判断 - 域名解析验证:在连接错误时额外验证域名解析,区分域名不存在和连接拒绝的情况
内容的提问来源于stack exchange,提问作者TheBotHunter
相关产品推荐
相关产品推荐

