检测网址可访问性的Python代码实现
文章介绍了使用Python进行网站可用性检测的方法,包括HTTP状态码检查、Ping命令测试网络连通性、socket库检测端口开放情况等技术,并提供了代码示例。同时讨论了综合检测方案、批量网址检测及高级功能如定时监控和异常通知的应用场景与实现方式。 2025-9-28 10:1:48 Author: www.freebuf.com(查看原文) 阅读量:18 收藏

使用requests库进行HTTP状态检测

最简单直接的方法是使用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 注意事项与最佳实践

  1. 权限要求:在某些系统上,执行ping命令可能需要管理员权限。
  2. 超时设置:始终为网络请求设置合理的超时时间,避免脚本长时间挂起。
  3. 频率控制:避免过于频繁地检查网址,以免对目标网站造成压力或被误认为攻击。
  4. 错误处理:网络请求可能因多种原因失败,确保代码有充分的错误处理机制。
  5. 反爬虫机制:某些网站可能有反爬虫措施,可能会返回非200状态码即使网站正常运行。
  6. 协议支持:端口检查仅适用于TCP端口,不适用于UDP端口。

方法 优点 缺点 适用场景

HTTP状态检查 简单直接,反映真实用户体验 可能受反爬虫措施影响 大多数网站可用性检查

Ping测试 检查服务器网络连通性 不检查服务状态 网络故障排查

端口检查 检查特定服务状态 需要知道端口号 服务特定端口检查

综合方案 全面检查所有方面 实现复杂 重要业务全面监控

根据实际应用场景选择合适的方法,可以有效地监控网站和服务的可用性。

本文部分观点取自:https://www.jx-online.com/


文章来源: https://www.freebuf.com/news/450763.html
如有侵权请联系:admin#unsafe.sh