使用PHP爬取中国银行实时汇率信息,并为前端提供json数据(后端篇)

先上效果:

使用PHP爬取中国银行实时汇率信息,并为前端提供json数据(后端篇)_第1张图片

 

思路:访客请求一旦请求汇率信息,就让服务器执行一次跨域请求,让服务器读取包含汇率信息的界面,通过正则或者其他的类库(simple_html_dom解析器)提取我们所需的信息,以json的格式返回给客户端。

这里用到的simple_html_dom

下面是后端的代码(getCurrencyInfo.php)

find('td') as $element){
			//构建json数据
			if ($element->plaintext==$currencyName) {
				$targetInfo[$currencyId]['name']=$element->plaintext;
				$eachCurrency++;
			}
			switch ($eachCurrency) {
				case '1':
					//$targetInfo[$currencyId]['name2']=$element->plaintext;
					$eachCurrency++;
					break;
				case '2':
					//$targetInfo[$currencyId]['现汇买入价']=$element->plaintext;
					$eachCurrency++;
					break;
				case '3':
					//$targetInfo[$currencyId]['现钞买入价']=$element->plaintext;
					$eachCurrency++;
					break;
				case '4':
					//$targetInfo[$currencyId]['现汇卖出价']=$element->plaintext;
					$eachCurrency++;
					break;
				case '5':
					//$targetInfo[$currencyId]['现钞卖出价']=$element->plaintext;
					$eachCurrency++;
					break;
				case '6':
					$targetInfo[$currencyId]['rate']=$element->plaintext;
					$targetInfo[$currencyId]['rate']=(float)$targetInfo[$currencyId]['rate'];
					$eachCurrency++;
					break;
				case '7':
					$targetInfo[$currencyId]['date']=$element->plaintext;
					$eachCurrency++;
					break;
				case '8':
					$targetInfo[$currencyId]['time']=$element->plaintext;
					$eachCurrency++;
					break;
			}
			if ($eachCurrency==9) {
				$eachCurrency=0;
			}
		}
	}
 
	getCurrencyInfo('欧元',0);
	getCurrencyInfo('丹麦克朗',1);
	getCurrencyInfo('挪威克朗',2);
	getCurrencyInfo('瑞典克朗',3);
 	
 	//获取冰岛克朗的汇率信息
 	$html = file_get_html('http://www.currencydo.com/CNY_ISK.html');

 	$a=$html->find('table[id=worldBanks] strong',0);

	$patterns = '/(\d+)\.(\d+)/is';
	preg_match_all($patterns,$a,$arr);

 	$targetInfo[]=[
 		'name'=>"冰岛克朗",
 		'rate'=>$arr[0][0]*100,
 		'date'=>$targetInfo[0]["date"],
 		'time'=>$targetInfo[0]['time']
 	];

 	echo json_encode($targetInfo);
	
	//释放内存
	$html=null;
	$targetInfo=null;
?>

下面我们来看一下最关键的部分

foreach($html->find('td') as $element){
……
}

要理解这句什么意思,为什么要这样构建,我们需要看一下我们爬取的网站结构:

使用PHP爬取中国银行实时汇率信息,并为前端提供json数据(后端篇)_第2张图片

 

你会发现它的汇率信息都是放在一个table里的,每个小项的数据都在一个td标签内,那么

 

foreach($html->find('td') as $element){
……
}

就是遍历所有的td,并将其存到$element中,之后用

 

$element->plaintext

来获取其中的信息,组成json返回给客户端

由于中国银行没有提供冰岛克朗的汇率信息,我们使用同样的办法爬取了另一个界面,这里的具体步骤就不做赘述了

你可能感兴趣的:(web)