使用requests库检测URL可用性返回异常结果,是否为IP被封禁?
问题排查思路
现有检测函数的已知缺陷
你的代码本身设计存在多个容易导致误判的问题,是优先排查的方向:
- 异常捕获逻辑过于粗放:裸
except会捕获所有类型的错误(包括网络超时、SSL证书错误、请求被拦截等),没有任何日志输出,你无法区分到底是请求被拒绝还是代码逻辑出错。 - User-Agent过于陈旧:你使用的是2012年发布的Firefox 15的UA标识,大部分站点的反爬策略会直接拦截这类过时的爬虫UA,站点反爬规则更新后之前能用的UA失效是非常常见的情况。
- 状态码判断逻辑不严谨:你仅判断
status_code == 200,但站点可能返回3xx重定向(比如跳转到验证页、地区限制页)、403/429等拦截状态码,都会导致返回False,哪怕页面本身是可访问的。 - 函数名和注释与实际逻辑不符:注释写的是检测ping响应,但实际执行的是HTTP GET请求,两者完全不是一回事,也会导致你对问题的判断出现偏差。
排查是否为IP封禁的步骤
按以下顺序操作即可快速定位问题:
- 先替换你的检测函数为带日志的debug版本,明确错误原因:
import requests def server_online_debug(url): # 替换为当前版本的普通浏览器UA,避免被反爬直接拦截 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36' } try: result = requests.get(url, headers=headers, timeout=10) print(f"请求状态码:{result.status_code}") print(f"响应内容前500字符预览:{result.text[:500]}") return result.status_code == 200 except Exception as e: print(f"请求报错类型:{type(e).__name__},错误详情:{str(e)}") return False
- 运行debug函数后根据输出判断:
- 如果报错为连接超时、连接被拒绝,且你用同出口IP的本地浏览器可以正常访问该URL,基本可以确认是IP被站点封禁。
- 如果返回状态码为403/429,通常是反爬临时限制,不一定是永久IP封禁,更换UA、降低请求频率、添加请求间隔后重试一般可以恢复。
- 如果返回3xx重定向,且响应内容包含验证码、地区访问限制提示,说明站点新增了访问校验逻辑,你的原有检测逻辑没有适配,不属于IP封禁。
内容的提问来源于stack exchange,提问作者order66
相关产品推荐
相关产品推荐

