使用 PHP 和 Regex 在 Steam 社区市场上获取物品的价格

Posted

技术标签:

【中文标题】使用 PHP 和 Regex 在 Steam 社区市场上获取物品的价格【英文标题】:Get the price of an item on Steam Community Market with PHP and Regex 【发布时间】:2014-05-28 03:39:00 【问题描述】:

我正在尝试使用 php 来获取物品的 Steam 社区市场价格。我获取一个 url(例如:http://steamcommunity.com/market/listings/730/StatTrak%E2%84%A2%20P250%20%7C%20Steel%20Disruption%20%28Factory%20New%29),然后使用file_get_contents() 下载内容。我试着用这个:

function getInnerhtml($string, $tagname, $closetagname) 
    $pattern = "/<$tagname ?.*>(.*)<\/$closetagname>/";
    preg_match($pattern, $string, $matches);
    return $matches[1];

使用

getInnerHTML($str, 'span class="market_listing_price market_listing_price_with_fee"', 'span');

我可以使用 file_get_contents 的一个例子是:

<span class="market_table_value">
    <span class="market_listing_price market_listing_price_with_fee">
        $1.92               </span>
    <span class="market_listing_price market_listing_price_without_fee">
        $1.68               </span>
    <br/>
</span>

但它什么也没返回。

有人有想法吗?

【问题讨论】:

您在表达式中使用.*&gt;(.*) 而不是非贪婪模式并且忘记了s 修饰符这一事实。很明显,您需要停止使用正则表达式并使用robust html parser 你不应该使用正则表达式来完成这个任务,尝试使用 PHP 的 DOM:***.com/questions/3627489/php-parse-html-code 我尝试了 PHP 的 DOM,但我不能使用它,因为列表中的每个项目在 span 中都有 title 属性,每个项目都不同,标题是价格。所以我不知道。 @ThomasPatKowalski-Zuckerberg:我不确定你的意思。您可以编辑您的问题以添加示例输入吗? 好的,我刚刚添加了一个示例 HTML 代码。 【参考方案1】:

当有一个完美工作的调用返回 JSON 时,不完全确定为什么要通过 HTML 执行此操作并使用正则表达式。虽然原始答案是正确的,并且直接回答了 OP 问题,但这提供了一种更简单有效的获取物品市场价值的方法。

获取

http://steamcommunity.com/market/priceoverview/?currency=3&appid=730&market_hash_name=StatTrak%E2%84%A2%20P250%20%7C%20Steel%20Disruption%20%28Factory%20New%29

JSON 响应


  "success": true,
  "lowest_price": "1,43&#8364; ",
  "volume": "562",
  "median_price": "1,60&#8364; "

响应定义

success:布尔值,如果调用成功则为 true,如果出现问题则为 false或 Steam 市场上没有此物品的列表

lowest_price: 带有货币符号的字符串值 [pre-/app] 取决于指定的查询参数。请参阅下面的一些附加参数。

volume: 整数值以字符串 (?) 形式返回 - 已售出/已购买的此特定商品的总数。

median_price: 带有货币符号 [pre-/app] 的字符串值。商品已售出的平均价格。请参阅Steam marketplace 项目图表,以更好地了解如何计算中位数。

查询参数

appid:游戏/应用程序的唯一(静态定义)Steam 应用程序 ID,在我们的例子中是 730,表示反恐精英:全球攻势。有关其他 appid 的列表,请参阅 Valve 的开发 Wiki,尽管此列表很可能总是过时,因为新的应用程序经常被添加到他们的平台。

market_hash_name:正在查询的项目名称,包括外部,在查询用户库存时可以找到这些名称,但这是另一个 API 调用。

currency:一个整数值;返回市场价值的货币价值和格式。您需要调整和使用这些数字,因为我无法在此提供太多细节。一般来说,我坚持使用美元作为全球价格,并使用我自己的货币 API 来转换为其他货币。

这是一个未记录的端点,因此可能不是永久性的,或者可能会发生变化,没人知道。

【讨论】:

有没有办法获取多件商品的定价,而不是为每个商品发送一个 GET 请求以获取价格? 否,但请在此处查看我对同一问题的回答:***.com/questions/27270881/… @snh 嘿,你能告诉我这个中间价是多少,因为很少有商品有,也很少有 我已经用更多信息更新了我的答案。 @Stevovosaurus,美元的货币价值是多少?货币 3 正在返还给我欧元。【参考方案2】:

不要在此任务中使用正则表达式(请参阅 RegEx match open tags except XHTML self-contained tags,但在 SO 上的某处有更多解释性链接)

您想使用 XPath 根据精细标准选择元素。从 PHP.net 这应该可以得到你想要的节点:

$doc = new DOMDocument();
$doc->loadHTMLFile($file);
$xpath = new DOMXpath($doc);

$elements = $xpath->query('//span[@class="market_listing_price market_listing_price_with_fee"]');

XPath //span[@class="..."] 表示选择文档中具有预期类属性的所有span 标记。

【讨论】:

@Robin 我正在尝试类似于 OP 的东西。我希望解析的数据 pastebin.com/1J2syC0n 。是否可以在这样的文本字符串上使用 XPath。还是我需要先将其制成一种文件,然后才能对其运行查询? @Ríomhaire:如果您还有其他问题,可以通过发布它来获得更多支持。但在此之前,我建议您尝试弄清楚哪些按预期工作,哪些没有按预期工作,以澄清您的确切问题!【参考方案3】:

我通过 npm 为 cs:go 市场创建了一个 node.js 模块。 https://www.npmjs.com/package/csgo-market 目前只提供单一价格,但如果您希望我添加其他功能,请告诉我。

【讨论】:

伙计,这太酷了:o 如果我对 nodejs 有所了解... :c

以上是关于使用 PHP 和 Regex 在 Steam 社区市场上获取物品的价格的主要内容,如果未能解决你的问题,请参考以下文章

Steam社区已强制使用https协议 轻松访问再无压力

Steam 客户端社区已强制 https

steam社区打不开118错误怎么办 steam无法添加好友解决方法

Python实战|js逆向steam社区

绝地求生买钥匙无法进入steam社区怎么办 连接错误解决方法

steam打不开且跳乱码,怎么办?