私は何人かの友人のために簡単なアラートアプリを作成しようとしています。
基本的に、次の2つのようなWebページからデータ「価格」と「在庫状況」を抽出できるようにしたいと思います。
私は電子メールとSMSの部分でアラートを作成しましたが、利用可能な価格と数量を比較してアラートを送信できるように、Webページ(2つまたは他のページ)から数量と価格を取得できるようにしたいと思います。製品がいくつかのしきい値の間にある場合に注文するため。
私はいくつかの正規表現を試しましたが(いくつかのチュートリアルにありますが、これにはn00bが多すぎます)、これを機能させることができませんでした。良いヒントや例はありますか?
$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";
グーグルで検索する必要がある場合に備えて、スクリーンスクレイピングと呼ばれます。
代わりに、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";
}
何をするにしても:HTMLの解析に正規表現を使用しないでください。または 悪いことが起こります 。代わりに パーサー を使用してください。
HTMLコードを this one のようなDOMパーサーにロードし、「価格設定」テーブルを検索するのがおそらく最善です。ただし、あなたが行うあらゆる種類のスクレイピングは、ページレイアウトを変更するたびに壊れる可能性があり、おそらく彼らの同意なしに違法です。
ただし、最善の方法は、サイトを運営している人々と話をして、彼らが代替のより信頼性の高い形式のデータ配信(Webサービス、RSS、またはデータベースのエクスポートが思い浮かぶ)があるかどうかを確認することです。
第一に、この質問をすることはあまりにも詳細になります。第二に、ウェブサイトからデータを抽出することは合法ではないかもしれません。ただし、ヒントがあります。
FirebugまたはChrome/Safari Inspectorを使用して、HTMLコンテンツと興味深い情報のパターンを調べます
正規表現をテストして、一致するかどうかを確認します。あなたはそれを何度もする必要があるかもしれません(マルチパス解析/抽出)
CURLまたはさらに簡単な方法でクライアントを作成するには、file_get_contentsを使用します(一部のホスティングでは、file_get_contentsを使用したURLの読み込みが無効になっていることに注意してください)
私にとっては、正規表現の代わりに、Tidyを使用して有効なXHTMLに変換してから、XPathを使用してデータを抽出する方がよいでしょう。どうして? XHTMLは規則的ではなく、XPathは非常に柔軟だからです。 XSLTを学習して変換することができます。
幸運を!
ウェブサイトからデータを抽出する最も簡単な方法。すべてのデータがタグのみでカバーされていることを分析したので、これを用意しました。
<?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;
}
?>