Estrarre i dati dal sito web tramite PHP
-
19-09-2019 - |
Domanda
Sto cercando di creare un'applicazione semplice avviso per alcuni amici.
Fondamentalmente voglio essere in grado di estrarre i dati "prezzo" e "disponibilità di magazzino" da una pagina web come il folowing due:
- http://www.sparkfun.com/commerce/product_info.php ? products_id = 5
- http://www.sparkfun.com/commerce/product_info.php ? products_id = 9279
Ho fatto l'avviso via e-mail e una parte di sms, ma ora voglio essere in grado di ottenere la quantità e il prezzo fuori delle pagine web (quelle 2 o qualsiasi altri quelli) in modo che io possa confrontare il prezzo e la quantità disponibile e ci avvisa di fare un ordine se un prodotto è tra alcune soglie.
Ho provato alcuni regex (trovato su alcuni tutorial, ma ho un modo troppo n00b per questo), ma non sono riuscito a ottenere questo lavoro, dei buoni consigli o esempi?
Soluzione
$content = file_get_contents('http://www.sparkfun.com/commerce/product_info.php?products_id=9279');
preg_match('#<tr><th>(.*)</th> <td><b>price</b></td></tr>#', $content, $match);
$price = $match[1];
preg_match('#<input type="hidden" name="quantity_on_hand" value="(.*?)">#', $content, $match);
$in_stock = $match[1];
echo "Price: $price - Availability: $in_stock\n";
Altri suggerimenti
Si chiama screen scraping, in caso di necessità a google per esso.
Vorrei suggerire di utilizzare un parser DOM e le espressioni XPath, invece. Feed the HTML attraverso HTMLTidy primo luogo, garantire che si tratta di markup valido.
Ad esempio:
$html = file_get_contents("http://www.example.com");
$html = tidy_repair_string($html);
$doc = new DomDocument();
$doc->loadHtml($html);
$xpath = new DomXPath($doc);
// Now query the document:
foreach ($xpath->query('//table[@class="pricing"]/th') as $node) {
echo $node, "\n";
}
Che cosa mai si fa: non usare le espressioni regolari per analizzare HTML o accadranno brutte cose . Utilizzare un parser .
1 °, questa domanda va troppo nei dettagli. 2 °, l'estrazione di dati da un sito web potrebbe non essere legittimo. Tuttavia, ho suggerimenti:
-
L'uso Firebug o Chrome / Safari ispettore di esplorare il contenuto HTML e il modello di informazioni interessanti
-
Prova il tuo RegEx per vedere se la partita. Potrebbe essere necessario fare molte volte (multi-pass parsing / estrazione)
-
Scrivi un client tramite CURL o anche molto più semplice, utilizzare file_get_contents (si noti che alcuni di hosting disattivare gli URL di carico con file_get_contents)
Per quanto mi riguarda, ho meglio utilizzare Tidy convertire in XHTML valido e quindi usare XPath per estrarre i dati, invece di RegEx. Perché? Poiché XHTML non è regolare e XPath è molto flessibile. Si può imparare XSLT per trasformare.
In bocca al lupo!
Si sono probabilmente meglio fuori il caricamento del codice HTML in un parser DOM come questo e la ricerca per la tabella "prezzi". Tuttavia, qualsiasi tipo di raschiatura che fai può rompere ogni volta che cambiano il loro layout di pagina, e probabilmente è illegale senza il loro consenso.
Il modo migliore, però, sarebbe quello di parlare con le persone che gestiscono il sito, e vedere se proprio hanno alternative, forme più affidabili di fornitura di dati (servizi Web, RSS, o le esportazioni di database vengono in mente).
Il metodo più semplice per estrarre i dati dal sito web. Ho analizzato che i miei tutti i dati sono coperti solo all'interno di tag, quindi ho preparato questo.
<?php
include(‘simple_html_dom.php’);
// Create DOM from URL, paste your destined web url in $page
$page = ‘http://facebook4free.com/category/facebookstatus/amazing-facebook-status/’;
$html = new simple_html_dom();
//Within $html your webpage will be loaded for further operation
$html->load_file($page);
// Find all links
$links = array();
//Within find() function, I have written h3 so it will simply fetch the content from <h3> tag only. Change as per your requirement.
foreach($html->find(‘h3′) as $element)
{
$links[] = $element;
}
reset($links);
//$out will be having each of HTML element content you searching for, within that web page
foreach ($links as $out)
{
echo $out;
}
?>