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

使用Selenium爬取SteamDB获取appid失败,games列表为空求助

解决SteamDB爬取appid时元素为空的问题

原代码的核心问题:

  • XPath定位错误:你写的//*[@class="table-products.text-center.dataTable"]不符合HTML类选择逻辑,多个class属性值之间是空格分隔而非点,而且这个定位的是整个表格容器,不是单个游戏的链接元素。
  • 目标属性错误:你需要提取的是data-appid,但代码里尝试获取href,且表格容器本身就没有href属性。
  • 等待策略不足:3秒隐式等待未必能让动态渲染的表格完全加载完成。
  • Headless模式参数不全:Chrome无头模式需要额外参数避免被页面反爬检测。
  • ChromeDriver路径冗余:新版Selenium已支持自动管理ChromeDriver,无需手动指定路径。

修正后的代码:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

options = webdriver.ChromeOptions()
# 完善无头模式参数,避免被反爬检测
options.add_argument('--headless=new')
options.add_argument('--disable-gpu')
options.add_argument('--window-size=1920,1080')
options.add_argument('--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')

driver = webdriver.Chrome(options=options)
driver.get('https://steamdb.info/tag/1742/?all')

# 用显式等待确保表格元素加载完成
wait = WebDriverWait(driver, 10)
# 定位表格内所有带data-appid属性的游戏链接
game_links = wait.until(EC.presence_of_all_elements_located(
    (By.XPATH, '//table[contains(@class, "table-products")]//a[@data-appid]')
))

appid_list = []
for link in game_links:
    # 直接提取目标data-appid属性值
    appid = link.get_attribute('data-appid')
    if appid:
        appid_list.append(appid)

print(appid_list)
driver.quit()

关键修正说明:

  • 精准定位元素:通过//table[contains(@class, "table-products")]//a[@data-appid]直接定位到带目标属性的游戏链接,避免精确匹配多个class的麻烦。
  • 显式等待更可靠:用WebDriverWait等待元素加载完成后再操作,比固定时长的隐式等待更适配动态页面。
  • 优化无头模式:添加新版无头模式标识、用户代理和窗口大小参数,降低被页面识别为爬虫的概率。
  • 直接提取目标属性:不再错误获取href,直接提取你需要的data-appid值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 06:15:40