1. <?php
  2. //取得対象となるURIを指定
  3. define (BASE_URI ,"http://fx.himawari-group.co.jp/price/blogparts.html");
  4. include('proxy.php');
  5. // proxyを利用する場合は$use_proxy = 1; しない場合は $use_proxy = 0; を指定
  6. $use_proxy 0;
  7. $proxy_host 'proxy.example.co.jp';
  8. $proxy_port 8080;
  9. $no_proxy = array(
  10.     'localhost',        // localhost 
  11.     '127.0.0.0/8',      // loopback
  12. );
  13. function get_html($url){
  14.     $rdata http_request($url);
  15.     $data $rdata['data'];
  16.     $data mb_convert_encoding($data,"UTF-8""auto");
  17.     return ($data);
  18. }
  19. function dump_nodes_rate(tidyNode $node, &$urls NULL) {
  20.     $urls = (is_array($urls)) ? $urls : array();
  21.     if(isset($node->id)) {
  22.         // ここからが実際のスクレイピング処理と思ってよいでしょう。
  23.         // 今回はTABLEのTDタグの中でCLASS="tdborder"の中身を取得したい。
  24.         // なので、$node->id が TDタグだったら
  25.         if( $node->id == TIDY_TAG_TD ){
  26.             // 更に、そのタグのclassというアトリビュートがtdborderならば
  27.             if (strpos($node->attribute['class'] ,"tdborder") === 0){
  28.                 // 取得時に改行が入ることがあるので、改行を空文字に置換し、
  29.                 // ひとまとめに配列$urls[]に入れてみる(各配列内の処理は後回し)
  30.                 $urls[] = str_replace( array( chr(10) , chr(13) ),"",$node->child[0]->value);
  31.             }
  32.         }
  33.     // ここまでが実際のスクレイピング処理と思ってよいでしょう。
  34.     }
  35.     // 更に子供のノードが存在すれば、再帰的にdump_nodes_rate()を繰り返す
  36.     if($node->hasChildren()) {
  37.         foreach($node->child as $c) {
  38.             dump_nodes_rate($c$urls);
  39.         }
  40.     }
  41.     // 連想配列をリターン
  42.     return $urls;
  43. }
  44. ?>
  45. <html>
  46. <head>
  47. <meta http-equiv="content-type" content="text/html;charset=UTF-8">
  48. <link href="style_rate.css" type="text/css" rel="stylesheet"> 
  49. <title>為替レート取得</title>
  50. </head>
  51. <body>
  52. <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 />
  53. <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>
  54. <div style="text-align:center">
  55. <form action="rate.php" method="get">
  56. <input name="cmd" type="hidden" value="getrate" />
  57. <input type="submit" value="為替レート取得" />
  58. </form>
  59. <?php
  60. // ボタンが押されたら
  61. if($_GET['cmd']<>""){
  62.     // 対象となるHTMLファイルを取得
  63.     $html get_html(BASE_URI);
  64.     // TIDY関数前処理
  65.     $config = array('indent' => TRUE,
  66.                     'output-xhtml' => TRUE,
  67.                     'wrap' => 200);
  68.     // tidyでパース開始(tidyオブジェクトが作成される)
  69.     $tidy tidy_parse_string($html$config'UTF8');
  70.     $tidy->cleanRepair();
  71.     // dump_nodes_rate()関数にtidyオブジェクトのbody部分を渡し、
  72.     // 対象となる TD タグの内容を取得
  73.     $rate dump_nodes_rate($tidy->body());
  74.     // 配列のはじめは現在時刻なので、$nowtimeに設定
  75.     $nowtime $rate[0];
  76.     // 新規に配列作成(しなくても$rateのみでできそうだがとりあえず)
  77.     $js = array();
  78.     // 配列からはじめの要素を取り出す
  79.     // はじめの要素とは$rate[0](現在の時刻)
  80.     array_shift($rate);
  81.     // これで、$rateの中身は、通貨ベア、現在値、前日比のみになった。
  82.     // この3つのパターンの繰り返しになる。
  83.     // 配列 $rateの要素を3で割った数だけ繰り返す
  84.     for($i 0$i<count($rate)/$i++){
  85.         // 通貨ベア取得
  86.         $tuka $rate[$i*3];
  87.         // 現在値取得
  88.         $val =  $rate[$i*3+1];
  89.         // 前日比取得
  90.         $deg =  $rate[$i*3+2];
  91.         // 前日比が0でない場合は、
  92.         // <span class="minus">▼0.29</span>などと表示されているので
  93.         // $degが0でなければ、
  94.         if ($deg!="0"){
  95.             // <span class="minus">▼0.29</span>の「>」でexplodeする。
  96.             $tmp0 explode(">",$deg);
  97.             // $tmp0[0] = <span class="minus"
  98.             // $tmp0[1] = ▼0.29</span>
  99.             // ▼0.29</span> の「<」でexplodeする。
  100.             $tmp1 explode("<",$tmp0[1]);
  101.             // $tmp1[0] = ▼0.29
  102.             // $tmp1[1] = /span>
  103.             // 「▼」を「-」に置換
  104.             $tmp1[0] = str_replace("▼","-",$tmp1[0]);
  105.             // 「▲」を「+」に置換
  106.             $tmp1[0] = str_replace("▲","+",$tmp1[0]);
  107.             $deg $tmp1[0];
  108.         }
  109.         // 配列に追加していく
  110.         $js[] = array("tuka"=>$tuka "val" =>$val "deg"=>$deg);
  111.     }
  112.     // 結果表示
  113.     echo '<table>';
  114.     echo '<tr><td colspan="3" align="center">'.$nowtime.'</td></tr>';
  115.     echo '<tr><th>通貨ペア</th><th>現在値</th><th>前日比</th></tr>'
  116.     // 配列取り出し
  117.     foreach($js as $item){
  118.         echo '<tr><td>'.$item['tuka'].'</td><td>'.$item['val'].'</td><td>'.$item['deg'].'</td></tr>';
  119.     }
  120.     echo '</table>';
  121. }
  122. ?>
  123. </div>
  124. </body>
  125. </html>