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:

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?

È stato utile?

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:

  1. L'uso Firebug o Chrome / Safari ispettore di esplorare il contenuto HTML e il modello di informazioni interessanti

  2. Prova il tuo RegEx per vedere se la partita. Potrebbe essere necessario fare molte volte (multi-pass parsing / estrazione)

  3. 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;
        }                

?>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top