使用Python bs4抓取Steam社区市场皮肤价格失败该如何解决?
问题原因分析
- 动态内容渲染问题:Steam社区市场的买/卖单价格数据不会直接写在初始静态HTML里,是页面加载完成后通过JavaScript异步请求接口拉取数据后再填充到对应DOM节点的,你直接请求初始URL拿到的静态页面里,
market_commodity_buyrequests对应的节点内容本来就是空的占位符,所以只能拿到空引号。 - 反爬机制触发:Steam对未携带合法请求头的爬虫请求会直接返回异常内容,甚至触发临时访问限制,你当前的requests请求没有加任何请求头,大概率拿到的不是正常的用户访问页面内容。
可行解决方法
方法1:直接调用Steam市场商品数据接口
Steam有公开的市场价格查询接口,不需要解析页面,直接拿结构化数据,对应你要查询的CSGO AWP | 二西莫夫(久经沙场)的请求示例代码如下:
import requests # 请求头必须带User-Agent,模拟正常浏览器访问 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" } # currency=23对应人民币,appid=730是CSGO的应用ID url = "https://steamcommunity.com/market/priceoverview/?appid=730¤cy=23&market_hash_name=AWP%20%7C%20Hyper%20Beast%20%28Well-Worn%29" resp = requests.get(url, headers=headers) data = resp.json() # 提取目标数据示例 if data.get("success"): print(f"当前最低售价: {data.get('lowest_price')}") print(f"最近成交中位价: {data.get('median_price')}") print(f"在售商品总数: {data.get('volume')}")
该方法优势为不需要解析DOM,返回的是结构化JSON数据,稳定性远高于爬取页面内容。
方法2:使用无头浏览器渲染动态内容
如果需要获取页面内其他动态渲染的完整内容,可以使用Selenium、Playwright这类工具模拟浏览器运行,等页面JS执行完成后再提取DOM内容,Selenium示例代码如下:
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 driver = webdriver.Chrome() url = "https://steamcommunity.com/market/listings/730/AWP%20%7C%20Hyper%20Beast%20%28Well-Worn%29" driver.get(url) # 等待买单一节点加载完成 buy_order_node = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, "market_commodity_buyrequests")) ) print(buy_order_node.text) driver.quit()
注意事项
- 注意控制请求频率,Steam对短时间大量请求的IP会触发临时访问限制,建议每次请求间隔至少15秒以上。
- 接口的货币代码可以按需修改,比如1对应美元,23对应人民币。
内容的提问来源于stack exchange,提问作者Константин Ленивков
相关产品推荐
相关产品推荐

