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
相关产品推荐
相关产品推荐

