本期概述

上一期我们学习了如何将html采集到的数据存储到MySql数据库中,这期我们来学习下如何在存储的数据中查询我们实际想看到的数据.

数据采集页面 2011-2012赛季英超球队战绩

如果是初学者 以下可能对你有帮助

  • Java如何操作MySql?

在使用java 操作MySql数据库之前 我们需要在项目文件中导入 一个jar包(mysql-connector-java-5.1.18-bin)

可以在MySql官网下载 Connector/J 5.1.18

第一次使用MySql?   请看 java连接MYSQL      

  • 如何在java项目中导入jar包?

请看这个 Eclipse下如何导入jar包

  • 如何安装MySql数据库? 

如果是初学者 想使用MySql数据库的话 可以去这里 XAMPP中文官网  下载 XAMPP 套装

XAMPP(Apache+MySQL+PHP+PERL)是一个功能强大的建 XAMPP 软件站集成软件包, 而且一键式安装, 无需修改配置文件,非常好用.

关于,如何在MySql里创建数据库,请看Java网页数据采集器实例教程[中篇-数据存储].

数据库准备好了,我们开始写java程序代码;

这期,我们主要在MySql 类里增加了一个数据查看的方法 queryMySql(),并增加了一个 DataQuery类, 包含了一些比赛结果的查询方法.

主程序代码

这里简单介绍下各个类以及包含的方法

DataCollectionAndStorage类 和里面的dataCollectAndStore() 方法 用于Html数据采集和存储

DataCollectionAndStorage类import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
/*** DataCollectionAndStorage类 用于数据的收集和存储* @author SoFlash - 博客园  http://www.cnblogs.com/longwu*/
public class DataCollectionAndStorage {/*** dataCollectAndStore()方法  用于Html数据收集和存储*/public void dataCollectAndStore() {// 首先用一个字符串 来装载网页链接String strUrl = "http://www.footballresults.org/league.php?all=1&league=EngPrem";String sqlLeagues = "";try {// 创建一个url对象来指向 该网站链接 括号里()装载的是该网站链接的路径// 更多可以看看 http://wenku.baidu.com/view/8186caf4f61fb7360b4c6547.htmlURL url = new URL(strUrl);// InputStreamReader 是一个输入流读取器 用于将读取的字节转换成字符// 更多可以看看 http://blog.sina.com.cn/s/blog_44a05959010004il.htmlInputStreamReader isr = new InputStreamReader(url.openStream(),"utf-8"); // 统一使用utf-8 编码模式// 使用 BufferedReader 来读取 InputStreamReader 转换成的字符BufferedReader br = new BufferedReader(isr);String strRead = ""; // new 一个字符串来装载 BufferedReader 读取到的内容// 定义3个正则 用于获取我们需要的数据String regularDate = "(\\d{1,2}\\.\\d{1,2}\\.\\d{4})";String regularTwoTeam = ">[^<>]*</a>";String regularResult = ">(\\d{1,2}-\\d{1,2})</TD>";//创建 GroupMethod类的对象 gMethod 方便后期调用其类里的 regularGroup方法GroupMethod gMethod = new GroupMethod();//创建DataStructure数据结构 类的对象   用于数据下面的数据存储DataStructure ds = new DataStructure();//创建MySql类的对象 用于执行MySql语句MySql ms = new MySql();int i = 0; // 定义一个i来记录循环次数 即收集到的球队比赛结果数int index = 0; // 定义一个索引 用于获取分离 2个球队的数据 因为2个球队正则是相同的// 开始读取数据 如果读到的数据不为空 则往里面读while ((strRead = br.readLine()) != null) {/*** 用于捕获日期数据*/String strGet = gMethod.regularGroup(regularDate, strRead);// 如果捕获到了符合条件的 日期数据 则打印出来if (!strGet.equals("")) {//System.out.println("Date:" + strGet);//将收集到的日期存在数据结构里ds.date = strGet;// 这里索引+1 是用于获取后期的球队数据++index; // 因为在html页面里 源代码里 球队数据是在刚好在日期之后}/*** 用于获取2个球队的数据*/strGet = gMethod.regularGroup(regularTwoTeam, strRead);if (!strGet.equals("") && index == 1) { // 索引为1的是主队数据// 通过subtring方法 分离出 主队数据strGet = strGet.substring(1, strGet.indexOf("</a>"));//System.out.println("HomeTeam:" + strGet); // 打印出主队//将收集到的主队名称 存到 数据结构里ds.homeTeam = strGet;index++; // 索引+1之后 为2了// 通过subtring方法 分离出 客队} else if (!strGet.equals("") && index == 2) { // 这里索引为2的是客队数据strGet = strGet.substring(1, strGet.indexOf("</a>"));//System.out.println("AwayTeam:" + strGet); // 打印出客队//将收集到的客队名称 存到数据结构里ds.awayTeam = strGet;index = 0;  //收集完客队名称后 需要将索引还原 用于收集下一条数据的主队名称}/*** 用于获取比赛结果*/strGet = gMethod.regularGroup(regularResult, strRead);if (!strGet.equals("")) {// 这里同样用到了substring方法 来剔除'<' 和 "</TD>" 标签 来获取我们想要的比赛结果strGet = strGet.substring(1, strGet.indexOf("</TD>"));//System.out.println("Result:" + strGet);ds.result = strGet; //将收集到的比赛结果存到数据结构里//System.out.println();//MySql插入语句sqlLeagues = "INSERT INTO Premiership values(\""+ ds.date + "\"," + "\"" + ds.homeTeam+ "\"," + "\"" + ds.awayTeam + "\","+ "\"" + ds.result + "\")";//调用MySql类的datatoMySql()方法 来执行 MySql插入语句ms.datatoMySql(sqlLeagues);i++; //每插入完一条记录 i+1;System.out.println("第"+i+"条数据插入成功");}}// 当读完数据后 记得关闭 BufferReaderbr.close();//System.out.println("共收集到" + i + "条比赛记录");// 打印出循环次数//当数据存储完成后 打印出 收集球队记录数System.out.println("数据存储完毕,共插入数据库"+i+"条记录");} catch (IOException e) {// 如果出错 抛出异常e.printStackTrace();}}
}

DataQuery类 里面有4个方法

