Python爬取Steam社区市场时货币随机变动,如何永久固定货币类型?
解决方案
问题根源
- Steam 判定返回货币的优先级为:Cookie 中的地域标识 > 请求IP归属地 > Accept-Language 参数,仅设置语言头优先级最低,自然会出现临时生效后反复变动的情况
- 你的测试代码存在配置遗漏:第二次拉取页面的请求完全没有携带自定义headers,直接使用requests默认配置发起请求,相当于放弃了之前的参数配置
修复方案
要彻底固定返回货币,按以下优先级配置即可:
- 强制携带
steamCountryCookie,格式为国家二字码%7C货币三字码,比如固定返回人民币填写CN%7CCNY、固定返回美元填写US%7CUSD、固定返回瑞典克朗填写SE%7CSEK,该参数优先级最高,只要携带就不会受IP变动、会话过期影响 - 统一使用requests的Session实例发起所有请求,自动管理会话状态和Cookie,避免每次请求重复配置参数,同时降低被Steam识别为异常请求的概率
- 可选兜底:在请求URL末尾添加
?cc=国家二字码,和Cookie配置的国家保持一致,双重锁定地域参数
修正后的可运行代码
from bs4 import BeautifulSoup import requests # 固定货币配置:此处以固定人民币为例,要其他货币修改steam_country值即可 steam_country = "CN%7CCNY" url = "https://steamcommunity.com/market/listings/730/USP-S%20%7C%20Blueprint%20%28Factory%20New%29" # 初始化Session复用配置 s = requests.Session() s.headers.update({ "Accept-Language": "en-US,en;q=0.5", "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" }) # 添加固定货币的Cookie s.cookies.set("steamCountry", steam_country, domain="steamcommunity.com") # 所有请求统一用Session发起 r = s.get(url) soup = BeautifulSoup(r.text, 'lxml') skin_name = soup.find('span', class_ = 'market_listing_item_name').text sm = soup.find('span', class_ = 'market_listing_price').text.strip() print(skin_name, sm)
内容的提问来源于stack exchange,提问作者Kryštof Bochníček
相关产品推荐
相关产品推荐

