首先貼出原文鏈接:https://jingyan.baidu.com/article/922554465bf115851748f45f.html
方法如下:
function getRate($from, $to, $amount){ $data = file_get_contents("http://www.baidu.com/s?wd={$from}%20{$to}&rsv_spt={$amount}");preg_match("/<div>1\D*=(\d*\.\d*)\D*<\/div>/",$data, $converted); $converted = preg_replace("/[^0-9.]/", "", $converted[1]); return number_format(round($converted, 3), 3); }
剛開始我還真以為是百度給的匯率接口,結果我把$data直接打印出來才發現這是抓取的頁面內容,不過確實能用,感覺這種方式很多東西都可以獲取到了,但是不知道會有什么風險。
如果想獲得更為准確和及時的匯率信息,當然只能去中國銀行的官網去獲得了。http://www.boc.cn/sourcedb/whpj/
(不知道是否有實時的免費的匯率接口,反正我這里沒有找到,如果有哪位讀者找到了,麻煩分享一下)
此處以獲得歐元匯率為例:
1.我們先去分析一下頁面的接口(右鍵->查看源代碼)得到該頁面的代碼。
因為我們打開網頁的時候並不是我們想要的內容,通常搜索結果都會是異步獲取的,我們需要找到它異步獲取數據的方式

由此我們可以看出,由此我們可以得到他的搜索結果的獲取地址:http://srh.bankofchina.com/search/whpj/search.jsp?erectDate=2017-11-13¬hing=2017-11-13&pjname=1326&page=1
那么我們就可以傳遞對應參數拉取到對應頁面
$pageCode = file_get_contents("http://srh.bankofchina.com/search/whpj/search.jsp?erectDate=2017-11-13¬hing=2017-11-13&pjname=1326&page=1");
2.截取我們需要的內容這里就稍微得用到正則表達式了。
分析一下我們需要的數據是個什么結構

這是原始的 源代碼,,我將其 空格 換行 制表符等全部刪掉,然后開始匹配 (由於我技術有限所已並不能一次性很完美的解析出內容一下是我粗暴的做法)
$data = str_replace(array(" ","\r","\n","\t"), "",$pageCode);
preg_match('/<tr>[\s]*<td>歐元<\/td>[\s]*<td>[\s|\S]*<\/td>[\s]*<\/tr>/',$data, $converted);//這里其實可以一次性匹配解析出想要的數據,只是需要好好熟悉一下正則,
$data = str_replace("</tr><tr>", ";", $converted[0]);
$data = str_replace(array("<tr>","</tr>"), "", $data);
$data = str_replace("</td><td>", ",", $data);
$data = str_replace(array("<td>","</td>"), "", $data);
$rateList = explode(";", $data);
$rate = explode(",", $rateList[0]);
整理為方法如下:
function getEurRate(){ $date = date("Y-m-d", time());
//獲得頁面代碼 $data = file_get_contents("http://srh.bankofchina.com/search/whpj/search.jsp?erectDate=".$date."¬hing=".$date."&pjname=1326&page=1");
//去掉非字符 $data = str_replace(array(" ","\r","\n","\t"), "", $data);
//得到匯率代碼 preg_match('/<tr>[\s]*<td>歐元<\/td>[\s]*<td>[\s|\S]*<\/td>[\s]*<\/tr>/',$data, $converted);
//開始各種調整格式 為了整理為 數組 $data = str_replace("</tr><tr>", ";", $converted[0]); $data = str_replace(array("<tr>","</tr>"), "", $data); $data = str_replace("</td><td>", ",", $data); $data = str_replace(array("<td>","</td>"), "", $data); $rateList = explode(";", $data); $rate = explode(",", $rateList[0]); //$rate [0] 國家 [1] 現匯買入價 [2]現鈔買入價[3]現匯賣出價[4]現鈔賣出價[5]外管局中間價[6]中行折算價 $rate = $rate[3]; $rate = round(($rate/100),2); if(is_numeric($rate))return $rate; else return false; }
簡單粗暴,但是有效。有很多可優化的地方我就不多描述了。