  1. initialDataBase() 用于清空数据库里的所有比赛数据
  2. getAllTeams()    用于获取当前数据库里所有球队的名字
  3. querySpecifiedTeam()   用于查询具体球队的比赛情况 (可以查看你喜欢的球队比赛结果)
  4. queryByDate()  用于查询具体日期的比赛 (查询某一天的比赛结果)
DataQuery 类import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;
/*** DataQuery 类  用于查询数据库里的信息 包含了不同的方法* @author SoFlash - 博客园  http://www.cnblogs.com/longwu*/
public class DataQuery {/*** 用于清空数据库里比赛结果*/public void initialDataBase() {String initialSql = "delete from premiership";MySql ms = new MySql();try {//MySql类里 提供了一个 删除数据的 方法 executeUpdate()ms.datatoMySql(initialSql);System.out.println("数据库清空成功!");} catch (Exception e) {System.out.println("数据库清空失败!");}}/*** 用于 获取当前数据库里一共有多少球队 方便后期查看自己喜欢的球队比赛成绩* @return 所有的参与过比赛的球队名*/public Vector<String> getAllTeams() {//使用一个向量来 存取 从数据库中读到的值Vector<String> vecAllTeams = new Vector<String>();String allteamsSql = "select HomeTeam,AwayTeam from premiership group by HomeTeam;";ResultSet rs = null; MySql ms = new MySql();//调用 MySql类里 查看数据的方法rs = ms.queryMySql(allteamsSql);try {//如果 ResultSet数据集里的数据不为空  则获取相应的 数据 添加到 向量vecAllTeams里while (rs.next()) {if (!vecAllTeams.contains(rs.getString("HomeTeam")))vecAllTeams.add(rs.getString("HomeTeam"));else if (!vecAllTeams.contains(rs.getString("AwayTeam")))vecAllTeams.add(rs.getString("AwayTeam"));}} catch (SQLException e) {System.out.println(e.getMessage());e.printStackTrace();}//返回 取到的所有结果return vecAllTeams;}/*** 查看具体的球队比赛结果* @param league* @return 具体球队的所有比赛结果*/public Vector<String> querySpecifiedTeam(String league) {//创建一个向量 来装载 从数据库中 读到的数据Vector<String> lsMatches = new Vector<String>();String specifiedTeamSql = "select * from premiership where HomeTeam ='"+ league + "' or AwayTeam ='" + league + "'";MySql ms = new MySql();ResultSet rs = null;rs = ms.queryMySql(specifiedTeamSql);try {while (rs.next()) {lsMatches.add(rs.getString("Date"));lsMatches.add(rs.getString("HomeTeam"));lsMatches.add(rs.getString("AwayTeam"));lsMatches.add(rs.getString("Result"));}} catch (SQLException e) {e.printStackTrace();}return lsMatches;}/*** 查看 某一天的 比赛结果  * @param date* @return 某一天的所有比赛结果*/public List<String> queryByDate(String date) {//使用一个 list泛型来装载 比赛结果List<String> lsMatchesOnDate = new ArrayList<String>();String sqlDate = "SELECT * FROM premiership WHERE Date ='" + date + "'";//创建一个ResultSet数据集  用来 获取查询到的结果集ResultSet rs = null;MySql ms = new MySql();//调用 MySql 类里的 查看数据库数据的方法rs = ms.queryMySql(sqlDate);try {//如果 ResultSet数据集 不为空 while (rs.next()) {//则 从ResultSet数据集 中取出 相应的 字段值 添加到 list泛型里lsMatchesOnDate.add(rs.getString("Date"));lsMatchesOnDate.add(rs.getString("HomeTeam"));lsMatchesOnDate.add(rs.getString("AwayTeam"));lsMatchesOnDate.add(rs.getString("Result"));}} catch (SQLException e) {System.out.println(e.getMessage());e.printStackTrace();}//最后 返回 取到的所有比赛数据结果return lsMatchesOnDate;}
}

DataStructure类 一个简单的数据结构 用于收集到数据的临时性存储

DataStructure 类/*** DataStructure 类 一个简单的数据结构* @author SoFlash - 博客园  http://www.cnblogs.com/longwu*/
public class DataStructure { //定义数据字段public String homeTeam;public String awayTeam;public String date;public String result;
}

GroupMethod类 里面包含了regularGroup() 方法 用于匹配并获取 html的数据

GroupMethod 类import java.util.regex.Matcher;
import java.util.regex.Pattern;
/*** GroupMethod 类 用于匹配和抓取 html页面的数据* @author SoFlash - 博客园  http://www.cnblogs.com/longwu*/
public class GroupMethod {// 传入2个字符串参数 一个是pattern(我们使用的正则) 另一个matcher是html源代码public String regularGroup(String pattern, String matcher) {Pattern p = Pattern.compile(pattern, Pattern.CASE_INSENSITIVE);Matcher m = p.matcher(matcher);if (m.find()) { // 如果读到return m.group();// 返回捕获的数据} else {return ""; // 否则返回一个空字符串}}
}

MySql类 里面含有2个方法

