iT邦幫忙

1

PHP-台銀匯率抓取

php
WQ 2019-04-10 12:18:171266 瀏覽

參考CURL及preg_match_all函數所寫的抓匯率,再請各位先進指教!!

<?php
// 設定URL網址
$url = 'https://rate.bot.com.tw/xrt?Lang=zh-TW';

// 建立CURL連線
$ch = curl_init();
 
// 設定擷取的URL網址
curl_setopt($ch, CURLOPT_URL, $url);
 
//強制轉為UTF-8
curl_setopt($ch,CURLOPT_HTTPHEADER, array("Content-Type: application/x-www-form-urlencoded; charset=utf-8"));
 
//將curl_exec()獲取的訊息以文件流的形式返回,而不是直接輸出。
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
 
//設定要傳的 變數A=值A & 變數B=值B (中間要用&符號串接)
$PostData = "a=abc&b=def";
 
//設定CURLOPT_POST 為 1或true,表示要用POST方式傳遞
curl_setopt($ch, CURLOPT_POST, 1);

//CURLOPT_POSTFIELDS 後面則是要傳接的POST資料。
curl_setopt($ch, CURLOPT_POSTFIELDS, $PostData);

$options = array(
    CURLOPT_SSL_VERIFYHOST => 0,
    CURLOPT_SSL_VERIFYPEER => 0,
);
curl_setopt_array($ch, $options);
 
// 執行
$temp=curl_exec($ch);

//去除換行及空白字元
$temp=str_replace(array("\r","\n","\t","\s"), '', $temp);   

//取得匯率時間
preg_match_all ('/<span class="time">(.*)<\/span>/U', $temp, $pat_array1); 
print_r($pat_array1[0]);
echo '<BR>';

//取得幣別
preg_match_all('/<div\s+class="visible-phone print_hide">(.*)<\/div>/U', $temp, $pat_array2); 
print_r($pat_array2[0]);
echo '<BR>';

//取得現金買入匯率
preg_match_all ('/<td data-table="本行現金買入" class="text-right display_none_print_show print_width">(.*)<\/td>/U', $temp, $pat_array3); 
print_r($pat_array3[0]);

//echo $temp;
// 關閉CURL連線
curl_close($ch);
?>

1 則留言

0
vegalou
iT邦新手 4 級 ‧ 2019-05-24 08:29:22

這樣太累了

把原來的 HTML 抓下來,直接用 DOM 的模型處理。

以前抓氣象經驗,如果對方有對接的 API ,不然你永遠不知道他隨便怎麼改。

WQ iT邦新手 4 級‧ 2019-05-24 13:00:17 檢舉

感謝指教,會試著用DOM的模型處理方式作業。謝謝~

WQ iT邦新手 4 級‧ 2019-05-24 14:56:24 檢舉

好用的DOM模型處理,除了日期、時間目前無法取得,其餘都很便利。

<?php
include('simple_html_dom.php');

// get DOM from URL or file
$base = 'http://rate.megabank.com.tw/bulletin02_02.asp';

$curl = curl_init();
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($curl, CURLOPT_URL, $base);
curl_setopt($curl, CURLOPT_REFERER, $base);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);

$str = curl_exec($curl);
curl_close($curl);

// Create a DOM object
$html = new simple_html_dom();

// Load HTML from a string
$html->load($str);
 
// find all curr
$result = $html->find('td.td_left');
foreach($result as $v) {
    echo 'curr:'.$v->outertext . '<br>';
}  
 
// find all rate
$result = $html->find('td.money_td');
foreach($result as $v) {
    echo 'rate:'.$v->outertext . '<br>';
} 
?>
vegalou iT邦新手 4 級‧ 2019-05-24 17:32:59 檢舉

習慣用的function建議整理起來,有回傳的習慣,減低重複性,看code簡潔,也容易除錯。

回傳的資料排程陣列,可重複使用、免得又LOOP。

如果整個文件利用server + AJ套給 document, JQ又可以幫你簡單化很多。

ex:

function curl_post_contents($url,$postdata) {
  $ch = curl_init();
  if (!is_resource($ch)) return false;
  curl_setopt($ch, CURLOPT_SSL_VERIFYPEER , 0);
  curl_setopt($ch, CURLOPT_FOLLOWLOCATION , 0);
  curl_setopt($ch, CURLOPT_URL , $url);
  curl_setopt($ch, CURLOPT_POST , 1);
  curl_setopt($ch, CURLOPT_POSTFIELDS , $postdata );
  curl_setopt($ch, CURLOPT_RETURNTRANSFER , 1);
  curl_setopt($ch, CURLOPT_VERBOSE , 0);
  $response = curl_exec($ch);
  curl_close($ch);
  return $response;
}

我要留言

立即登入留言