<?php
- //取得対象となるURIを指定
- define (BASE_URI ,"http://fx.himawari-group.co.jp/price/blogparts.html");
- include('proxy.php');
- // proxyを利用する場合は$use_proxy = 1; しない場合は $use_proxy = 0; を指定
- $use_proxy = 0;
- $proxy_host = 'proxy.example.co.jp';
- $proxy_port = 8080;
- $no_proxy = array(
- 'localhost', // localhost
- '127.0.0.0/8', // loopback
- );
- function get_html($url){
- $rdata = http_request($url);
- $data = $rdata['data'];
- $data = mb_convert_encoding($data,"UTF-8", "auto");
- return ($data);
- }
- function dump_nodes_rate(tidyNode $node, &$urls = NULL) {
- $urls = (is_array($urls)) ? $urls : array();
- if(isset($node->id)) {
- // ここからが実際のスクレイピング処理と思ってよいでしょう。
- // 今回はTABLEのTDタグの中でCLASS="tdborder"の中身を取得したい。
- // なので、$node->id が TDタグだったら
- if( $node->id == TIDY_TAG_TD ){
- // 更に、そのタグのclassというアトリビュートがtdborderならば
- if (strpos($node->attribute['class'] ,"tdborder") === 0){
- // 取得時に改行が入ることがあるので、改行を空文字に置換し、
- // ひとまとめに配列$urls[]に入れてみる(各配列内の処理は後回し)
- $urls[] = str_replace( array( chr(10) , chr(13) ),"",$node->child[0]->value);
- }
- }
- // ここまでが実際のスクレイピング処理と思ってよいでしょう。
- }
- // 更に子供のノードが存在すれば、再帰的にdump_nodes_rate()を繰り返す
- if($node->hasChildren()) {
- foreach($node->child as $c) {
- dump_nodes_rate($c, $urls);
- }
- }
- // 連想配列をリターン
- return $urls;
- }
- ?>
- <html>
- <head>
- <meta http-equiv="content-type" content="text/html;charset=UTF-8">
- <link href="style_rate.css" type="text/css" rel="stylesheet">
- <title>為替レート取得</title>
- </head>
- <body>
- <a href="./rate.php">HOME</a><br /><div align="center"><a href="http://fx.himawari-group.co.jp/service/blogparts.html" target="_blank">ひまわり証券株式会社 ブログパーツ FXレートウォッチャー</a>から為替レートを取得</div><hr />
- <div style="float:left;text-align:center">元データ<br /><iframe width="160px" height="540px" marginwidth="0" marginheight="0" hspace="0" vspace="0" scrolling="no" frameborder="0" src="http://fx.himawari-group.co.jp/price/blogparts.html"></iframe></div>
- <div style="text-align:center">
- <form action="rate.php" method="get">
- <input name="cmd" type="hidden" value="getrate" />
- <input type="submit" value="為替レート取得" />
- </form>
- <?php
- // ボタンが押されたら
- if($_GET['cmd']<>""){
- // 対象となるHTMLファイルを取得
- $html = get_html(BASE_URI);
- // TIDY関数前処理
- $config = array('indent' => TRUE,
- 'output-xhtml' => TRUE,
- 'wrap' => 200);
- // tidyでパース開始(tidyオブジェクトが作成される)
- $tidy = tidy_parse_string($html, $config, 'UTF8');
- $tidy->cleanRepair();
- // dump_nodes_rate()関数にtidyオブジェクトのbody部分を渡し、
- // 対象となる TD タグの内容を取得
- $rate = dump_nodes_rate($tidy->body());
- // 配列のはじめは現在時刻なので、$nowtimeに設定
- $nowtime = $rate[0];
- // 新規に配列作成(しなくても$rateのみでできそうだがとりあえず)
- $js = array();
- // 配列からはじめの要素を取り出す
- // はじめの要素とは$rate[0](現在の時刻)
- array_shift($rate);
- // これで、$rateの中身は、通貨ベア、現在値、前日比のみになった。
- // この3つのパターンの繰り返しになる。
- // 配列 $rateの要素を3で割った数だけ繰り返す
- for($i = 0; $i<count($rate)/3 ; $i++){
- // 通貨ベア取得
- $tuka = $rate[$i*3];
- // 現在値取得
- $val = $rate[$i*3+1];
- // 前日比取得
- $deg = $rate[$i*3+2];
- // 前日比が0でない場合は、
- // <span class="minus">▼0.29</span>などと表示されているので
- // $degが0でなければ、
- if ($deg!="0"){
- // <span class="minus">▼0.29</span>の「>」でexplodeする。
- $tmp0 = explode(">",$deg);
- // $tmp0[0] = <span class="minus"
- // $tmp0[1] = ▼0.29</span>
- // ▼0.29</span> の「<」でexplodeする。
- $tmp1 = explode("<",$tmp0[1]);
- // $tmp1[0] = ▼0.29
- // $tmp1[1] = /span>
- // 「▼」を「-」に置換
- $tmp1[0] = str_replace("▼","-",$tmp1[0]);
- // 「▲」を「+」に置換
- $tmp1[0] = str_replace("▲","+",$tmp1[0]);
- $deg = $tmp1[0];
- }
- // 配列に追加していく
- $js[] = array("tuka"=>$tuka , "val" =>$val , "deg"=>$deg);
- }
- // 結果表示
- echo '<table>';
- echo '<tr><td colspan="3" align="center">'.$nowtime.'</td></tr>';
- echo '<tr><th>通貨ペア</th><th>現在値</th><th>前日比</th></tr>';
- // 配列取り出し
- foreach($js as $item){
- echo '<tr><td>'.$item['tuka'].'</td><td>'.$item['val'].'</td><td>'.$item['deg'].'</td></tr>';
- }
- echo '</table>';
- }
- ?>
- </div>
- </body>
- </html>
-