  • datatoMySql() 方法 用于向数据库里插入数据
  • queryMySql() 方法 用于查看数据库里存储的数据
MySql 类import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;/*** MySql类用于实施MySql数据库操作* @author SoFlash - 博客园  http://www.cnblogs.com/longwu*/
public class MySql {// 定义MySql驱动,数据库地址,数据库用户名 密码, 执行语句和数据库连接public String driver = "com.mysql.jdbc.Driver";public String url = "jdbc:mysql://127.0.0.1:3306/htmldatacollection";public String user = "root";public String password = "root";public Statement stmt = null;public Connection conn = null;/*** 创建一个插入数据的方法  executeUpdate()* @param insertSQl*/public void datatoMySql(String insertSQl) {try {try {Class.forName(driver).newInstance();} catch (Exception e) {System.out.println("无法找到驱动器");e.printStackTrace();}// 创建连接conn = DriverManager.getConnection(url, user, password);// 创建一个 Statement 对象来将 SQL 语句发送到数据库stmt = conn.createStatement();// 执行SQL 插入语句stmt.executeUpdate(insertSQl);// 执行完 停止执行语句stmt.close();// 执行完关闭数据库连接conn.close();} catch (Exception e) {System.out.println(e.getMessage());e.printStackTrace();}}/*** 创建一个用于select查看数据的方法 executeQuery();* @param strSelect* @return ResultSet*/public ResultSet queryMySql(String strSelect) {// 创建一个数据集 用于获取查询到的行数据ResultSet rs = null;try {Class.forName(driver).newInstance();} catch (Exception e) {System.out.println("无法找到驱动器!");e.printStackTrace();}try {// 创建连接conn = DriverManager.getConnection(url, user, password);// 创建一个 Statement 对象来将 SQL 语句发送到数据库stmt = conn.createStatement();// 执行查询语句   获取ResultSet对象rs = stmt.executeQuery(strSelect);} catch (SQLException e) {System.out.println(e.getMessage());e.printStackTrace();}//返回结果集return rs;}
}

Main 主函数 用于数据输出

Main 主函数import java.util.List;
import java.util.Scanner;
import java.util.Vector;
/*** Main 主函数 用于数据的输出* @author SoFlash - 博客园  http://www.cnblogs.com/longwu*/
public class Main {public static void main(String[] args) {DataCollectionAndStorage dcs = new DataCollectionAndStorage();DataQuery dQuery = new DataQuery();while (true) {System.out.println("清空数据库-请按1");System.out.println("收集英超比赛数据-请按2");System.out.println("查看英超所有球队-请按3");System.out.println("查看具体球队比赛结果-请按4");System.out.println("查看某一天的比赛-请按5");// Scanner 文本扫描器 用于读取 用户的输入 Scanner sc = new Scanner(System.in);int intInput = sc.nextInt();if (intInput == 1) {dQuery.initialDataBase();System.out.println("---------------------------------------------");} else if (intInput == 2) {dcs.dataCollectAndStore();System.out.println("---------------------------------------------");} else if (intInput == 3) {//获取 查询到的所有球队名称Vector<String> vecAllTeams = dQuery.getAllTeams();if (vecAllTeams.size() != 0) {System.out.println("参加过比赛的球队如下:");System.out.print("-----------------------------------------------");System.out.print("-----------------------------------------------\r\n");for (int i = 0; i < vecAllTeams.size(); i++) {if (i % 7 == 0 && i != 0) {System.out.println("\r\n");}System.out.print(vecAllTeams.get(i) + "\t");}} elseSystem.out.print("数据库目前没有数据,请按2收集数据!");System.out.print("\r\n---------------------------------------------");System.out.println("-----------------------------------------------\r\n");} else if (intInput == 4) {System.out.println("请输入你要查看的球队");Scanner scLeague = new Scanner(System.in);String strLeague = scLeague.next();//获取 具体球队的比赛结果Vector<String> lsResult = dQuery.querySpecifiedTeam(strLeague);if (lsResult.size() != 0) {System.out.println("日期\t\t\t主队\t\t客队\t\t比分");for (int i = 0; i < lsResult.size(); i++) {if (i % 4 == 0 && i != 0)System.out.println();System.out.print(lsResult.get(i) + "\t\t");}} elseSystem.out.println("没有相关球队的记录或数据库没有数据!");System.out.println("\r\n---------------------------------------------------");} else if (intInput == 5) {System.out.println("请输入你要查看的比赛日期  例子格式[14.01.2012]");Scanner scDate = new Scanner(System.in);String strDate = scDate.next();//获取具体日期下的 所有比赛List<String> lsResulOnDate = dQuery.queryByDate(strDate);if (lsResulOnDate.size() != 0) {System.out.println("日期\t\t\t主队\t\t客队\t\t比分");for (int i = 0; i < lsResulOnDate.size(); i++) {if (i % 4 == 0 && i != 0)System.out.println();System.out.print(lsResulOnDate.get(i) + "\t\t");}} elseSystem.out.println("该天没有比赛 或 数据库没有数据!");System.out.println("\r\n---------------------------------------------------");}}}
}

 

运行程序

输入1 清空数据

输入2 开始收集数据 并存入数据库 - 初始阶段

开始收集数据 并存入数据库  - 结束阶段

输入3 查看所有参与过比赛的球队

输入4  再输入要查看的具体球队 这里查看的是 Swansea

输入5  再输入查看具体的日期 这里是 02.01.2012

输入1 我们测试下清空数据的效果 这里显示清空成功

输入3 查看下是否 真正在数据库中成功清空数据   结果显示 数据库目前没有数据

这样,我们的数据查询功能也做好了

原文地址:http://www.cnblogs.com/longwu/archive/2012/01/21/2328395.html

转载于:https://www.cnblogs.com/dekevin/p/3574806.html

Java网页数据采集器[下篇-数据查询]【转载】相关推荐

