Python中如何检测个人网站(如董伟明)是否因未续费而无法访问?
2019-01-22
想看点之前董伟明的分享
结果打不开了
还有哪些范例比较多个人网站大家可以推荐下吗
Python中如何检测个人网站(如董伟明)是否因未续费而无法访问?
11 回复
不明觉厉
import requests
import socket
from urllib.parse import urlparse
import ssl
import http.client
def check_website_status(url, timeout=10):
"""
检测网站状态的综合方法
"""
results = {
'url': url,
'dns_resolved': False,
'http_status': None,
'ssl_valid': False,
'connection_error': None
}
try:
# 1. DNS解析检查
parsed_url = urlparse(url)
hostname = parsed_url.hostname or url
try:
socket.gethostbyname(hostname)
results['dns_resolved'] = True
except socket.gaierror:
results['connection_error'] = "DNS解析失败"
return results
# 2. HTTP请求检查
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
}
# 尝试HTTPS
try:
response = requests.get(
f"https://{hostname}" if not parsed_url.scheme else url,
headers=headers,
timeout=timeout,
verify=True
)
results['http_status'] = response.status_code
results['ssl_valid'] = True
except requests.exceptions.SSLError:
# SSL错误,尝试HTTP
try:
response = requests.get(
f"http://{hostname}" if not parsed_url.scheme else url.replace('https://', 'http://'),
headers=headers,
timeout=timeout
)
results['http_status'] = response.status_code
except requests.exceptions.ConnectionError:
results['connection_error'] = "HTTP连接失败"
except Exception as e:
results['connection_error'] = f"HTTP错误: {str(e)}"
except requests.exceptions.ConnectionError:
results['connection_error'] = "无法建立连接"
except Exception as e:
results['connection_error'] = f"请求异常: {str(e)}"
except Exception as e:
results['connection_error'] = f"检查过程出错: {str(e)}"
return results
def interpret_results(results):
"""
解释检测结果
"""
if not results['dns_resolved']:
return "❌ 域名可能已过期或DNS配置错误"
if results['connection_error']:
if "DNS解析失败" in results['connection_error']:
return "❌ 域名解析失败,可能未续费"
elif "无法建立连接" in results['connection_error']:
return "⚠️ 服务器无法连接,可能是停机或配置问题"
else:
return f"⚠️ 连接问题: {results['connection_error']}"
if results['http_status']:
if results['http_status'] == 200:
return "✅ 网站可正常访问"
elif results['http_status'] == 403:
return "⚠️ 访问被拒绝(403)"
elif results['http_status'] == 404:
return "⚠️ 页面不存在(404)"
elif results['http_status'] == 500:
return "⚠️ 服务器内部错误"
else:
return f"⚠️ HTTP状态码: {results['http_status']}"
return "❓ 无法确定网站状态"
# 使用示例
if __name__ == "__main__":
# 测试几个网站
test_urls = [
"dongweiming.com", # 示例个人网站
"example.com",
"nonexistent-domain-12345.com"
]
for url in test_urls:
if not url.startswith(('http://', 'https://')):
url = 'https://' + url
print(f"\n检查: {url}")
results = check_website_status(url)
print(f"DNS解析: {'成功' if results['dns_resolved'] else '失败'}")
if results['http_status']:
print(f"HTTP状态码: {results['http_status']}")
if results['connection_error']:
print(f"错误信息: {results['connection_error']}")
print(f"结论: {interpret_results(results)}")
这个代码通过多维度检测网站状态:
- DNS解析检查:首先检查域名是否能解析到IP地址,如果失败通常意味着域名过期
- HTTP/HTTPS请求:尝试建立连接并获取HTTP状态码
- SSL证书验证:检查HTTPS证书是否有效
- 错误处理:区分DNS错误、连接错误、SSL错误等不同情况
关键判断逻辑:
- DNS解析失败 → 很可能域名未续费
- 能解析但无法连接 → 可能是服务器停机
- 返回特定HTTP状态码 → 根据状态码判断具体问题
用这个脚本定期检查就能知道网站是否因未续费无法访问。
建议:定期运行检查并设置告警。
他说是备案问题?
这个暂时好匆忙~样式都丢了~希望早点切回去
备案?他在知乎说的?还是哪里?应该会恢复吧
公众号
看了他一个结石的帖子看得我膀胱疼。。。。。
你把我笑的狂按 tab 键
叫什么?我去搜一下
Python 之美
搜到了,谢谢

