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)}")

这个代码通过多维度检测网站状态:

  1. DNS解析检查:首先检查域名是否能解析到IP地址,如果失败通常意味着域名过期
  2. HTTP/HTTPS请求:尝试建立连接并获取HTTP状态码
  3. SSL证书验证:检查HTTPS证书是否有效
  4. 错误处理:区分DNS错误、连接错误、SSL错误等不同情况

关键判断逻辑:

  • DNS解析失败 → 很可能域名未续费
  • 能解析但无法连接 → 可能是服务器停机
  • 返回特定HTTP状态码 → 根据状态码判断具体问题

用这个脚本定期检查就能知道网站是否因未续费无法访问。

建议:定期运行检查并设置告警。

他说是备案问题?

这个暂时好匆忙~样式都丢了~希望早点切回去

备案?他在知乎说的?还是哪里?应该会恢复吧

公众号

看了他一个结石的帖子看得我膀胱疼。。。。。

你把我笑的狂按 tab 键

叫什么?我去搜一下

Python 之美

搜到了,谢谢

回到顶部