web-dev-qa-db-ja.com

PHP)を介してWebサイトからデータを抽出します

私は何人かの友人のために簡単なアラートアプリを作成しようとしています。

基本的に、次の2つのようなWebページからデータ「価格」と「在庫状況」を抽出できるようにしたいと思います。

私は電子メールとSMSの部分でアラートを作成しましたが、利用可能な価格と数量を比較してアラートを送信できるように、Webページ(2つまたは他のページ)から数量と価格を取得できるようにしたいと思います。製品がいくつかのしきい値の間にある場合に注文するため。

私はいくつかの正規表現を試しましたが(いくつかのチュートリアルにありますが、これにはn00bが多すぎます)、これを機能させることができませんでした。良いヒントや例はありますか?

8
Mike
$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";
32
Matteo Riva

グーグルで検索する必要がある場合に備えて、スクリーンスクレイピングと呼ばれます。

代わりに、domパーサーとxpath式を使用することをお勧めします。最初にHtmlTidyを介してHTMLをフィードし、有効なマークアップであることを確認します。

例えば:

$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";
}
8
troelskn

何をするにしても:HTMLの解析に正規表現を使用しないでください。または 悪いことが起こります 。代わりに パーサー を使用してください。

5
lutz

HTMLコードを this one のようなDOMパーサーにロードし、「価格設定」テーブルを検索するのがおそらく最善です。ただし、あなたが行うあらゆる種類のスクレイピングは、ページレイアウトを変更するたびに壊れる可能性があり、おそらく彼らの同意なしに違法です。

ただし、最善の方法は、サイトを運営している人々と話をして、彼らが代替のより信頼性の高い形式のデータ配信(Webサービス、RSS、またはデータベースのエクスポートが思い浮かぶ)があるかどうかを確認することです。

2
Pekka

第一に、この質問をすることはあまりにも詳細になります。第二に、ウェブサイトからデータを抽出することは合法ではないかもしれません。ただし、ヒントがあります。

  1. FirebugまたはChrome/Safari Inspectorを使用して、HTMLコンテンツと興味深い情報のパターンを調べます

  2. 正規表現をテストして、一致するかどうかを確認します。あなたはそれを何度もする必要があるかもしれません(マルチパス解析/抽出)

  3. CURLまたはさらに簡単な方法でクライアントを作成するには、file_get_contentsを使用します(一部のホスティングでは、file_get_contentsを使用したURLの読み込みが無効になっていることに注意してください)

私にとっては、正規表現の代わりに、Tidyを使用して有効なXHTMLに変換してから、XPathを使用してデータを抽出する方がよいでしょう。どうして? XHTMLは規則的ではなく、XPathは非常に柔軟だからです。 XSLTを学習して変換することができます。

幸運を!

2
Viet

ウェブサイトからデータを抽出する最も簡単な方法。すべてのデータがタグのみでカバーされていることを分析したので、これを用意しました。

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