爬取Steam免费游戏页面遇IndexError及空列表问题求解
解决Steam免费游戏页面爬取的IndexError问题
问题根源
- Steam页面的CSS类名是动态生成的,会不定期更新,你使用的
gamehover_GameTitle_mrkD1已经失效,导致find_all返回空列表,random.choice调用时自然抛出IndexError。 - 直接用
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
相关产品推荐
相关产品推荐

