首先贴出原文链接: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&nothing=2017-11-13&pjname=1326&page=1

那么我们就可以传递对应参数拉取到对应页面

$pageCode = file_get_contents("http://srh.bankofchina.com/search/whpj/search.jsp?erectDate=2017-11-13&nothing=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."&nothing=".$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;
}

简单粗暴,但是有效。有很多可优化的地方我就不多描述了。

php 获得汇率(解析页面内容获得指定数据)的更多相关文章

  1. Scrapy框架——介绍、安装、命令行创建,启动、项目目录结构介绍、Spiders文件夹详解(包括去重规则)、Selectors解析页面、Items、pipelines(自定义pipeline)、下载中间件(Downloader Middleware)、爬虫中间件、信号

    一 介绍 Scrapy一个开源和协作的框架,其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的,使用它可以以快速.简单.可扩展的方式从网站中提取所需的数据.但目前Scrapy的用途十分广泛,可 ...

  2. PHP curl获取页面内容,不直接输出到页面,CURLOPT_RETURNTRANSFER参数设置

    使用PHP curl获取页面内容或提交数据,有时候希望返回的内容作为变量储存,而不是直接输出.这个时候就必需设置curl的或true. 1.curl获取页面内容, 直接输出例子: <?php $ ...

  3. PHP CURL获取页面内容输出例子

    使用PHP curl获取页面内容或提交数据,有时候希望返回的内容作为变量储存,而不是直接输出.这个时候就必需设置curl的CURLOPT_RETURNTRANSFER选项为1或true. 1.curl ...

  4. asp.net将页面内容按需导入Excel,并设置excel样式,下载文件(解决打开格式与扩展名指定的格式不统一的问题)

    //请求一个excel类 Microsoft.Office.Interop.Excel.ApplicationClass excel = null; //创建 Workbook对象 Microsoft ...

  5. [实战演练]python3使用requests模块爬取页面内容

    本文摘要: 1.安装pip 2.安装requests模块 3.安装beautifulsoup4 4.requests模块浅析 + 发送请求 + 传递URL参数 + 响应内容 + 获取网页编码 + 获取 ...

  6. LIMS系统仪器数据采集-使用xpdf解析pdf内容

    不同语言解析PDF内容都有各自的库,比如Java的pdfbox,.net的itextsharp. c#解析PDF文本,关键代码可参考: http://www.cnblogs.com/mahongbia ...

  7. python爬虫解析页面数据的三种方式

    re模块 re.S表示匹配单行 re.M表示匹配多行 使用re模块提取图片url,下载所有糗事百科中的图片 普通版 import requests import re import os if not ...

  8. htmlunit爬虫工具使用--模拟浏览器发送请求,获取JS动态生成的页面内容

    Htmlunit是一款模拟浏览抓取页面内容的java框架,具有js解析引擎(rhino),可以解析页面的js脚本,得到完整的页面内容,特殊适合于这种非完整页面的站点抓取. 下载地址: https:// ...

  9. nodejs cheerio模块提取html页面内容

    nodejs cheerio模块提取html页面内容 1. nodejs cheerio模块提取html页面内容 1.1. 找到目标元素 1.2. 美化文本输出 1.3. 提取答案文本 1.4. 最终 ...

随机推荐

  1. Anaconda安装mysqldb模块

    在anaconda里mysqldb是封在mysql-python里的,所以要先在anaconda prompt里运行 conda install mysql-python.(注意要右键选管理员身份)有 ...

  2. _quick_response

    在线答题,抢答 `question` 题库 `correctAnswer` 正确答案(A,B,C,D) `answerA` 选项显示 `answerB`选项显示 `answerC` 选项显示 `ans ...

  3. echarts的axisLabel的文字内容过长的解决办法

    通过查找资料学习,我总结了四种解决的办法,不一定是最好的,但是希望能够帮助到需要的童鞋,同时如果大家有什么更好的方法欢迎指导. 方法一:这种方法就是将文本内容转换为字符串数组,然后再按需求换行,需要每 ...

  4. get函数

    dict={"name":"jary","age":22}print(dict.get("age")) # 通过键值找到 ...

  5. Codeforces 1064 D - Labyrinth

    D - Labyrinth 对于位置(i,j), j - c = R - L = const(常数), 其中R表示往右走了几步,L表示往左走了几步 所以R越大, L就越大, R越小, L就越小, 所以 ...

  6. Django Context对象 + 过滤器 + 标签

    玩一玩上下文(context)对象 多数时间,你可以通过传递一个完全填充(full populated)的字典给 Context() 来初始化 上下文(Context) . 但是初始化以后,你也可以从 ...

  7. 《HTTP 权威指南》笔记:第十五章 实体与编码

     如果把 「HTTP 报文」想象为因特网货运系统的「箱子」,那么「HTTP 实体」就是报文中的实际的「货物」. 其中,实体又包含了「实体首部」 和 「实体主体」,实体首部用于描述各种参数,实体主体就 ...

  8. 弹性盒式布局flexbox(dispaly:flex)

    display:flex flex-direction: row(行)/column(列)/row-reverse/column-reverse反方向  //布局 justify-content: s ...

  9. Archiva 2.2.3 安装运行的时候出现协议版本错误

    在 Archiva 安装成功后运行的时候出现协议版本错误: Caused by: javax.net.ssl.SSLException: Received fatal alert: protocol_ ...

  10. mysql,Jdbc工具类,只需一条sql实现简单查询

    import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import ...