使用 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>
但它什么也没返回。
有人有想法吗?
【问题讨论】:
您在表达式中使用.*>(.*)
而不是非贪婪模式并且忘记了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€ ",
"volume": "562",
"median_price": "1,60€ "
响应定义:
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社区打不开118错误怎么办 steam无法添加好友解决方法