jsoup简单的爬取网页数据

/*** 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  打成loggerSystem.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  loggerreturn 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.isNotBlankbreak;}}if(context == "") {//TODO  换成StringUtils.isBlank//TODO  loggerreturn 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;}@Overridepublic String toString() {return "BankOfChinaExchangeRate [currency=" + currency+ ", buyingRate=" + buyingRate + ", cashBuyingRate="+ cashBuyingRate + ", sellingRate=" + sellingRate+ ", cashSellingRate=" + cashSellingRate + ", SAFEMiddleRate="+ SAFEMiddleRate + ", bankConvertRate=" + bankConvertRate+ ", dateTime=" + dateTime + "]";}}
View Code

 

转载于:https://www.cnblogs.com/pwenlee/p/5704010.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/430347.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

sql每个月每个人的花销占比_11月:每个认真生活的人,都值得被认真对待

恍然已11月&#xff0c;风吹枯叶落&#xff0c;落叶生肥土&#xff0c;肥土滋养着果实&#xff0c;果实缓慢而坚定着成长。图片&#xff5c;东海青 摄图片&#xff5c;子夜鸟 摄11月&#xff0c;不要怂这是属木芙蓉的晚秋。花朵娇嫩&#xff0c;它却无所忌惮地美丽着&#xff0…

比较TFS与SVN,你必须知道的10点区别

相比SVN&#xff0c;对于TFS的优点我有以下几点看法&#xff0c;供大家参考&#xff1a; 1. 总体比较&#xff1a; TFS是一个应用软件生命周期管理&#xff08;ALM&#xff09;软件&#xff0c;是一个软件研发平台产品&#xff0c;其功能覆盖了软件研发过程中的所有环节&#…

react textarea 空格为什么不换行_你需要的 React + TypeScript 50 条规范和经验

这篇文章没有对错之分&#xff0c;肯定也有不完善的地方&#xff0c;结合了自己日常开发和经验。可以让你书写代码更具严谨性,希望看完之后有所帮助。本文字数4000 &#xff0c;看完本文大概需半小时。1. 注释(1) 文件顶部的注释&#xff0c;包括描述、作者、日期/** * descrip…

Three.js基础探寻二——正交投影照相机

本篇主要介绍照相机中的正交投影照相机。   第一篇传送门&#xff1a;Three.js基础探寻一 1.照相机 图形学中的照相机定义了三维空间到二维屏幕的投影方式。 针对投影方式照相机分为正交投影照相机和透视投影照相机。 2.两种相机的区别与适用范围 正交投影&#xff1a; 透视投…

centos删除文件夹_等保测评主机安全之centos密码长度

密码长度&#xff0c;作为等级保护主机测评项里中密码复杂度要求之一&#xff0c;是必须要查的。在《等级测评师初级教程》里&#xff0c;对于密码长度的设置指向了/etc/login.defs里的PASS_MIN_LEN字段。# PASS_MIN_LEN Minimum acceptable password length.PASS_MIN_LEN …

Activity的四种启动模式-图文并茂

1、对于使用standard 模式的活动&#xff0c;系统不会在乎这个活动是否已经在返回栈中存在&#xff0c;每次启动都会创建该活动的一个新的实例。例如A启动A&#xff0c;A再接着启动A&#xff0c;A继续启动A&#xff0c;然后再分别出栈&#xff0c;如图所示2、当活动的启动模式指…

ajax如何提交多表单的值_25 HTML5表单基本控件(二)

成长是一辈子的事儿&#xff01;大家好&#xff01;我是时问新。分享前端、Python等技术&#xff0c;以及个人成长路上的那些事儿。密码框使用标签&#xff0c;把标签上的type属性的值&#xff0c;设置为"password"&#xff0c;就可以创建密码框。密码框和单行文本框…

android_studio上传svn的时候那些不提交

buid文件夹不需要提交 转载于:https://www.cnblogs.com/YangBinChina/p/5708510.html

python语音分割_用7行Python代码构建自己的有声读物

点击关注我哦欢迎关注 “小白玩转Python”&#xff0c;发现更多 “有趣”有声读物是我们可以通过音频听取一本书或者其他作品的内容&#xff0c;是现下一种很受欢迎的阅读方式。类似的APP有&#xff1a;喜马拉雅、得到和樊登读书等。但是如果你有一本pdf格式的书籍&#xff0c;…

stata生成脉冲响应图怎么导出_Stata:面板VAR模型(pvar2命令)

&#x1f308;2021年寒假Stata研讨班&#xff1a;高级计量经济学及Stata应用研讨班&#x1f449;2021空间计量研讨班&#xff1a;空间计量及Geoda、Stata、ArcGis、Matlab应用PVAR这个程序最初是由Inessa Love编写的。它允许用户估计面板向量自回归和产生方差分解和脉冲响应函数…

一台电脑同时启动多个java_如何在一台同时登录多个微信?

点击上方蓝字关注我相信大家对手机上的微信双开并不陌生&#xff0c;很多人由于工作需要&#xff0c;需要多开一个甚至多个微信。对于安卓手机来说&#xff0c;双开微信并不是什么难事。现在大部分国产安卓手机都自带微信双开功能(一般在设置里面搜索“分身”或者“双开”就能找…

利用Python进行数据分析(1) 简单介绍

一、处理数据的基本内容 数据分析 是指对数据进行控制、处理、整理、分析的过程。 在这里&#xff0c;“数据”是指结构化的数据&#xff0c;例如&#xff1a;记录、多维数组、Excel 里的数据、关系型数据库中的数据、数据表等。 二、说说 Python 这门语言 Python 是现在最受…

grep, egrep, fgrep笔记

grep, egrep, fgrep grep: 根据模式搜索文本&#xff0c;并将符合模式的文本行显示出来。Pattern: 文本字符和正则表达式的元字符组合而成匹配条件grep [options] PATTERN [FILE...] -i&#xff1a;不区分大小写 --color -v: 显示没有被模式匹配到的行 -o&#…

ArcGIS for Desktop入门教程_第八章_Desktop学习资源 - ArcGIS知乎-新一代ArcGIS问答社区...

ArcGIS for Desktop入门教程_第八章_Desktop学习资源 - ArcGIS知乎-新一代ArcGIS问答社区 原文:ArcGIS for Desktop入门教程_第八章_Desktop学习资源 - ArcGIS知乎-新一代ArcGIS问答社区1 学习资源用户在学习和应用过程中&#xff0c;可以参考的资源如下&#xff1a;1. ArcGIS资…

amd sata controller下载_AMD发布全新锐龙芯片组驱动:告别卡死、报错

AMD今天发布了全新的锐龙平台芯片组驱动&#xff0c;版本号2.04.04.111&#xff0c;从界面到功能都全面升级&#xff0c;并修复了此前存在的多个严重Bug。新驱动重新设计了安装界面&#xff0c;借鉴了Radeon Adrenalin 2020肾上腺素显卡驱动的诸多元素&#xff0c;更加时尚美观…

mysql数据库基础的简单操作指南

最近在学习mysql,本文是做的关于mysql学习的笔记&#xff0c;跟大家分享一下&#xff0c;希望对大家学习mysql知识有所助益。mysql现在几乎已经成了网站建设的主流数据库&#xff0c;很多php网站系统都采用了mysql数据库。比mssql最大的优势在于开源&#xff0c;免费。希望与大…

kill 进程_结束进程,查看后台进程

有一些进程想要结束怎么办呢&#xff1f;进程的优先是怎样的呢?如何查看后台正在运行的进程呢&#xff1f;下面我就来讲讲给进程发送信号(kill -l列出所有支持的信号)[rootqianfeng ~]# kill -l 编号 信号名1) SIGHUP 重新加载配置2) SIGINT 键盘中断CtrlC3) SIGQUIT 键盘退出…

软碟通

转载于:https://www.cnblogs.com/jcfxl/p/5739741.html

controller调用controller的方法_SpringCloud(5):Feign整合Ribbon和Hystrix来进行远程调用与服务熔断...

Feign前面我们虽然使用了Ribbon和Hystrix进行了负载均衡和服务熔断&#xff0c;但是我们的消费方代码中由于要调用提供方的服务&#xff0c;比如&#xff1a;String user this.restTemplate.getForObject("http://service-provider/user/" id, String.class);使用了…

vba excel 退出编辑状态_VBA小常识(15)—Application对象

VBA小常识&#xff08;15&#xff09;—Application对象学习自杨洋老师《全民一起学VBA》Application是位于最顶端的对象&#xff0c;代表excel程序本身&#xff0c;所有对象都属于它。1. application.cells当前处于激活状态的工作表&#xff0c;即“活动工作表”的单元格。此时…