You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用requests库检测URL可用性返回异常结果,是否为IP被封禁?

问题排查思路

现有检测函数的已知缺陷

你的代码本身设计存在多个容易导致误判的问题,是优先排查的方向:

  • 异常捕获逻辑过于粗放:裸except会捕获所有类型的错误(包括网络超时、SSL证书错误、请求被拦截等),没有任何日志输出,你无法区分到底是请求被拒绝还是代码逻辑出错。
  • User-Agent过于陈旧:你使用的是2012年发布的Firefox 15的UA标识,大部分站点的反爬策略会直接拦截这类过时的爬虫UA,站点反爬规则更新后之前能用的UA失效是非常常见的情况。
  • 状态码判断逻辑不严谨:你仅判断status_code == 200,但站点可能返回3xx重定向(比如跳转到验证页、地区限制页)、403/429等拦截状态码,都会导致返回False,哪怕页面本身是可访问的。
  • 函数名和注释与实际逻辑不符:注释写的是检测ping响应,但实际执行的是HTTP GET请求,两者完全不是一回事,也会导致你对问题的判断出现偏差。

排查是否为IP封禁的步骤

按以下顺序操作即可快速定位问题:

  1. 先替换你的检测函数为带日志的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
  1. 运行debug函数后根据输出判断:
  • 如果报错为连接超时、连接被拒绝,且你用同出口IP的本地浏览器可以正常访问该URL,基本可以确认是IP被站点封禁。
  • 如果返回状态码为403/429,通常是反爬临时限制,不一定是永久IP封禁,更换UA、降低请求频率、添加请求间隔后重试一般可以恢复。
  • 如果返回3xx重定向,且响应内容包含验证码、地区访问限制提示,说明站点新增了访问校验逻辑,你的原有检测逻辑没有适配,不属于IP封禁。

内容的提问来源于stack exchange,提问作者order66

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 05:18:02