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

Python网页爬取遇IndexError: list index out of range问题求助

问题分析与解决方法

出现IndexError的核心原因是连续请求时,部分请求返回的页面结构不符合预期——要么是网站反爬机制限制了频繁请求,返回了异常页面;要么是某个端口对应的服务器页面本身没有足够的.col-auto元素。以下是具体解决步骤:

1. 先验证请求是否成功

每次请求后先检查响应状态码,确保页面正常加载,避免在异常页面上解析元素:

page = requests.get(URL)
if page.status_code != 200:
    return f"请求失败,状态码:{page.status_code}"

2. 避免硬索引访问元素

不要直接通过x[3]获取元素,先判断列表长度,防止索引越界:

x = soup.find_all(class_="col-auto")
# 先检查列表长度足够再访问
if len(x) >=4:
    result = x[3].text.strip()
else:
    result = "未找到玩家数据"

3. 添加请求间隔,规避反爬

连续快速请求容易触发网站反爬,导致返回异常页面,添加延迟降低请求频率:

import time

# 在调用函数的地方添加延迟
print(server_status("28901"))
time.sleep(1) # 间隔1秒
print(server_status("28902"))

修改后的完整代码

import requests
from bs4 import BeautifulSoup
import time

def server_status(port):
    URL = f"https://cod.pm/server/178.63.17.172/{port}"
    page = requests.get(URL)
    
    # 检查请求是否成功
    if page.status_code != 200:
        return f"端口{port}:请求失败,状态码{page.status_code}"
    
    soup = BeautifulSoup(page.content, "html.parser")
    x = soup.find_all(class_="col-auto")
    
    # 安全获取玩家数据
    if len(x) >= 4:
        result = x[3].text.strip()
        return f"端口{port}:玩家总数 {result}"
    else:
        return f"端口{port}:未找到有效玩家数据"

# 带间隔调用函数
print(server_status("28901"))
time.sleep(1)
print(server_status("28902"))

额外建议

  • 可以给请求添加请求头(模拟浏览器访问),降低被反爬的概率:
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"
    }
    page = requests.get(URL, headers=headers)
    
  • 遍历多个端口时用循环处理,减少重复代码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 05:25:25