Java网页数据采集器[中篇-数据存储]

来源:互联网 发布:h5工具是什么软件 编辑:程序博客网 时间:2024/05/16 07:15

本期概述

上期我们学习了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数据库,创建数据库 和表 (拷贝如下代码 到mysql里直接执行即可).

创建MySql数据库
#创建数据库  htmldatacollectionCREATE DATABASE htmldatacollection; #在创建表之前 我们需要使用数据库htmldatacollectionuse htmldatacollection;    #在数据库里 创建一个表 Premiership 用于存储我们收集到的数据#这里为了方便 所有字段 全部是字符串格式CREATE TABLE Premiership(Date varchar(15),HomeTeam varchar(20),AwayTeam varchar(20),Result varchar(20) ) 

 

创建好后,我们来看看数据库结构.

 

主程序代码
数据库弄好了,我们开始实施java代码, 这里简单介绍下各个类以及类所包含的方法.

DataStorage类 以及包含的 dataStore()方法 用于数据收集和存储  

DataStorage类
import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.net.URL;/** * DataStorage类 用于数据的收集和存储 * @author SoFlash - 博客园  http://www.cnblogs.com/longwu */public class DataStorage {    public void dataStore() {        // 首先用一个字符串 来装载网页链接        String strUrl = "http://www.footballresults.org/league.php?all=1&league=EngPrem";                String sqlLeagues = "";        try {            // 创建一个url对象来指向 该网站链接 括号里()装载的是该网站链接的路径            // 更多可以看看 http://wenku.baidu.com/view/8186caf4f61fb7360b4c6547.html            URL url = new URL(strUrl);            // InputStreamReader 是一个输入流读取器 用于将读取的字节转换成字符            // 更多可以看看 http://blog.sina.com.cn/s/blog_44a05959010004il.html            InputStreamReader 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+"条数据插入成功");                }            }            // 当读完数据后 记得关闭 BufferReader            br.close();            //System.out.println("共收集到" + i + "条比赛记录");// 打印出循环次数            //当数据存储完成后 打印出 收集球队记录数            System.out.println("数据存储完毕,共插入数据库"+i+"条记录");        } catch (IOException e) {            // 如果出错 抛出异常            e.printStackTrace();        }    }}

 

 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类 以及包含的 datatoMySql() 方法 用于执行SQL插入语句 将临时存储在数据结构里的数据 插入到MySql数据库中

MySql类
import java.sql.Connection;import java.sql.DriverManager;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;        //创建一个插入数据的方法    public void datatoMySql(String insertSQl) {        try {            try {                Class.forName(driver).newInstance();            } catch (Exception e) {                System.out.println("Unable to find the local driver");                e.printStackTrace();            }            //创建连接            conn = DriverManager.getConnection(url, user, password);            //创建一个 Statement 对象来将 SQL 语句发送到数据库            stmt = conn.createStatement();        } catch (SQLException e) {            e.printStackTrace();        }        try {            //执行SQL 插入语句            stmt.executeUpdate(insertSQl);        } catch (SQLException e) {            e.printStackTrace();        }        try {            //执行完 停止执行语句            stmt.close();            //执行完关闭数据库连接            conn.close();        } catch (SQLException e) {            e.printStackTrace();        }    }}

 

Main 主函数 用于数据输出

Main 主函数
/** * Main 主函数 用于数据输出 * @author SoFlash - 博客园  http://www.cnblogs.com/longwu */public class Main {    public static void main(String[] args) {         //在主函数里调用DataStorage类里的dataStore()方法        DataStorage ds = new DataStorage();        ds.dataStore();    }}


运行查看
好了,下面我们来执行下 看看结果.

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

Html页面截图-初始阶段

 

MySql数据库截图-初始阶段

 

Html页面截图-结束阶段

 

MySql数据库截图-结束阶段

一共收集到 189条记录

MySql数据库显示 189 行数据

这样,我们2011-2012英超联盟赛季的比赛战绩就全部收集并存到MySql数据库里了.  :)


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 银行卡密码忘了手机号也换了怎么办 公务卡在当当购物的刷卡单怎么办 杭州市网签提示住宅均价异常怎么办 吃鸡账号没有绑定手机就买了怎么办 微信绑定的银行卡密码错误怎么办 淘宝单张券已领取达上限怎么办 去办公室给领导送礼总有人怎么办 招行信用卡临时额度到期后怎么办 中银e令不想用了怎么办 中银e令密码忘了怎么办 银行卡预留手机号改了支付宝怎么办 手机一直收到支付验证码短信怎么办 微信绑定银行卡手机号码换了怎么办 银行卡网银登录输错密码锁了怎么办 中行信用卡主付卡的付卡怎么办停 在苏宁网购的移动空调要退货怎么办 单位发的购物卡掉了怎么办 支付宝ofo退押金后余额怎么办 e招贷分期多还了怎么办 别人用我的手机号贷款不还怎么办 电脑文件夹怎么设密码忘记了怎么办 苹果手机id有分机和主机怎么办 绝地求生号被盗了邮箱被改了怎么办 微信邮箱怎么接收不到验证码怎么办 要申请一个特定的qq邮箱号怎么办 中银e贷额度为0怎么办 中银e贷被冻结了怎么办 中国银行e贷款填错了被拒怎么办 中银e贷逾期2天怎么办 大学生助学贷款网站密码忘了怎么办 乳晕毛囊挤压捏起来有小硬节怎么办 手机版模拟人生孕妇任务卡死怎么办 百度网盘的表格没保存怎么办 爱奇艺买的会员不小心删了怎么办 多次举报和拉黑克隆不了好友怎么办 货车把货拉到货主不付钱怎么办 中国银行网银公司用户名忘了怎么办 伟星管网站查不到电水管图纸怎么办 我的耕地己确权被他人侵权怎么办 掌上川电登录密码忘记了怎么办 华为商城不小心点了确认收货怎么办