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

爬取Steam免费游戏页面遇IndexError及空列表问题求解

解决Steam免费游戏页面爬取的IndexError问题

问题根源

  1. Steam页面的CSS类名是动态生成的,会不定期更新,你使用的gamehover_GameTitle_mrkD1已经失效,导致find_all返回空列表,random.choice调用时自然抛出IndexError。
  2. 直接用requests.get发起请求会被Steam识别为爬虫,返回的页面内容不完整,进一步导致无法定位到游戏元素。

修复方案

1. 改用稳定的元素定位逻辑

放弃依赖动态类名,转而通过元素的属性、结构这类更稳定的特征定位。比如Steam的游戏标题链接都会带有data-ds-appid属性,我们可以基于这个属性筛选元素。

2. 添加请求头模拟浏览器访问

Steam会校验请求的User-Agent字段,添加符合浏览器特征的请求头,能避免被拦截,获取完整的页面内容。

修复后的完整代码

import requests
from bs4 import BeautifulSoup
import random

# 模拟Chrome浏览器的请求头
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36'
}

response = requests.get('https://store.steampowered.com/genre/Free%20to%20Play/?tab=1', headers=headers)
soup = BeautifulSoup(response.text, 'html.parser')

# 筛选带游戏ID属性的链接,再过滤掉非游戏标题的无效链接
game_links = soup.find_all('a', attrs={'data-ds-appid': True})
valid_titles = [link for link in game_links if link.get_text(strip=True) and len(link.get_text(strip=True)) > 2]

if valid_titles:
    random_game = random.choice(valid_titles)
    print(f'Рассмотрите эту игру: {random_game.get_text(strip=True)}')
else:
    print('未找到有效游戏,请检查页面结构或请求头是否需要更新')

额外提示

  • 定期校验页面结构:Steam的页面布局可能会调整,若再次出现空列表,需要重新查看页面元素结构,调整筛选规则。
  • 控制请求频率:短时间内频繁请求可能会被Steam封禁IP,建议添加请求间隔。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 21:15:36