Simple Html Dom Parser是一款遍历HTML Dom的php工具,其使用方法类似jquery,很是方便。不过我今天才知道这孩子的存在,惭愧!决定学习一下,写一个小程序,获取中国银行外汇牌价。

关于版权

这个我很是糊涂,中国银行汇率似乎没有API接口,在网上翻腾了半天只找到了这个,对比了下和中国银行官网的外汇牌价并不完全一致。所以采集可能是最有效的方式,中国银行对此的版权限制是:

未经中国银行许可,不得以商业目的转载本汇率表的全部或部分内容,如需引用相关数据,应注明来源于中国银行

我想个人使用应该没啥问题吧。

方法

  1. 使用Simple HTML Dom Parser读取中国银行外汇牌价网页,为了方便选了英文版(http://www.boc.cn/sourcedb/whpj/enindex.html)
  2. 获取带有center属性的tr,从表的结构来看这些是记录汇率的
  3. 遍历表格元素,把数据存入数组

代码如下

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 ...
)

有了这样一个数组,就可以随意调用汇率数据了。

源代码下载

用Simple Html Dom Parser获取中国银行外汇牌价示例代码 已下载 1161 次

将boc-exchage-rate目录放到主题根目录下,然后在主题functions.php中用如下代码引用,就可以看到示例。

require_once('boc-exchange-rate/functions.php');

 

13条留言

  1. 我新建了一个页面,如何调用代码输出这个数据

    1. $array = get_boc_exchange_rate_table();
      $array是一个包含汇率数据的数组,结构就像我文中说的那样。之后的事情,就是如何输出php数组了。
      不过这个方法不是太稳定,我试过,有时候抓取不到,可能是服务器连中国银行网站失败的原因。

      1. 那有没有什么其它好的办法,推荐下,找了半天搜到你这篇文章,开心的是还是和wordpress挂钩的

        1. 或者用正则匹配,但 不解决连接中国银行网站失败的问题。归根结底是中国银行没提供任何借口,稳定性自然无法保证,不是用什么方法的事。
          你可以缓存结果,如果获得结果失败,就不要刷新缓存。

    2. 我没用过edithtmldom这个插件。
      get_boc_exchange_rate_table()是将结果返回,所以在哪里输出应该不是它的问题,你写在哪,它就在哪输出。我的实例代码中是写在functions.php里的,所以应该会在所有内容之前输出,你可以放到content区域,或者更自由一点,写成shortcode。
      add_shortcode( ‘boc_rate’, ‘get_boc_exchange_rate_table’ );

  2. 居然又找到你这了,呵呵

    1. 幸会,你在找汇率相关的东西?我这个方法测试了一段时间,一个大问题就是打开那个地址的时候经常出现打不开的症状…

  3. 五年来我抓取 中行汇率都是用正则…Simple Html Dom Parser 这孩子…碉堡了… 可以拿来学习哈“`

    1. 抓了五年了!那就是说抓一抓也没问题了,很好。 我正则表达式很差很差…你是怎么抓的,能跟我说下匹配的规则吗?

      1. 已经发到你球球了…刚发现之前在你博客注册了…=.=!

        1. 谢谢,收到了!为什么我的正则学一次忘一次呢,怎么学都觉得跟它没缘分!

评论功能已关闭