“请求购买”价格Steam

"Request to buy" price Steam

提问人:user11225404 提问时间:7/8/2022 更新时间:7/8/2022 访问量:763

问:

Request to buy price

我想从蒸汽市场获得这个价格,但如果我尝试以这种方式获得它

name = "P250 | Red Rock (Battle-Scarred)"
html = requests.get("https://steamcommunity.com/market/listings/730/"+name).text
soup = BeautifulSoup(html,"html5lib")

我只得到 None 值。另一方面,我可以使用 Selenium,但对我来说非常慢(一个请求将近 3 秒)。如何获得这个号码?

python 解析 beautifulsoup steam-web-api

评论


答:

5赞 user47 7/8/2022 #1

你得到的是 None,因为该价格元素是由一些 JavaScript 动态添加到网页上的。尝试使用 bs4 查找 span 元素(包含 price)的父元素(包含 price)。您将看到父 div 元素没有元素,也没有文本。在浏览器中,您会发现两个 span 元素,其余元素将是文本节点。这就是问题所在。market_commodity_buyrequests

使用网络工具,我看到源 HTML 上的 JS 发出以下请求。它使用一个数字 ID 来标识产品。如果可以找到此数字 ID,则可以构造 URL(返回 JSON 响应),并使用名为 的键从响应中获取价格。此键的值具有 HTML 标记,由原始响应中缺少的内容组成。item_name_idbuy_order_summaryrequests.get(url)

下面是用于获取和使用它的定价和示例代码的 URL。

https://steamcommunity.com/market/itemordershistogram?country=US&language=english¤cy=1&item_nameid=175896332&two_factor=0
import re
import requests
from bs4 import BeautifulSoup


# finds id of the product
def get_id(s):
    id = None
    for script in s.find_all('script'):
        id_regex = re.search('Market_LoadOrderSpread\(([ 0-9]+)\)', script.text)
        if id_regex:
            id = id_regex.groups()[0].strip()
            break
    return id

name_url = "https://steamcommunity.com/market/listings/730/P250%20%7C%20Red%20Rock%20%28Battle-Scarred%29"
html = requests.get(name_url).text
soup = BeautifulSoup(html, 'lxml')
id = get_id(soup)

if id:
    id_url = f"https://steamcommunity.com/market/itemordershistogram?country=US&language=english&currency=1&item_nameid={id}&two_factor=0"
    html = requests.get(id_url).json()
    soup = BeautifulSoup(html['buy_order_summary'], 'lxml')

    print(f"Price is {soup.select_one('span:last-child').text}")
else:
    print("Could not get ID")
    exit()

输出:

Price is $3.77