1. /**
  2. * Project Name:JavaTest
  3. * File Name:BankOfChinaExchangeRate.java
  4. * Package Name:com.lee.javatest
  5. * Date:2016年7月22日下午1:34:09
  6. * Copyright (c) 2016年7月22日, Pwenlee All Rights Reserved.
  7. *
  8. */
  9.  
  10. package com.lee.javatest;
  11.  
  12. import java.io.Serializable;
  13. import java.math.BigDecimal;
  14. import java.text.SimpleDateFormat;
  15. import java.util.ArrayList;
  16. import java.util.Arrays;
  17. import java.util.Date;
  18. import java.util.List;
  19.  
  20. import org.apache.http.HttpEntity;
  21. import org.apache.http.HttpResponse;
  22. import org.apache.http.HttpStatus;
  23. import org.apache.http.client.HttpClient;
  24. import org.apache.http.client.methods.HttpGet;
  25. import org.apache.http.impl.client.DefaultHttpClient;
  26. import org.apache.http.params.CoreConnectionPNames;
  27. import org.apache.http.util.EntityUtils;
  28. import org.jsoup.Jsoup;
  29. import org.jsoup.nodes.Document;
  30. import org.jsoup.nodes.Element;
  31. import org.jsoup.select.Elements;
  32.  
  33. /**
  34. * ClassName:BankOfChinaExchangeRate <br/>
  35. * Function: 中行外汇牌价. <br/>
  36. * Date: 2016年7月22日 下午1:34:09 <br/>
  37. * @author PwenLee
  38. * @version
  39. * @see
  40. */
  41. public class BankOfChinaExchangeRate implements Serializable{
  42.  
  43. private static final Integer DEAFULT_PAGESIZE = 20;
  44.  
  45. private static final long serialVersionUID = -913877619191789389L;
  46.  
  47. /**
  48. * 货币名称 中文简体
  49. */
  50. private String currency;
  51.  
  52. /**
  53. * 现汇买入价
  54. */
  55. private BigDecimal buyingRate;
  56.  
  57. /**
  58. * 现钞买入价
  59. */
  60. private BigDecimal cashBuyingRate;
  61.  
  62. /**
  63. * 现汇卖出价
  64. */
  65. private BigDecimal sellingRate;
  66.  
  67. /**
  68. * 现钞卖出价
  69. */
  70. private BigDecimal cashSellingRate;
  71.  
  72. /**
  73. * 外管局中间价
  74. */
  75. private BigDecimal SAFEMiddleRate;
  76.  
  77. /**
  78. * 中行折算价
  79. */
  80. private BigDecimal bankConvertRate;
  81.  
  82. /**
  83. * 发布时间
  84. */
  85. private String dateTime;
  86.  
  87. public String getCurrency() {
  88. return currency;
  89. }
  90.  
  91. public void setCurrency(String currency) {
  92. this.currency = currency;
  93. }
  94.  
  95. public BigDecimal getBuyingRate() {
  96. return buyingRate;
  97. }
  98.  
  99. public void setBuyingRate(BigDecimal buyingRate) {
  100. this.buyingRate = buyingRate;
  101. }
  102.  
  103. public BigDecimal getCashBuyingRate() {
  104. return cashBuyingRate;
  105. }
  106.  
  107. public void setCashBuyingRate(BigDecimal cashBuyingRate) {
  108. this.cashBuyingRate = cashBuyingRate;
  109. }
  110.  
  111. public BigDecimal getSellingRate() {
  112. return sellingRate;
  113. }
  114.  
  115. public void setSellingRate(BigDecimal sellingRate) {
  116. this.sellingRate = sellingRate;
  117. }
  118.  
  119. public BigDecimal getCashSellingRate() {
  120. return cashSellingRate;
  121. }
  122.  
  123. public void setCashSellingRate(BigDecimal cashSellingRate) {
  124. this.cashSellingRate = cashSellingRate;
  125. }
  126.  
  127. public BigDecimal getSAFEMiddleRate() {
  128. return SAFEMiddleRate;
  129. }
  130.  
  131. public void setSAFEMiddleRate(BigDecimal sAFEMiddleRate) {
  132. SAFEMiddleRate = sAFEMiddleRate;
  133. }
  134.  
  135. public BigDecimal getBankConvertRate() {
  136. return bankConvertRate;
  137. }
  138.  
  139. public void setBankConvertRate(BigDecimal bankConvertRate) {
  140. this.bankConvertRate = bankConvertRate;
  141. }
  142.  
  143. public String getDateTime() {
  144. return dateTime;
  145. }
  146.  
  147. public void setDateTime(String dateTime) {
  148. this.dateTime = dateTime;
  149. }
  150.  
  151. /**
  152. *
  153. * BankOfChinaExchangeRate:
  154. * date:日期 例入“2016-07-22”
  155. * time:时间 例如“05:30:00”
  156. * BankOfChinaCurrencyCode 枚举类
  157. * @author PwenLee
  158. * @param startDate
  159. * @param endDate
  160. * @param currencyCode
  161. * @return BankOfChinaExchangeRate
  162. */
  163. public BankOfChinaExchangeRate (String date, String time, BankOfChinaCurrencyCode currencyCode){
  164. List<String> context = getExchangeRate(date, time, currencyCode);
  165. this.currency = context.get(0);
  166. this.buyingRate = new BigDecimal(context.get(1));
  167. this.cashBuyingRate = new BigDecimal(context.get(2));
  168. this.sellingRate = new BigDecimal(context.get(3));
  169. this.cashSellingRate = new BigDecimal(context.get(4));
  170. this.SAFEMiddleRate = new BigDecimal(context.get(5));
  171. this.bankConvertRate = new BigDecimal(context.get(6));
  172. this.dateTime = context.get(7) + " " + context.get(8);
  173. }
  174.  
  175. /**
  176. * 取当天凌晨05:30:00的数据
  177. */
  178. public BankOfChinaExchangeRate(){
  179. SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
  180. Date date=new Date();
  181. String nowDate=sdf.format(date);
  182. List<String> context = getExchangeRate(nowDate, "05:30:00", BankOfChinaCurrencyCode.USD);
  183. this.currency = context.get(0);
  184. this.buyingRate = new BigDecimal(context.get(1));
  185. this.cashBuyingRate = new BigDecimal(context.get(2));
  186. this.sellingRate = new BigDecimal(context.get(3));
  187. this.cashSellingRate = new BigDecimal(context.get(4));
  188. this.SAFEMiddleRate = new BigDecimal(context.get(5));
  189. this.bankConvertRate = new BigDecimal(context.get(6));
  190. this.dateTime = context.get(7) + " " + context.get(8);
  191. }
  192.  
  193. /**
  194. * 模拟请求url,返回html源码
  195. * @author PwenLee
  196. * @param url
  197. * @return
  198. */
  199. private static String GetHtml(String url) {
  200. String html = null;
  201. HttpClient httpClient = new DefaultHttpClient();
  202. httpClient.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 20000);
  203. HttpGet httpGet = new HttpGet(url);
  204. try {
  205. HttpResponse httpResponse = httpClient.execute(httpGet);
  206. int resStatu = httpResponse.getStatusLine().getStatusCode();
  207. if (resStatu == HttpStatus.SC_OK) {
  208. HttpEntity entity = httpResponse.getEntity();
  209. if (entity != null) {
  210. html = EntityUtils.toString(entity, "utf-8");
  211. }
  212. }
  213. } catch (Exception e) {
  214. //TODO 打成logger
  215. System.out.println("Connect " + url + " error");
  216. e.printStackTrace();
  217. } finally {
  218. httpClient.getConnectionManager().shutdown();
  219. }
  220. return html;
  221. }
  222.  
  223. private List<String> getExchangeRate(String date, String time, BankOfChinaCurrencyCode currencyCode){
  224.  
  225. Integer totalPage = totalPage(date, time, currencyCode);
  226. List<String> contextList = new ArrayList<String>();
  227. if(totalPage <= 0){
  228. //TODO logger
  229. return contextList;
  230. }
  231.  
  232. String context = "";
  233. for(int i=totalPage;i>=0;i--){
  234. String url = "http://srh.bankofchina.com/search/whpj/search.jsp?erectDate="+date+"&nothing="+date+"&pjname="+currencyCode.getCode()+"&page="+i;
  235. String html = GetHtml(url);
  236. Document doc = Jsoup.parse(html);
  237. Elements linkElements = doc.getElementsByClass("BOC_main");
  238. Elements datas = linkElements.get(0).getElementsByTag("tr");
  239. for (Element ele : datas) {
  240. if(ele.text().indexOf(time) != -1){
  241. context = ele.text();
  242. break;
  243. }
  244. }
  245. if(context != ""){ //TODO 换成StringUtils.isNotBlank
  246. break;
  247. }
  248. }
  249.  
  250. if(context == "") {//TODO 换成StringUtils.isBlank
  251. //TODO logger
  252. return contextList;
  253. }else{
  254. contextList = Arrays.asList(context.split(" "));
  255. }
  256. return contextList;
  257. }
  258.  
  259. public static Integer totalPage(){
  260. Integer totalPage = 0;
  261. try{
  262. SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
  263. Date date=new Date();
  264. String nowDate=sdf.format(date);
  265. String url = "http://srh.bankofchina.com/search/whpj/search.jsp?erectDate="+nowDate+"&nothing="+nowDate+"&pjname="+BankOfChinaCurrencyCode.USD.getCode();
  266. String html = GetHtml(url);
  267. //截取网页总条数变量
  268. String stringTemp = html.substring(html.indexOf("m_nRecordCount = "));
  269. //获取变量的值
  270. String totalcount = stringTemp.substring(stringTemp.indexOf("m_nRecordCount = ")+"m_nRecordCount = ".length(),stringTemp.indexOf(";"));
  271. Integer totalnum = Integer.valueOf(totalcount);
  272. if(totalnum % DEAFULT_PAGESIZE == 0){
  273. totalPage = totalnum/DEAFULT_PAGESIZE;
  274. }else{
  275. totalPage = totalnum/DEAFULT_PAGESIZE+1;
  276. }
  277. }catch(Exception e){
  278. //TODO 打成logger
  279. }
  280. return totalPage;
  281. }
  282.  
  283. public static Integer totalPage(String date, String time, BankOfChinaCurrencyCode currencyCode){
  284. Integer totalPage = 0;
  285. try{
  286. String url = "http://srh.bankofchina.com/search/whpj/search.jsp?erectDate="+date+"&nothing="+date+"&pjname="+currencyCode.getCode();
  287. String html = GetHtml(url);
  288. //截取网页总条数变量
  289. String stringTemp = html.substring(html.indexOf("m_nRecordCount = "));
  290. //获取变量的值
  291. String totalcount = stringTemp.substring(stringTemp.indexOf("m_nRecordCount = ")+"m_nRecordCount = ".length(),stringTemp.indexOf(";"));
  292. Integer totalnum = Integer.valueOf(totalcount);
  293. if(totalnum % DEAFULT_PAGESIZE == 0){
  294. totalPage = totalnum/DEAFULT_PAGESIZE;
  295. }else{
  296. totalPage = totalnum/DEAFULT_PAGESIZE+1;
  297. }
  298. }catch(Exception e){
  299. //TODO 打成logger
  300. }
  301. return totalPage;
  302. }
  303.  
  304. @Override
  305. public String toString() {
  306. return "BankOfChinaExchangeRate [currency=" + currency
  307. + ", buyingRate=" + buyingRate + ", cashBuyingRate="
  308. + cashBuyingRate + ", sellingRate=" + sellingRate
  309. + ", cashSellingRate=" + cashSellingRate + ", SAFEMiddleRate="
  310. + SAFEMiddleRate + ", bankConvertRate=" + bankConvertRate
  311. + ", dateTime=" + dateTime + "]";
  312. }
  313.  
  314. }

