在线批量检测网址状态
上周三凌晨两点,线批我被手机监控告警吵醒——客户的量检一个电商站点挂了。爬起来打开电脑,测网第一件事不是址状查服务器,而是线批翻出收藏夹里那个批量检测脚本,把三十多个关联域名一股脑丢进去跑了一遍。量检三分钟后结果出来,测网主站确实宕了,址状但另外两个备用域名还活着。线批立刻切流量,量检前后不到十分钟。测网要是址状手动一个一个点,光打开浏览器输网址就得耗掉一半时间。线批 这就是量检批量检测网址状态的实用场景。它不复杂,测网核心逻辑就一句话:把一堆URL塞进程序,让程序替你去访问,然后告诉你每个网址返回了什么。返回200就是正常,404是页面没了,301/302是跳转,500以上是服务器出错,超时或者连接被拒就是彻底失联。 最省事的是用现成工具。 Windows用户没curl的话,PowerShell也能干: Python脚本更灵活。我常用的是 这里有个坑: 超时设置别太短。我一开始设3秒,结果一批海外站点全部报错,后来改成10秒才正常。并发数也不是越高越好,有次开了200个线程,目标服务器直接把我IP封了半小时。现在一般控制在30到50之间。 还有一个容易忽略的点:DNS解析失败和HTTP错误是两回事。前者说明域名本身有问题,后者说明域名能解析但服务有问题。日志里最好区分开,排查的时候方向完全不同。 我现在把这个脚本挂在一台闲置的VPS上,用cron每十分钟跑一次,结果写进SQLite。配合一个简单的Grafana面板,哪些站点什么时候开始抽风一目了然。比任何付费监控服务都便宜,而且数据完全在自己手里。 说到底,批量检测不是什么高深技术,就是把重复劳动交给机器。写一次脚本,后面省下的时间都是白赚的。几种常用做法,按省事程度排
curl配合xargs一行命令就能跑:cat urls.txt | xargs -I{ } curl -o /dev/null -s -w "%{ http_code} { }\n" { }。这条命令的意思是,读文件里每一行URL,用curl静默访问,只输出状态码和对应网址。-o /dev/null是丢弃页面内容,-s是不显示进度条。跑一百个网址大概十几秒。Get-Content urls.txt | ForEach-Object { try { $r = Invoke-WebRequest -Uri $_ -Method Head -TimeoutSec 10; "$($r.StatusCode) $_" } catch { "FAIL $_" } }。注意这里用了HEAD请求而不是GET,只取响应头不下载页面体,速度快很多。但有些服务器不认HEAD,会返回405,这时候就得换回GET。requests库加concurrent.futures线程池,五十个线程并发跑,几百个网址也就几秒钟的事。关键代码就几行:import requests from concurrent.futures import ThreadPoolExecutor def check(url): try: r = requests.head(url, timeout=8, allow_redirects=True) return f"{ r.status_code} { url}" except Exception as e: return f"ERR { url} { e}" with open('urls.txt') as f: urls = [l.strip() for l in f if l.strip()] with ThreadPoolExecutor(max_workers=50) as pool: for result in pool.map(check, urls): print(result) allow_redirects=True会跟着跳转走,最终返回的是落地页的状态码。如果你关心的是原始URL是否活着,应该设成False,然后单独处理3xx。实际用起来会遇到什么
-
上一篇
-
下一篇