Wyodrębnij dane ze strony internetowej za pomocą PHP

Próbuję stworzyć prostą aplikację dla znajomych.

W zasadzie chcę być w stanie wyodrębnić dane "Cena" i "dostępność zapasów" ze strony internetowej, takiej jak following two:

Zrobiłem alert przez e-mail i sms część, ale teraz chcę być w stanie uzyskać ilość i cenę z strony internetowe (te 2 lub inne), dzięki czemu mogę porównać cenę i ilość dostępną i powiadomić nas o złożeniu zamówienia, jeśli produkt znajduje się między pewnymi progami.

Próbowałem regex (znalezione na niektórych tutorialach, ale jestem zbyt n00b do tego), ale nie udało się to działa, jakieś dobre wskazówki lub przykłady?

Author: Andy Lester, 2010-01-07

6 answers

$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";
 29
Author: Matteo Riva,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-07 11:58:59

To się nazywa screen scraping, na wypadek, gdybyś musiał wygooglować.

Sugerowałbym zamiast tego użycie parsera dom i wyrażeń xpath. Podaj najpierw kod HTML przez HtmlTidy, aby upewnić się, że jest to poprawny znacznik.

Na przykład:

$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";
}
 7
Author: troelskn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-07 12:01:31

What ever you do: nie używaj wyrażeń regularnych do analizowania HTML lub złe rzeczy się wydarzą . Zamiast tego użyj parsera .

 5
Author: Community,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:54:12

Pierwszy, zadając to pytanie, wchodzi zbyt w szczegóły. 2nd, wydobywanie danych ze strony internetowej może nie być uzasadnione. Mam jednak podpowiedzi:

  1. Użyj Firebug lub Chrome / Safari Inspector, aby zbadać zawartość HTML i wzór interesujących informacji

  2. Sprawdź swoje wyrażenia regularne, aby sprawdzić, czy pasuje. Może być konieczne zrobienie tego wiele razy (parsowanie/ekstrakcja wieloprzebiegowa)

  3. Napisz klienta przez cURL lub nawet znacznie prostsze, użyj file_get_contents (zauważ, że niektóre hosting wyłącz wczytywanie adresów URL z file_get_contents)

Dla mnie lepiej użyć Tidy, aby przekonwertować na poprawny XHTML, a następnie użyć XPath, aby wyodrębnić dane, zamiast RegEx. Dlaczego? Ponieważ XHTML nie jest regularny, a XPath jest bardzo elastyczny. Możesz nauczyć się przekształcać XSLT.

Powodzenia!

 2
Author: Viet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-07 11:43:24

Prawdopodobnie najlepiej będzie załadować kod HTML do parsera DOM jak ten i szukanie tabeli "cennik". Jednak każdy rodzaj skrobania może ulec złamaniu za każdym razem, gdy zmienią układ strony i prawdopodobnie jest nielegalny bez ich zgody.

Najlepszym sposobem byłoby jednak porozmawianie z ludźmi, którzy prowadzą witrynę, i sprawdzenie, czy mają alternatywne, bardziej niezawodne formy dostarczania danych(Usługi internetowe, RSS lub eksport baz danych przychodzą na myśl).

 2
Author: Pekka 웃,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-07 11:44:16

Najprostsza metoda wyodrębniania danych ze strony internetowej. Przeanalizowałem, że wszystkie moje dane są objęte tylko tagiem, więc przygotowałem ten.

<?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;
        }                

?>
 0
Author: Flexo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-24 07:47:24