jsoup简单的爬取网页数据的更多相关文章

  1. 使用webdriver+urllib爬取网页数据(模拟登陆,过验证码)

    urilib是python的标准库,当我们使用Python爬取网页数据时,往往用的是urllib模块,通过调用urllib模块的urlopen(url)方法返回网页对象,并使用read()方法获得ur ...

  2. python之爬取网页数据总结(一)

    今天尝试使用python,爬取网页数据.因为python是新安装好的,所以要正常运行爬取数据的代码需要提前安装插件.分别为requests    Beautifulsoup4   lxml  三个插件 ...

  3. python爬虫——爬取网页数据和解析数据

    1.网络爬虫的基本概念 网络爬虫(又称网络蜘蛛,机器人),就是模拟客户端发送网络请求,接收请求响应,一种按照一定的规则,自动地抓取互联网信息的程序.只要浏览器能够做的事情,原则上,爬虫都能够做到. 2 ...

  4. 使用 Python 爬取网页数据

    1. 使用 urllib.request 获取网页 urllib 是 Python 內建的 HTTP 库, 使用 urllib 可以只需要很简单的步骤就能高效采集数据; 配合 Beautiful 等 ...

  5. 使用XPath爬取网页数据

    我们以我的博客为例,来爬取我所有写过的博客的标题. 首先,打开我的博客页面,右键“检查”开始进行网页分析.我们选中博客标题,再次右键“检查”即可找到标题相应的位置,我们继续点击右键,选择Copy,再点 ...

  6. 03:requests与BeautifulSoup结合爬取网页数据应用

    1.1 爬虫相关模块命令回顾 1.requests模块 1. pip install requests 2. response = requests.get('http://www.baidu.com ...

  7. 使用puppeteer爬取网页数据实践小结

    简单介绍Puppeteer Puppeteer是一个Node库,它通过DevTools协议提供高级API来控制Chrome或Chromium.Puppeteer默认以无头方式运行,但可以配置为有头方式 ...

  8. Selenium+Tesseract-OCR智能识别验证码爬取网页数据

    1.项目需求描述 通过订单号获取某系统内订单的详细数据,不需要账号密码的登录验证,但有图片验证码的动态识别,将获取到的数据存到数据库. 2.整体思路 1.通过Selenium技术,无窗口模式打开浏览器 ...

  9. 【推荐】oc解析HTML数据的类库(爬取网页数据)

    TFhpple是一个用于解析html数据的第三方库,本人感觉功能还算可以,只不过在使用前必须配置项目. 配置 1.导入libxml2.tbd 2.设置编译路径 使用 这里使用一个例子来说明 http: ...

随机推荐

  1. 使用github与jekyll搭建个人博客(一)

    虽然使用博客园还没有多久,但是最近看到一些大神的博客觉得很是炫酷.于是突发奇想,想要搭建自己的博客站点儿.编程菜鸟一枚,还是想要记录下最近的搭建博客经历. 使用github搭建个人博客的方式有很多,百 ...

  2. JavaScript对异常的处理

    JavaScript提供了一套异常处理机制.当查出事故时,你的程序应该抛出一个异常: var add=function(a,b){ if(typeof a !== 'number' || typeof ...

  3. WP7推送通知服务

    原文地址http://www.cnblogs.com/Joetao/articles/2214482.html (一)为什么使用推送通知服务(1)Windows Phone执行模型决定只有一个第三方的 ...

  4. stanford-parser使用说明

    主意:本说明文档针对stanford-parser-full-2014-06-16.不同版本的parser,其功能和表示形式可能会略有不同.但总体不会有太大差异 Stanford parser是一款较 ...

  5. highcharts 不显示X轴 Y轴 刻度

    xAxis: { tickWidth:0,        //设置刻度标签宽度 lineColor:'#ffffff',//设置坐标颜色 lineWidth:0,        //设置坐标宽度 la ...

  6. C# 调用restful服务开源库

    .NET环境下我们想调用其它开放平台的服务接口,不需要自己去实现底层,开源的库用起来会很方便 hammock http://www.cnblogs.com/shanyou/archive/2012/0 ...

  7. nsq初探

    一. 安装 参考:http://nsq.io/deployment/installing.htmlhttp://www.baiyuxiong.com/?p=873    (推荐.) 不推荐直接把官方的 ...

  8. Spring1:Spring简介、环境搭建、源码下载及导入MyEclipse

    框架学习前言 这个模块是面向Spring的,Spring的学习我是这么想的: 1.简单介绍Spring,主要是从网上借鉴一些重点 2.尽量说明清楚Spring的使用方法以及细节点 3.尽量以自己的理解 ...

  9. Linux文件系统应用---系统数据备份和迁移(用户角度)

    1   前言 首先承诺:对于从Windows系统迁移过来的用户,困扰大家的  “Linux系统下是否可以把系统文件和用户文件分开到C盘和D盘中” 的问题也可以得到完满解决. 之前的文章对Linux的文 ...

  10. FB引擎系列-之CloudSand

    CloudSand,欲打破之前的集中版本制作的模式, http://code.taobao.org/p/cloudsand包含服务器端代码(php)和客户端代码(unity)   EasyDown的时 ...