/**
* Project Name:JavaTest
* File Name:BankOfChinaExchangeRate.java
* Package Name:com.lee.javatest
* Date:2016年7月22日下午1:34:09
* Copyright (c) 2016年7月22日, Pwenlee All Rights Reserved.
*
*/ package com.lee.javatest; import java.io.Serializable;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List; import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.CoreConnectionPNames;
import org.apache.http.util.EntityUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements; /**
* ClassName:BankOfChinaExchangeRate <br/>
* Function: 中行外汇牌价. <br/>
* Date: 2016年7月22日 下午1:34:09 <br/>
* @author PwenLee
* @version
* @see
*/
public class BankOfChinaExchangeRate implements Serializable{ private static final Integer DEAFULT_PAGESIZE = 20; private static final long serialVersionUID = -913877619191789389L; /**
* 货币名称 中文简体
*/
private String currency; /**
* 现汇买入价
*/
private BigDecimal buyingRate; /**
* 现钞买入价
*/
private BigDecimal cashBuyingRate; /**
* 现汇卖出价
*/
private BigDecimal sellingRate; /**
* 现钞卖出价
*/
private BigDecimal cashSellingRate; /**
* 外管局中间价
*/
private BigDecimal SAFEMiddleRate; /**
* 中行折算价
*/
private BigDecimal bankConvertRate; /**
* 发布时间
*/
private String dateTime; public String getCurrency() {
return currency;
} public void setCurrency(String currency) {
this.currency = currency;
} public BigDecimal getBuyingRate() {
return buyingRate;
} public void setBuyingRate(BigDecimal buyingRate) {
this.buyingRate = buyingRate;
} public BigDecimal getCashBuyingRate() {
return cashBuyingRate;
} public void setCashBuyingRate(BigDecimal cashBuyingRate) {
this.cashBuyingRate = cashBuyingRate;
} public BigDecimal getSellingRate() {
return sellingRate;
} public void setSellingRate(BigDecimal sellingRate) {
this.sellingRate = sellingRate;
} public BigDecimal getCashSellingRate() {
return cashSellingRate;
} public void setCashSellingRate(BigDecimal cashSellingRate) {
this.cashSellingRate = cashSellingRate;
} public BigDecimal getSAFEMiddleRate() {
return SAFEMiddleRate;
} public void setSAFEMiddleRate(BigDecimal sAFEMiddleRate) {
SAFEMiddleRate = sAFEMiddleRate;
} public BigDecimal getBankConvertRate() {
return bankConvertRate;
} public void setBankConvertRate(BigDecimal bankConvertRate) {
this.bankConvertRate = bankConvertRate;
} public String getDateTime() {
return dateTime;
} public void setDateTime(String dateTime) {
this.dateTime = dateTime;
} /**
*
* BankOfChinaExchangeRate:
* date:日期 例入“2016-07-22”
* time:时间 例如“05:30:00”
* BankOfChinaCurrencyCode 枚举类
* @author PwenLee
* @param startDate
* @param endDate
* @param currencyCode
* @return BankOfChinaExchangeRate
*/
public BankOfChinaExchangeRate (String date, String time, BankOfChinaCurrencyCode currencyCode){
List<String> context = getExchangeRate(date, time, currencyCode);
this.currency = context.get(0);
this.buyingRate = new BigDecimal(context.get(1));
this.cashBuyingRate = new BigDecimal(context.get(2));
this.sellingRate = new BigDecimal(context.get(3));
this.cashSellingRate = new BigDecimal(context.get(4));
this.SAFEMiddleRate = new BigDecimal(context.get(5));
this.bankConvertRate = new BigDecimal(context.get(6));
this.dateTime = context.get(7) + " " + context.get(8);
} /**
* 取当天凌晨05:30:00的数据
*/
public BankOfChinaExchangeRate(){
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
Date date=new Date();
String nowDate=sdf.format(date);
List<String> context = getExchangeRate(nowDate, "05:30:00", BankOfChinaCurrencyCode.USD);
this.currency = context.get(0);
this.buyingRate = new BigDecimal(context.get(1));
this.cashBuyingRate = new BigDecimal(context.get(2));
this.sellingRate = new BigDecimal(context.get(3));
this.cashSellingRate = new BigDecimal(context.get(4));
this.SAFEMiddleRate = new BigDecimal(context.get(5));
this.bankConvertRate = new BigDecimal(context.get(6));
this.dateTime = context.get(7) + " " + context.get(8);
} /**
* 模拟请求url,返回html源码
* @author PwenLee
* @param url
* @return
*/
private static String GetHtml(String url) {
String html = null;
HttpClient httpClient = new DefaultHttpClient();
httpClient.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 20000);
HttpGet httpGet = new HttpGet(url);
try {
HttpResponse httpResponse = httpClient.execute(httpGet);
int resStatu = httpResponse.getStatusLine().getStatusCode();
if (resStatu == HttpStatus.SC_OK) {
HttpEntity entity = httpResponse.getEntity();
if (entity != null) {
html = EntityUtils.toString(entity, "utf-8");
}
}
} catch (Exception e) {
//TODO 打成logger
System.out.println("Connect " + url + " error");
e.printStackTrace();
} finally {
httpClient.getConnectionManager().shutdown();
}
return html;
} private List<String> getExchangeRate(String date, String time, BankOfChinaCurrencyCode currencyCode){ Integer totalPage = totalPage(date, time, currencyCode);
List<String> contextList = new ArrayList<String>();
if(totalPage <= 0){
//TODO logger
return contextList;
} String context = "";
for(int i=totalPage;i>=0;i--){
String url = "http://srh.bankofchina.com/search/whpj/search.jsp?erectDate="+date+"&nothing="+date+"&pjname="+currencyCode.getCode()+"&page="+i;
String html = GetHtml(url);
Document doc = Jsoup.parse(html);
Elements linkElements = doc.getElementsByClass("BOC_main");
Elements datas = linkElements.get(0).getElementsByTag("tr");
for (Element ele : datas) {
if(ele.text().indexOf(time) != -1){
context = ele.text();
break;
}
}
if(context != ""){ //TODO 换成StringUtils.isNotBlank
break;
}
} if(context == "") {//TODO 换成StringUtils.isBlank
//TODO logger
return contextList;
}else{
contextList = Arrays.asList(context.split(" "));
}
return contextList;
} public static Integer totalPage(){
Integer totalPage = 0;
try{
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
Date date=new Date();
String nowDate=sdf.format(date);
String url = "http://srh.bankofchina.com/search/whpj/search.jsp?erectDate="+nowDate+"&nothing="+nowDate+"&pjname="+BankOfChinaCurrencyCode.USD.getCode();
String html = GetHtml(url);
//截取网页总条数变量
String stringTemp = html.substring(html.indexOf("m_nRecordCount = "));
//获取变量的值
String totalcount = stringTemp.substring(stringTemp.indexOf("m_nRecordCount = ")+"m_nRecordCount = ".length(),stringTemp.indexOf(";"));
Integer totalnum = Integer.valueOf(totalcount);
if(totalnum % DEAFULT_PAGESIZE == 0){
totalPage = totalnum/DEAFULT_PAGESIZE;
}else{
totalPage = totalnum/DEAFULT_PAGESIZE+1;
}
}catch(Exception e){
//TODO 打成logger
}
return totalPage;
} public static Integer totalPage(String date, String time, BankOfChinaCurrencyCode currencyCode){
Integer totalPage = 0;
try{
String url = "http://srh.bankofchina.com/search/whpj/search.jsp?erectDate="+date+"&nothing="+date+"&pjname="+currencyCode.getCode();
String html = GetHtml(url);
//截取网页总条数变量
String stringTemp = html.substring(html.indexOf("m_nRecordCount = "));
//获取变量的值
String totalcount = stringTemp.substring(stringTemp.indexOf("m_nRecordCount = ")+"m_nRecordCount = ".length(),stringTemp.indexOf(";"));
Integer totalnum = Integer.valueOf(totalcount);
if(totalnum % DEAFULT_PAGESIZE == 0){
totalPage = totalnum/DEAFULT_PAGESIZE;
}else{
totalPage = totalnum/DEAFULT_PAGESIZE+1;
}
}catch(Exception e){
//TODO 打成logger
}
return totalPage;
} @Override
public String toString() {
return "BankOfChinaExchangeRate [currency=" + currency
+ ", buyingRate=" + buyingRate + ", cashBuyingRate="
+ cashBuyingRate + ", sellingRate=" + sellingRate
+ ", cashSellingRate=" + cashSellingRate + ", SAFEMiddleRate="
+ SAFEMiddleRate + ", bankConvertRate=" + bankConvertRate
+ ", dateTime=" + dateTime + "]";
} }

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. 深入分析PHP优化及注意事项

    深入分析PHP优化及注意事项 1.尽量静态化: 如果一个方法能被静态,那就声明它为静态的,速度可提高1/4,甚至我测试的时候,这个提高了近三倍. 当然了,这个测试方法需要在十万级以上次执行,效果才明显 ...

  2. python发邮件实现Redis通知功能

    # -*- coding:utf-8 -*- import smtplib #import os from email.mime.text import MIMEText from email.mim ...

  3. C# 关于DataGridView 绑定数据源时列名窜位置 的处理

    只需要写一句话:dataGridView1.AutoGenerateColumns = false; 代码提示中的解释:获取或设置一个值,该值指示在设置System.Windows.Forms.Dat ...

  4. 中国大学MOOC-陈越、何钦铭-数据结构-2016秋期末考试

    判断题: 1-1 N2logN和NlogN2具有相同的增长速度. (2分) 1-2 对一棵平衡二叉树,所有非叶结点的平衡因子都是0,当且仅当该树是完全二叉树.(2分) 1-3 无向连通图所有顶点的度之 ...

  5. Apache Lucene 4.5 发布,Java 搜索引擎

    Apache Lucene 4.5 发布了,该版本提供基于磁盘的文档值以及改进了过滤器的缓存.Lucene 4.5 的文档请看这里. Lucene 是apache软件基金会一个开放源代码的全文检索引擎 ...

  6. ListView用法总结

    前言 列表,它作为一种非常重要的显示形式,不管是在web端还是在移动平台上,都是一种非常友好的,功能强大的展现形式.在Android中,ListView就接管了这一重任.尽管在Android5.X时代 ...

  7. 用UWP实现一个和win10设置页面类似的布局

    不知道有人注意过Win10中的设置页面的布局没?那个页面会根据不同的窗口宽度来调节显示的内容,甚至来后退按钮的操作在不同的宽度也是不同的,看图: 是不是有点cool呢,这篇文章,我们就来做一个类似的布 ...

  8. dojo/_base/lang源码分析

    dojo/_base/lang模块是一个工具模块,但几乎用dojo开发的app都会用到这个模块.模块中的方法能够在某些开发场景中避免繁冗的代码,接下来我们一起看看这些工具函数的使用和原理(仅仅是原理的 ...

  9. 移动App开发需要更多的PaaS平台而不是IaaS

    时代的变迁,创业的大潮,越来越多的人关注了有点开发,越来越多的人了解了互联网服务术语:PaaS.IaaS.SaaS.BaaS等.今天大家在开发App的时候这么多复杂的云服务如何来选择呢? IaaS服务 ...

  10. WCF基础教程之开篇:创建、测试和调用WCF

    一转眼,又半个月没有更新博客了.说实话,最近确实是有点忙.不过即使再忙忙,也要抽空来学习一些东西.最近用WCF比较多,就来跟大家分享一下关于WCF的知识吧!为了让大家都能看懂,照顾一些没有学过WCF的 ...