最简单直接的方法是使用Python的requests库发送HTTP请求并检查状态码。这是一个高效的方式,适用于大多数网站可用性检查场景。
import requests
def check_website(url):
"""
检查网站是否能正常访问
:param url: 要检查的网站URL
:return: 布尔值,表示网站是否可访问
"""
try:
response = requests.get(url, timeout=10)
if response.status_code == 200:
print(f"网站 {url} 可以正常访问,状态码: 200")
return True
else:
print(f"网站 {url} 返回异常状态码: {response.status_code}")
return False
except requests.exceptions.RequestException as e:
print(f"网站 {url} 无法访问,错误: {e}")
return False
check_website("https://www.google.com")
这种方法通过发送GET请求并检查HTTP状态码来判断网站可用性。状态码200表示成功,其他状态码(如404、500等)或请求异常则表示网站无法访问。
2 使用ping命令检测网络连通性
有时网站可能正在运行但HTTP服务有问题,使用ping命令可以检查服务器本身的网络连通性。
import subprocess
import platform
def ping_ip(ip):
"""
检查域名IP是否能Ping通
:param ip: 要ping的IP地址或域名
:return: 布尔值,表示是否可ping通
"""
try:
# 根据不同系统设置ping参数
param = "-n" if platform.system().lower() == "windows" else "-c"
command = ["ping", param, "4", ip] # 发送4个ping包
output = subprocess.run(
command,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
text=True
)
if output.returncode == 0:
print(f"IP {ip} 可以Ping通")
return True
else:
print(f"IP {ip} 无法Ping通")
return False
except Exception as e:
print(f"Ping {ip} 时发生错误: {e}")
return False
ping_ip("www.google.com")
这种方法直接检查与服务器的网络连接,但不依赖于HTTP服务,可以帮助区分网络问题和Web服务问题。
3 使用socket检测端口开放情况
对于需要检查特定端口(如HTTP端口80或HTTPS端口443)的情况,可以使用socket库进行TCP连接测试。
import socket
def check_port(ip, port):
"""
检查域名IP的指定端口是否开放
:param ip: 要检查的IP地址或域名
:param port: 要检查的端口号
:return: 布尔值,表示端口是否开放
"""
try:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(5) # 设置超时时间
result = sock.connect_ex((ip, port))
if result == 0:
print(f"IP {ip} 的端口 {port} 已开放")
return True
else:
print(f"IP {ip} 的端口 {port} 未开放")
return False
except Exception as e:
print(f"检查端口 {port} 时发生错误: {e}")
return False
finally:
sock.close()
check_port("www.google.com", 443)
这种方法可以检查特定端口的可用性,适用于需要验证特定服务(如Web服务器、数据库等)是否运行的场景。
4 综合检测方案
将以上方法结合,可以创建一个全面的网址检测工具,提供更全面的可用性信息。
import requests
import subprocess
import socket
import platform
def comprehensive_check(url, port=80):
"""
综合检测网址可用性
:param url: 要检测的网址
:param port: 要检查的端口号
:return: 字典,包含各项检测结果
"""
results = {
'url': url,
'port': port,
'website_accessible': False,
'ip_address': None,
'pingable': False,
'port_open': False
}
# 提取域名
domain = url.split("//")[-1].split("/")[0]
# 解析域名IP
try:
ip = socket.gethostbyname(domain)
results['ip_address'] = ip
print(f"域名 {domain} 的IP地址是: {ip}")
except socket.gaierror as e:
print(f"无法解析域名 {domain} 的IP地址,错误: {e}")
return results
# 检查网站访问
results['website_accessible'] = check_website(url)
# 检查Ping
results['pingable'] = ping_ip(ip)
# 检查端口
results['port_open'] = check_port(ip, port)
return results
results = comprehensive_check("https://www.google.com", 443)
这个综合方案提供了从DNS解析到HTTP服务完整链路的可用性检查,可以帮助全面了解网址的可访问性状态。
5 多网址批量检测与结果展示
在实际应用中,通常需要检测多个网址的可用性,并将结果以易读的形式展示。
import requests
import time
from tabulate import tabulate
def batch_check_urls(urls, delay=1):
"""
批量检测多个网址的可用性
:param urls: 网址列表
:param delay: 每个请求之间的延迟(秒)
:return: 结果列表
"""
results = []
for url in urls:
try:
start_time = time.time()
response = requests.get(url, timeout=5)
end_time = time.time()
response_time = round((end_time - start_time) * 1000, 2) # 毫秒
if response.status_code == 200:
status = "可访问"
result_text = f"状态码: {response.status_code}, 响应时间: {response_time}ms"
else:
status = "不可访问"
result_text = f"异常状态码: {response.status_code}"
results.append([url, status, result_text])
except requests.RequestException as e:
results.append([url, "不可访问", f"错误: {str(e)}"])
time.sleep(delay) # 延迟,防止请求过于频繁
# 以表格形式输出结果
print(tabulate(results, headers=['网址', '状态', '详细信息'], tablefmt='grid'))
return results
urls = [
'https://www.google.com',
'https://www.github.com',
'https://www.example.com',
'https://www.nonexistent12345.com'
]
batch_check_urls(urls)
这种方法可以批量检查多个网址,并以清晰的表格格式展示结果,包括响应时间等有用信息。
6 高级功能:定时检测与异常通知
对于生产环境,可能需要定期检测网址并在出现问题时接收通知。
import requests
import time
import smtplib
from email.mime.text import MIMEText
from datetime import datetime
class WebsiteMonitor:
def init(self, urls, check_interval=300):
self.urls = urls
self.check_interval = check_interval
self.failure_reports = {}
def check_website(self, url):
"""检查单个网站"""
try:
response = requests.get(url, timeout=10)
return response.status_code == 200
except:
return False
def send_alert(self, url, is_recovery=False):
"""发送警报邮件(需要配置SMTP服务器)"""
if is_recovery:
subject = f"网站恢复通知: {url}"
body = f"网站 {url} 已于 {datetime.now()} 恢复访问"
else:
subject = f"网站宕机警报: {url}"
body = f"网站 {url} 于 {datetime.now()} 无法访问"
# 这里需要配置真实的SMTP服务器信息
msg = MIMEText(body)
msg['Subject'] = subject
msg['From'] = '[email protected]'
msg['To'] = '[email protected]'
try:
# 示例代码,实际使用时需要配置真实SMTP服务器
# with smtplib.SMTP('smtp.example.com', 587) as server:
# server.login('username', 'password')
# server.send_message(msg)
print(f"发送警报: {subject}")
except Exception as e:
print(f"发送邮件失败: {e}")
def monitor_loop(self):
"""监控循环"""
while True:
for url in self.urls:
is_accessible = self.check_website(url)
current_time = datetime.now()
# 检查状态变化
if url in self.failure_reports:
if is_accessible:
# 之前失败但现在恢复了
self.send_alert(url, is_recovery=True)
del self.failure_reports[url]
else:
if not is_accessible:
# 新出现的失败
self.failure_reports[url] = current_time
self.send_alert(url, is_recovery=False)
status = "可访问" if is_accessible else "不可访问"
print(f"{current_time} - {url} - {status}")
print(f"下一次检查将在 {self.check_interval} 秒后进行...")
time.sleep(self.check_interval)
monitor = WebsiteMonitor([
'https://www.google.com',
'https://www.github.com'
], check_interval=300) # 每5分钟检查一次
这个高级实现提供了定时检测和异常通知功能,适合用于生产环境的网站监控。
7 注意事项与最佳实践
方法 优点 缺点 适用场景
HTTP状态检查 简单直接,反映真实用户体验 可能受反爬虫措施影响 大多数网站可用性检查
Ping测试 检查服务器网络连通性 不检查服务状态 网络故障排查
端口检查 检查特定服务状态 需要知道端口号 服务特定端口检查
综合方案 全面检查所有方面 实现复杂 重要业务全面监控
根据实际应用场景选择合适的方法,可以有效地监控网站和服务的可用性。
本文部分观点取自:https://www.jx-online.com/