如何用Node.js编写脚本高效获取Steam商店促销游戏完整列表
可行实现方案
1. 调用Steam商店内置的促销搜索接口
Steam页面滚动加载的本质是调用内部AJAX搜索接口,无需解析前端页面,直接请求该接口即可批量获取促销游戏数据,是当前效率最高的方案。
- 接口核心参数:
specials=1:限定返回正在促销的内容start:分页偏移量,默认单页返回50条,从0开始累加count:单页返回数量,最高支持设置为100,可减少请求次数cc:地区编码,如CN对应国区,确保拿到对应地区的促销价格json=1:指定返回JSON格式数据,无需解析HTML
- Node.js 调用示例:
const axios = require('axios'); // 拉取指定分页的促销游戏数据 async function fetchSteamSpecials(start = 0, count = 100, region = 'CN') { const response = await axios.get('https://store.steampowered.com/search/results', { params: { specials: 1, start, count, cc: region, filter: 'all', json: 1 }, 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' } }); return response.data; }
- 全量拉取逻辑:返回结果中包含
total_count字段,循环调用接口直到start + count >= total_count即可拿到全部促销游戏,正常全量拉取仅需几十次请求,耗时不到1分钟。
2. 批量调用Steam应用详情接口优化查询效率
如果你已经有全量AppID列表,可调整为批量查询逻辑,无需逐个校验,效率可提升近200倍。
- 接口核心参数:
appids:传入最多200个AppID,用英文逗号拼接cc:地区编码,和上方逻辑一致filters=price_overview:仅返回价格相关字段,大幅减少响应体积,提升请求速度
- Node.js 调用示例:
const axios = require('axios'); // 批量查询最多200个应用的促销状态 async function batchCheckAppDiscount(appids = [], region = 'CN') { const response = await axios.get('https://store.steampowered.com/api/appdetails', { params: { appids: appids.join(','), cc: region, filters: 'price_overview' }, 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' } }); // 过滤出正在促销的应用 return Object.entries(response.data) .filter(([appid, data]) => data.success && data.data.price_overview?.discounted) .map(([appid, data]) => ({ appid, discountPercent: data.data.price_overview.discount_percent, finalPrice: data.data.price_overview.final_formatted })); }
- 优化逻辑:将全量AppID按200个一组拆分,每组请求间隔设置为100~200ms避免触发频率限制,全量校验耗时可控制在5分钟以内。
注意事项
- 所有请求添加模拟浏览器的User-Agent头,降低被Steam反爬拦截的概率
- 控制请求频率,避免短时间大量请求导致IP被临时限制访问
- 若需要跟踪特定分类的促销,可在搜索接口中额外添加对应分类参数过滤结果
内容的提问来源于stack exchange,提问作者guillaumearnx
相关产品推荐
相关产品推荐

