2014-04-14 10 views
9

Sto provando ad usare PHP per ottenere il prezzo di un oggetto sul mercato di Steam Community. Prendo un url (ad esempio: http://steamcommunity.com/market/listings/730/StatTrak%E2%84%A2%20P250%20%7C%20Steel%20Disruption%20%28Factory%20New%29) e poi scarico il contenuto con file_get_contents(). Ho cercato di usare questo:Ottieni il prezzo di un articolo su Steam Community Market con PHP e Regex

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

Utilizzando

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

Un esempio di quello che posso avere con file_get_contents è questo:

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

ma restituisce nulla.

Qualcuno ha un'idea?

+1

Il fatto che stai usando '. *> (. *)' Nella tua espressione invece di uno schema non-goloso e dimenticando il modificatore 's'. È chiaro che devi smettere di usare espressioni regolari e usare un [parser html robusto] (http://stackoverflow.com/q/3577641) – HamZa

+2

Non dovresti usare espressioni regolari per questa attività, prova invece ad usare il DOM di PHP: http://stackoverflow.com/questions/3627489/php-parse-html-code – Robin

+0

Ho provato il DOM del PHP ma non posso usarlo perché ogni elemento della lista ha nell'attributo l'attributo title, che è diverso per ogni oggetto e il titolo è il prezzo. Quindi non posso saperlo. –

risposta

30

Non del tutto sicuro del motivo per cui si desidera eseguire questa operazione nel modo più rigido e regex tramite HTML quando c'è una chiamata perfettamente funzionante che restituisce JSON. Sebbene la risposta originale sia corretta e risponda direttamente alla domanda OP, questo fornisce un modo molto più facile ed efficiente di ottenere il valore di mercato di un articolo.

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

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

definizioni di risposta:

success: valore booleano , true se la chiamata ha avuto successo o false se qualcosa è andato storto o non ci sono annunci per questo articolo sul mercato Steam.

lowest_price: valore stringa con simbolo di valuta [pre/ap] sospeso in base ai parametri di query specificati. Vedi sotto per alcuni parametri aggiuntivi.

volume: valore intero restituito come stringa (?) - il numero totale di questo articolo specifico che è stato venduto/acquistato.

median_price: valore stringa con il simbolo di valuta [pre/ap] sospeso. Il prezzo medio al quale l'oggetto è stato venduto. Vedere il grafico dell'articolo Steam marketplace per una migliore comprensione di come viene calcolata la mediana.

Parametri query:

appid: L'unico (definito staticamente) ID applicazione Steam del gioco/applicazione, nel nostro caso 730 per Counter-Strike: Global Offensive. Vedi il Wiki di sviluppo di Valve per un elenco di altri appid, sebbene questo elenco molto probabilmente sarà sempre aggiornato poiché le nuove app vengono aggiunte frequentemente alla loro piattaforma.

market_hash_name: Il nome della voce di essere interrogato contro con l'esterno incluso, il recupero di questi nomi si possono trovare quando si interroga contro un inventario degli utenti, ma questa è tutta un'altra chiamata API.

currency: Un valore intero; il valore e il formato della valuta per restituire i valori di mercato. Dovrai modificare e giocare con questi numeri perché non posso fornire troppi dettagli qui. In genere, utilizzo l'USD come prezzo globale e utilizzo la mia valuta API per tradurlo in altre valute.

+2

Esiste un modo per ottenere il prezzo di più articoli anziché inviare una richiesta GET per articolo per i prezzi? – roverred

+1

No, ma vedi la mia risposta alla stessa domanda qui: http://stackoverflow.com/questions/27270881/how-get-a-response-of-multiple-price-items-on-the-market/27641646#27641646 – snh

+1

@snh Ehi, per favore, dimmi qual è il prezzo medio perché pochi oggetti li hanno e pochi non sono – deepakgates

4

Non usare espressioni regolari per questo compito (si veda RegEx match open tags except XHTML self-contained tags, ma c'è un legame più esplicativo da qualche parte sul SO)

Si desidera utilizzare XPath per selezionare gli elementi in base a criteri fini. Da PHP.net questo dovrebbe ottenere i nodi che si desidera:

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

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

i XPath //span[@class="..."] mezzi selezionare tutti span tag all'interno del documento l'hanno l'attributo di classe previsto.

+0

Grazie funziona perfettamente! –

+0

@Robin Sto provando qualcosa di simile a OP. I dati che desidero analizzare http://pastebin.com/1J2syC0n. È possibile utilizzare XPath su una tale stringa di testo. O ho bisogno di renderlo in un tipo di file prima di poter eseguire la query su di esso? –

+0

@ Ríomhaire: se hai un'altra domanda, avrai più supporto pubblicandolo come tale. Ma prima ti suggerisco di provarlo per capire cosa funziona come previsto e cosa no, al fine di chiarire il tuo problema esatto! – Robin

0

Ho creato un modulo node.js tramite npm per cs: go market. https://www.npmjs.com/package/csgo-market Al momento ottiene solo prezzi singoli, ma fammi sapere se ci sono ulteriori funzionalità che vorresti aggiungere.

+1

Man è così bello: o se solo sapessi qualcosa su nodejs ...: c –

Problemi correlati