それで、彼らがそのウェブサイトに関するいくつかの統計を持っているこのウェブサイトがあり、それは毎日更新されています. 私がやりたいことは、その Web サイトをスクラップして、それらの情報を自分の Web サイトに取得し、それらを折れ線グラフに入れることです。http://code.google.com/apis/ajax/playground/?type=visualization#line_chart またはhttp://code.google.com/apis/ajax/playground/?type=visualization#image_line_chart のようなもの唯一の問題は、私がそれを行う方法がわからないことです。
1 に答える
許可を得る
リモート ページをクロールする必要がある場合は、違法なことをしていないことを確認することから始めてください。あなたが行おうとしていることの合法性について、私は決してあなたに助言することはできませんが、一部の人々は自分のデータが破棄されるのを好まないことを確信して言えます - サイト管理者に確認する必要があります彼らがこれに問題がある場合。
許可を得ましたか?良い...
クリアしたら、DOMDocumentクラスを使用して、非常に簡単に操作できる一連のネストされたオブジェクトで DOM の表現を作成することを検討してください。
$doc = new DOMDocument();
$doc->loadHTML(file_get_contents("http://foo.com/data/statistics"));
JavaScript での DOM トラバーサルと選択方法に少しでも精通している場合、DOMDocument
インターフェイスは非常に見慣れたものに見えるでしょう。ID で特定の要素を取得するには、適切なメソッドを使用します。
$statistics = $doc->getElementById("statistics");
そして、そのTD
要素内のすべての要素を取得するには:
$cells = $statistics->getElementsByTagName("td");
あまり詳しく説明しなくても、DOMDocument
クラスによって提供されるメソッドを引き続き使用して、データをトラバースして選択することができます。探している実際のノードに到達したら、それらの値を配列に簡単に保存し、JavaScript を使用してその配列を文字列として出力して、Google グラフを表示できます。
ナイス!
スクリプトを実行するたびにリモート サーバーにアクセスしないように、この操作の結果をキャッシュすることをお勧めします。出力をタイムスタンプ付きでローカル ファイルに保存し、そのタイムスタンプの有効期限を確認します。有効期限が切れたら削除し、新しいキャッシュ結果をその場所に作成します。
これはどのように見えるか
これは、ソリューションが完成したときの非常に基本的な実装です。リモート サーバーには 1 日に 1 回しかヒットしないことに注意してください。
// Silence errors due to malformed HTML
libxml_use_internal_errors(true);
// This function builds out data out, when necessary
function build_output () {
// Create a DOMDocument, grab debt-clock HTML
$doc = new DOMDocument();
$doc->loadHTML(file_get_contents("http://brillig.com/debt_clock/"));
// Find element representing total National Debt
$total = $doc->getElementsByTagName("img")->item(0);
// Grab value from the alt attribute
$total = $total->attributes->getNamedItem("alt")->nodeValue;
// Second paragraph has two more values of interest
$parag = $doc->getElementsByTagName("p")->item(1);
// Build out resulting array of data: Natl. Debt, Population, Ind. Debt
$data = Array(
"ntl" => str_replace(" ", "", $total),
"pop" => $parag->getElementsByTagName("b")->item(0)->nodeValue,
"pay" => $parag->getElementsByTagName("b")->item(1)->nodeValue
);
// Return a JSON string of this data
return json_encode($data);
}
// Most recent cache file (today)
$cache_name = date("Y-m-d");
if (!file_exists($cache_name)) {
// Today's cache doesn't exist, create it.
$output = build_output();
$message = "Fresh: " . $output;
file_put_contents($cache_name, $output);
} else {
// Today has already been cached, load it.
$message = "Cached: " . file_get_contents($cache_name);
}
// Show the user the output
echo $message;
キャッシュからロードする場合、上記のスクリプトからの出力は次のようになります。
Cached: {
"ntl":"$16,293,644,693,599.87",
"pop":"313,929,808",
"pay":"$51,902.19"
}
その JSON データを任意のサービスにロードして、そのデータを表す画像を生成できます。