Simple Html Dom Parser是一款遍历HTML Dom的php工具,其使用方法类似jquery,很是方便。不过我今天才知道这孩子的存在,惭愧!决定学习一下,写一个小程序,获取中国银行外汇牌价。
目录
关于版权
这个我很是糊涂,中国银行汇率似乎没有API接口,在网上翻腾了半天只找到了这个,对比了下和中国银行官网的外汇牌价并不完全一致。所以采集可能是最有效的方式,中国银行对此的版权限制是:
未经中国银行许可,不得以商业目的转载本汇率表的全部或部分内容,如需引用相关数据,应注明来源于中国银行
我想个人使用应该没啥问题吧。
方法
- 使用Simple HTML Dom Parser读取中国银行外汇牌价网页,为了方便选了英文版(http://www.boc.cn/sourcedb/whpj/enindex.html)
- 获取带有center属性的tr,从表的结构来看这些是记录汇率的
- 遍历表格元素,把数据存入数组
代码如下
require_once( 'simple_html_dom.php' ); /** *Retrieve info from boc website using simple html dom. * *Simple Html Dom Parser document and download: http://simplehtmldom.sourceforge.net/ */ function get_boc_exchange_rate_table(){ //Get web page by simple html dom parser $html = file_get_html( 'http://www.boc.cn/sourcedb/whpj/enindex.html' ); //Control the items in the currency list. $allowed_currency = array( 'TWD', 'GBP', 'HKD', 'USD', 'CHF', 'SGD', 'SEK', 'DKK', 'NOK', 'JPY', 'CAD', 'AUD', 'MYR', 'EUR', 'MOP', 'PHP', 'THB', 'NZD', 'KRW', 'RUB' ); //Stores the final data $exchange_rates = array(); foreach( $html->find('table tr[align=center]') as $tr ){ $currency_name = $tr->children(0)->plaintext; if( in_array( $currency_name, $allowed_currency ) ){ $exchange_rates[ $currency_name ]['currency_name'] = $currency_name; $exchange_rates[ $currency_name ]['buying_rate'] = $tr->children(1)->plaintext; $exchange_rates[ $currency_name ]['cash_buying_rate'] = $tr->children(2)->plaintext; $exchange_rates[ $currency_name ]['selling_rate'] = $tr->children(3)->plaintext; $exchange_rates[ $currency_name ]['cash_selling_rate'] = $tr->children(4)->plaintext; $exchange_rates[ $currency_name ]['middle_rate'] = $tr->children(5)->plaintext; $exchange_rates[ $currency_name ]['pub_time'] = str_replace(" ", '',$tr->children(6)->plaintext); try { $datetime = new DateTime( $exchange_rates[ $currency_name ]['pub_time'] ); } catch( Exception $e ){ echo $e->getMessage(); } $exchange_rates[ $currency_name ]['pub_time'] = $datetime->format('Y-m-d H:i:s'); } } return $exchange_rates; }
get_boc_exchange_rate_table函数会返回一个数组,数组结构如下所示:
Array ( [TWD] => Array ( [currency_name] => TWD [buying_rate] => [cash_buying_rate] => 19.69 [selling_rate] => [cash_selling_rate] => 21.1 [middle_rate] => 20.48 [pub_time] => 2013-06-03 17:36:21 ) [GBP] => Array ( [currency_name] => GBP [buying_rate] => 932.37 [cash_buying_rate] => 903.58 [selling_rate] => 939.86 [cash_selling_rate] => 939.86 [middle_rate] => 940.25 [pub_time] => 2013-06-03 17:36:21 ) //more currency ... )
有了这样一个数组,就可以随意调用汇率数据了。
源代码下载
[download id=52]
将boc-exchage-rate目录放到主题根目录下,然后在主题functions.php中用如下代码引用,就可以看到示例。
require_once('boc-exchange-rate/functions.php');
我新建了一个页面,如何调用代码输出这个数据
$array = get_boc_exchange_rate_table();
$array是一个包含汇率数据的数组,结构就像我文中说的那样。之后的事情,就是如何输出php数组了。
不过这个方法不是太稳定,我试过,有时候抓取不到,可能是服务器连中国银行网站失败的原因。
那有没有什么其它好的办法,推荐下,找了半天搜到你这篇文章,开心的是还是和wordpress挂钩的
或者用正则匹配,但 不解决连接中国银行网站失败的问题。归根结底是中国银行没提供任何借口,稳定性自然无法保证,不是用什么方法的事。
你可以缓存结果,如果获得结果失败,就不要刷新缓存。
我用你这个方法输出,外汇数据总是出现在入下图中的位置,我想自定义这个位置,这个怎么修改
http://img02.taobaocdn.com/imgextra/i2/256807085/T2X6RNXtxaXXXXXXXX_!!256807085.jpg
http://wordpress.org/plugins/edithtmldom/
这个插件;有没有用过?
我没用过edithtmldom这个插件。
get_boc_exchange_rate_table()是将结果返回,所以在哪里输出应该不是它的问题,你写在哪,它就在哪输出。我的实例代码中是写在functions.php里的,所以应该会在所有内容之前输出,你可以放到content区域,或者更自由一点,写成shortcode。
add_shortcode( ‘boc_rate’, ‘get_boc_exchange_rate_table’ );
居然又找到你这了,呵呵
幸会,你在找汇率相关的东西?我这个方法测试了一段时间,一个大问题就是打开那个地址的时候经常出现打不开的症状…
五年来我抓取 中行汇率都是用正则…Simple Html Dom Parser 这孩子…碉堡了… 可以拿来学习哈“`
抓了五年了!那就是说抓一抓也没问题了,很好。 我正则表达式很差很差…你是怎么抓的,能跟我说下匹配的规则吗?
已经发到你球球了…刚发现之前在你博客注册了…=.=!
谢谢,收到了!为什么我的正则学一次忘一次呢,怎么学都觉得跟它没缘分!