  1. Java网页数据采集器[续篇-远程操作]

    本期概述 上期我们学习了html页面采集后的数据查询, 但这仅仅是在本地查询数据库,如果我们想通过远程操作来进行数据的采集,存储和查询,那又该怎么做呢? 今天我们一起来学习下:如何通过本地客户端远程访 ...

  2. Java网页数据采集器[上篇-数据采集]

    开篇 作为全球运用最广泛的语言,Java 凭借它的高效性,可移植性(跨平台),代码的健壮性以及强大的可扩展性,深受广大应用程序开发者的喜爱. 作为一门强大的开发语言,正则表达式在其中的应用当然是必不可 ...

  3. Java网页数据采集器[初篇-数据采集]

    开篇 作为全球运用最广泛的语言,Java 凭借它的高效性,可移植性(跨平台),代码的健壮性以及强大的可扩展性,深受广大应用程序开发者的喜爱. 作为一门强大的开发语言,正则表达式在其中的应用当然是必不可 ...

  4. java 百万数据查询_JAVA技巧:Java中的大量数据查询

    解决方案一:直接使用ResultSet来处理 从ResultSet中将查询结果读入collection,缓存在HttpSession或有状态bean中,翻页的时候从缓存中取出一页数据显示.这种方法有两 ...

  5. java在网页填写集数据,java网页数据采集(中篇-数据存储)

