2014-04-14 5 views
9

Ich versuche, PHP zu verwenden, um den Steam Community Market Preis eines Artikels zu erhalten. Ich nehme eine URL (zum Beispiel: http://steamcommunity.com/market/listings/730/StatTrak%E2%84%A2%20P250%20%7C%20Steel%20Disruption%20%28Factory%20New%29) und dann lade ich den Inhalt mit file_get_contents(). Ich habe versucht, diese zu nutzen:Holen Sie sich den Preis eines Artikels auf Steam Community Market mit PHP und Regex

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

Mit

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

Ein Beispiel dessen, was ich mit file_get_contents haben kann, ist dies:

<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> 

Aber es gibt nichts zurück.

Hat jemand eine Idee? XPath verwenden, um Ihre Elemente basierend auf feine Kriterien

+1

Die Tatsache, dass Sie '. *> (. *)' In Ihrem Ausdruck anstelle eines nicht gierigen Musters verwenden und den 's' Modifikator vergessen. Es ist klar, dass Sie aufhören müssen, Regex zu verwenden und einen [robusten HTML-Parser] verwenden (http://stackoverflow.com/q/3577641) – HamZa

+2

Sie sollten Regex für diese Aufgabe nicht verwenden, versuchen Sie stattdessen PHP DOM: http://stackoverflow.com/questions/3627489/php-parse-html-code – Robin

+0

Ich habe versucht das PHP-DOM, aber ich kann es nicht verwenden, da jedes Element in der Liste in der span das title-Attribut hat, die für jedes Element und unterschiedlich ist Der Titel ist der Preis. Also kann ich es nicht wissen. –

Antwort

30

Nicht ganz sicher, warum Sie dies auf die harte Tour machen und durch HTML regexieren möchten, wenn es einen perfekt funktionierenden Aufruf gibt, der JSON zurückgibt. Obwohl die ursprüngliche Antwort korrekt ist und die OP-Frage direkt beantwortet, bietet dies eine viel einfachere und effizientere Möglichkeit, den Marktwert eines Artikels zu erhalten.

GET:

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 Antwort:

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

Antwort Definitionen:

success: boolean Wert , Wahr, wenn der Anruf erfolgreich war oder falsch, wenn etwas schief gelaufen ist oder es gibt keine Auflistung für diesen Artikel auf dem Steam-Markt.

lowest_price: Zeichenfolgewert mit Währungssymbol [pre/ap] gebunden abhängig von den angegebenen Abfrageparametern. Siehe unten für einige zusätzliche Parameter.

volume: Integer-Wert, der als String (?) Zurückgegeben wird - die Gesamtanzahl dieses bestimmten Artikels, der verkauft/gekauft wurde.

median_price: Zeichenfolgenwert mit Währungssymbol [Vor-/Ap] angehängt. Der durchschnittliche Preis, zu dem der Artikel verkauft wurde. Sehen Sie die Steam marketplace Element Grafik für ein besseres Verständnis, wie der Median berechnet wird.

Abfrageparameter:

appid: Die einzigartige (statisch definiert) Dampf Anwendungs-ID des Spiel/app, in unserem Fall 730 für Counter-Strike: Global Offensive. Eine Liste anderer Anwendungen finden Sie in Valves Entwicklungs-Wiki, obwohl diese Liste höchstwahrscheinlich immer veraltet sein wird, da häufig neue Anwendungen auf ihrer Plattform hinzugefügt werden.

market_hash_name: Der Name des Elements, das mit dem Exterieur abgefragt wird, das Abrufen dieser Namen kann bei der Abfrage eines Benutzerinventars gefunden werden, aber das ist ein ganz anderer API-Aufruf.

currency: Ein ganzzahliger Wert; der Währungswert und das Währungsformat zur Rückgabe der Marktwerte. Sie müssen mit diesen Zahlen zwicken und herumspielen, da ich hier nicht zu viele Details zur Verfügung stellen kann. Im Allgemeinen halte ich den USD als globalen Preis und verwende meine eigene Währungs-API, um in andere Währungen zu übersetzen.

+2

Gibt es eine Möglichkeit, die Preise mehrerer Artikel zu erhalten, anstatt eine GET-Anfrage pro Artikel für die Preise zu senden? – roverred

+1

Nein, aber siehe meine Antwort auf die gleiche Frage hier: http://stackoverflow.com/questions/27270881/how-get-a-response-of-multiple-price-items-on-the-market/27641646#27641646 – snh

+1

@snh Hey können Sie mir bitte sagen, was ich diesen Medianpreis, weil wenige Artikel haben sie und wenige nicht – deepakgates

4

Sie regex nicht für diese Aufgabe verwenden (siehe RegEx match open tags except XHTML self-contained tags, aber es gibt einen weiteren erläuternden Link irgendwo auf SO)

Sie wollen. Von PHP.net diesem Grund sollten Sie die Knoten erhalten Sie wollen:

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

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

die XPath //span[@class="..."] Mittel wählen alle span-Tags innerhalb des Dokuments die die erwartete Klasse Attribut haben.

+0

Danke, es funktioniert perfekt! –

+0

@Robin Ich versuche etwas Ähnliches wie OP. Die Daten, die ich analysieren möchte http://pastebin.com/1J2syC0n. Ist es möglich, XPath für eine solche Textfolge zu verwenden? Oder muss ich es zu einem Dateityp machen, bevor ich die Abfrage ausführen kann? –

+0

@ Ríomhaire: Wenn Sie eine andere Frage haben, haben Sie mehr Unterstützung, indem Sie sie als solche veröffentlichen. Aber vorher schlage ich vor, dass Sie versuchen, herauszufinden, was wie erwartet funktioniert und was nicht, um Ihr genaues Problem zu klären! – Robin

0

Ich habe ein node.js Modul über Npm für den cs: go Markt erstellt. https://www.npmjs.com/package/csgo-market Es werden momentan nur einzelne Preise angezeigt, aber lassen Sie mich wissen, ob es weitere Funktionen gibt, die Sie hinzufügen möchten.

+1

Mann das ist so cool: o wenn ich nur etwas über nodejs wüsste ...: c –

Verwandte Themen