Извлечение данных с сайта через PHP - PullRequest
7 голосов
/ 07 января 2010

Я пытаюсь создать простое приложение для оповещения для некоторых друзей.

По сути, я хочу иметь возможность извлекать данные "цена" и "наличие на складе" с веб-страницы, например, следующие два:

Я сделал оповещение по электронной почте и через смс, но теперь я хочу иметь возможность получать количество и цену с веб-страниц (те, 2 или любые другие), чтобы я мог сравнить цену и доступное количество и предупредите нас, чтобы сделать заказ, если продукт находится между некоторыми порогами.

Я пробовал некоторые регулярные выражения (встречается в некоторых уроках, но я слишком n00b для этого), но мне не удалось заставить это работать, какие-либо хорошие советы или примеры?

Ответы [ 6 ]

30 голосов
/ 07 января 2010
$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";
7 голосов
/ 07 января 2010

Это называется скребком экрана, на случай, если вам понадобится Google.

Я бы посоветовал вместо этого использовать dom-анализатор и выражения xpath. Сначала просмотрите HTML-код через HtmlTidy, чтобы убедиться, что это верная разметка.

Например:

$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";
}
5 голосов
/ 07 января 2010

Что бы вы ни делали: не используйте регулярные выражения для разбора HTML, или произойдут плохие вещи . Вместо этого используйте парсер .

2 голосов
/ 07 января 2010

1-й, задавая этот вопрос слишком подробно. Во-вторых, извлечение данных с веб-сайта может быть незаконным. Тем не менее, у меня есть подсказки:

  1. Используйте Firebug или Chrome / Safari Inspector для изучения HTML-содержимого и структуры интересной информации

  2. Проверьте свой RegEx, чтобы увидеть, если совпадают. Возможно, вам придется делать это много раз (многоходовой анализ / извлечение)

  3. Напишите клиента через cURL или, что намного проще, используйте file_get_contents (учтите, что некоторые хостинги отключают загрузку URL-адресов с file_get_contents)

Для меня лучше использовать Tidy для преобразования в действительный XHTML, а затем использовать XPath для извлечения данных вместо RegEx. Зачем? Потому что XHTML не является регулярным, а XPath очень гибким. Вы можете научиться XSLT преобразовывать.

Удачи!

2 голосов
/ 07 января 2010

Вам, вероятно, лучше всего загрузить HTML-код в DOM-парсер, например , этот и искать таблицу "цен". Однако любой вид очистки, который вы делаете, может нарушаться всякий раз, когда они изменяют свой макет страницы, и, вероятно, является незаконным без их согласия.

Однако лучшим способом было бы поговорить с людьми, которые управляют сайтом, и посмотреть, есть ли у них альтернативные, более надежные формы доставки данных (приходят на ум Web-сервисы, RSS или экспорт баз данных).

0 голосов
/ 05 ноября 2012

Самый простой способ извлечь данные с сайта. Я проанализировал, что все мои данные покрыты только тегом, поэтому я подготовил этот.

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

?>
...