    上期我们学习了html页面的数据采集,为了方便我们今后来调用收集到的数据,首先我们需要学习下如何将这些采集到的数据存储起来(MySql数据库). 打开MySql数据库,创建数据库 和表 (拷贝如下代码 ...

  6. java 网页应用 原理_【转载】Web应用工作原理

    问题描述: Web应用工作原理 问题解决: 前言 什么是web应用程序?web应用程序又是如何进行工作的呢?什么是动态网页技术?又有 哪些动态网页技术呢?这次这篇文章需要探求总结的. Web应用 我们 ...

  7. Java代码调用聚合数据---查询全国车辆违章接口返回违章结果

    1.注册聚合数据账号,完成认证,申请数据接口 打开https://www.juhe.cn/,点击最右侧的注册 输入自己的信息注册就行了 注册完成后,认证一下,公司认证或者个人认证都可以,但是调用全国车 ...

  8. java网页数据采集器

    使用正则表达式进行采集html页面 利用java自身的HtmlParser http://www.cnblogs.com/longwu/archive/2012/01/03/2310588.html

  9. Java抓取网页数据(原网页+Javascript返回数据)

    转载请注明出处! 原文链接:http://blog.csdn.net/zgyulongfei/article/details/7909006 有时候因为种种原因,我们须要採集某个站点的数据,但因为不同 ...

最新文章

  1. Java如何转换protobuf-net中的bcl.Decimal对象
  2. leetcood学习笔记-45-跳跃游戏二
  3. win10+Tensorflow2 + cuda +RTX 3080 +cudnn 安装
  4. 服务器虚拟化管理,几招让你快速成就你的服务器
  5. 【算法】SVM分类精度为0,结果很烂怎么办?
  6. shell printf命令:格式化输出语句
  7. java null错误事例_java – aspectJ示例中的nullpointer异常
  8. torch.cuda.is_available(),torch.cuda.device_count(),torch.cuda.get_device_name(0)
  9. UI设计灵感|信息录入表单页,告别枯燥!
  10. 支付宝支付内容 尚未完成
  11. linux shell do done,bash千万不要这样cmd | while read X Y Z; do ... done使用
  12. 适合上班族的两种兼职
  13. Http 四种请求访问代码 HttpGet HttpPost HttpPut HttpDelete
  14. 触摸屏查询软件1.8.4下载
  15. Vue删除表格中的某一行数据
  16. Gitee使用(详细idea关联git)
  17. 使用python生成正弦光栅的代码示例,包括竖直光栅,水平光栅,圆光栅
  18. python图片对比模块_使用Python的PIL模块来进行图片对比
  19. html调整背景页面的大小,css如何设置背景图片大小
  20. 关于小程序的bindscrolltolower事件失效,已解决

热门文章

  1. 系统遇到并发瓶颈时的优化方向
  2. CentOS Docker安装配置部署Golang web helloworld
  3. 2022-2028年中国微滤膜行业市场发展调研及投资前景分析报告
  4. Go 学习笔记(70)— Go 变量声明、变量初始化、值类型变量赋值、指针类型变量赋值
  5. 各bert 模型下载
  6. LeetCode简单题之三维形体的表面积
  7. 北汽蓝谷极狐阿尔法S与T
  8. DCN-2655 gre隧道 vpn 嵌入IPSec配置:
  9. setTimeout、setInterval、promise、async/await的顺序详解(多种情况,非常详细~)
  10. java中hashcode_浅谈Java中的Hash值