基于Java的数据采集(三)
《基于Java的数据采集(一)》:http://www.cnblogs.com/lichenwei/p/3904715.html
《基于Java的数据采集(二)》:http://www.cnblogs.com/lichenwei/p/3905370.html
《基于Java的数据采集(终结篇)》:http://www.cnblogs.com/lichenwei/p/3910492.html
基于之前2篇Java数据采集入库,做了下功能整合,实现本地的存读取,上个效果图:



直接上代码吧,本程序只是作为"如何用JAVA抓取页面简单采集入库"的入门,在实际做采集工具的时候,还需考虑许多东西,比如当采集一个页面发生卡顿时,发生延迟时怎么办?等一系列的问题,希望这篇文字能够抛砖引玉。
先看下项目结构:
一共有五个类:
Mysql.java --数据库操作类
RegEX.java --正则匹配类
GetAllData.java --采集类
Action.java --功能实现类
FootBallMain.java --主程序类
其他的,直接结合前面2篇文章外加看代码注释吧
Mysql.java
package com.lcw.curl; import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement; /**
* 数据库操作类,一更新,一查询
* @author Balla_兔子
*
*/
public class MySql { //定义MySql驱动,数据库地址,数据库用户名 密码, 执行语句和数据库连接
public String driver = "com.mysql.jdbc.Driver";
public String url = "jdbc:mysql://127.0.0.1:3306/football";
public String user = "root";
public String password = "";
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();
}
} //创建一个查找数据的方法
public ResultSet searchMySql(String selectSQl) { ResultSet rs=null; 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 插入语句
rs=stmt.executeQuery(selectSQl);
} catch (SQLException e) {
e.printStackTrace();
} return rs;
} }
Mysql.java
RegEX.java
package com.lcw.curl; import java.util.regex.Matcher;
import java.util.regex.Pattern; public class RegEX { /**
*
* @param regex
* 正则表达式
* @param content
* 所要匹配的内容
* @return
*/
public String getData(String regex, String content) {
Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);// 设定正则表达式,不区分大小写
Matcher matcher = pattern.matcher(content);
if (matcher.find()) {
return matcher.group();//返回正则匹配结果
} else {
return "";
}
} }
RegEX.java
GetAllData.java
package com.lcw.curl; import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL; public class GetAllData { /**采集类
* @param Balla_兔子
*/
public void getAllData() { try {
String address = "http://www.footballresults.org/league.php?league=EngDiv1";
URL url = new URL(address);
InputStreamReader inputStreamReader = new InputStreamReader(url
.openStream(), "utf-8");// 打开地址,以UTF-8编码的形式返回字节并转为字符
BufferedReader bufferedReader = new BufferedReader(
inputStreamReader);// 从字符输入流中读取文本,缓冲各个字符,从而提供字符、数组和行的高效读取。 RegEX data = new RegEX();
MySql mySql = new MySql();
String content = "";// 用来接受每次读取的行字符
int flag = 0;// 标志,队伍信息刚好在日期信息后面,则正则相同,用于分离数据
String dateRegex = "\\d{1,2}\\.\\d{1,2}\\.\\d{4}";// 日期匹配正则表达式
String teamRegex = ">[^<>]*</a>";// 队伍匹配正则表达式
String scoreRegex = ">(\\d{1,2}-\\d{1,2})</TD>";// 比分正则表达式
String tempDate = "";// 存储临时比赛时间
String teama = "";// 存储临时主队
String teamb = "";// 存储临时客队
String score = "";// 存储临时比分
int i = 0;// 记录信息条数
String sql = "";// 数据库语句 while ((content = bufferedReader.readLine()) != null) {// 每次读取一行数据
// 获取比赛日期信息
String dateInfo = data.getData(dateRegex, content);
if (!dateInfo.equals("")) {
// System.out.println("日期:" + dateInfo);
tempDate = dateInfo;
flag++;
}
// 获取队伍信息,需先读到日期信息让标志符自增
String teamInfo = data.getData(teamRegex, content);
if (!teamInfo.equals("") && flag == 1) {
teama = teamInfo.substring(1, teamInfo.indexOf("</a>"));
// System.out.println("主队:" + teama);
flag++;
} else if (!teamInfo.equals("") && flag == 2) {
teamb = teamInfo.substring(1, teamInfo.indexOf("</a>"));
// System.out.println("客队:" + teamb);
flag = 0;
}
// 获取比分信息
String scoreInfo = data.getData(scoreRegex, content);
if (!scoreInfo.equals("")) {
score = scoreInfo.substring(1, scoreInfo.indexOf("</TD>"));
// System.out.println("比分:" + score);
// System.out.println();
i++;
sql = "insert into football(`date`,`teama`,`teamb`,`score`) values('"
+ tempDate
+ "','"
+ teama
+ "','"
+ teamb
+ "','"
+ score + "')";
mySql.datatoMySql(sql);
System.out.println("存储数据成功:" + i + "条");
} }
bufferedReader.close();
// System.out.println("一共收集到了" + i + "条信息");
} catch (Exception e) {
e.printStackTrace();
} } }
GetAllData.java
Action.java
package com.lcw.curl; import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector; public class Action { /**
* 操作一:初始化数据库数据
*/
public void initData() {
String sql = "delete from football";
MySql doMySql = new MySql();
try {
doMySql.datatoMySql(sql);
System.out.println("数据初始化完毕!");
} catch (Exception e) {
System.out.println("数据初始化失败!");
} } /**
* 获取所有队伍信息
*
* @return
*/
public Vector<String> getAllTeam() {
ResultSet rs = null;
Vector<String> vector = new Vector<String>();
String sql = "select teama,teamb from football";
MySql doMySql = new MySql();
rs = doMySql.searchMySql(sql); try {
while (rs.next()) {
try {
if (!vector.contains(rs.getString("teama"))) {
vector.add(rs.getString("teama"));
}
if (!vector.contains(rs.getString("teamb"))) {
vector.add(rs.getString("teamb"));
}
} catch (SQLException e) {
e.printStackTrace();
}
}
} catch (SQLException e) {
e.printStackTrace();
} return vector; } /**
* 获取具体某队的比赛信息
*
* @param team
* @return
*/
public List<String> findTeam(String team) {
List<String> list = new ArrayList<String>();
String sql = "select * from football where teama ='" + team
+ "' or teamb ='" + team + "'";
MySql mysql = new MySql();
ResultSet rs = null;
rs = mysql.searchMySql(sql);
try {
while (rs.next()) {
list.add(rs.getString("date"));
list.add(rs.getString("teama"));
list.add(rs.getString("teamb"));
list.add(rs.getString("score"));
}
} catch (SQLException e) {
e.printStackTrace();
}
return list; } public List<String> findGame(String date) {
List<String> list = new ArrayList<String>();
ResultSet rs = null;
String sql = "select * from football where date ='" + date + "'";
MySql mysql = new MySql();
rs = mysql.searchMySql(sql);
try {
while (rs.next()) {
list.add(rs.getString("date"));
list.add(rs.getString("teama"));
list.add(rs.getString("teamb"));
list.add(rs.getString("score"));
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return list;
} }
Action.java
FootBallMain.java
package com.lcw.curl; import java.util.List;
import java.util.Scanner;
import java.util.Vector; public class FootBallMain { /**主程序类
* @param Balla_兔子
*/
public static void main(String[] args) {
GetAllData allData = new GetAllData();
Action action = new Action(); while (true) {
System.out.println("①初始化数据库-请按 (1)");
System.out.println("②自动化采集数据-请按(2)");
System.out.println("③查询参赛队伍-请按(3)");
System.out.println("④查询具体球队比赛结果-请按(4)");
System.out.println("⑤查询具体某天的比赛详情-请按(5)");
Scanner scanner = new Scanner(System.in);
String input = scanner.next();
if (input.equals("1")) {
System.out.println();
action.initData();
System.out
.println("-----------------------------------------------------");
} else if (input.equals("2")) {
System.out.println("正在采集数据...请稍后");
allData.getAllData();
System.out
.println("-----------------------------------------------------");
} else if (input.equals("3")) {
Vector<String> allTeam = action.getAllTeam();
System.out.println("正在获取数据...请稍后");
if (allTeam.size() != 0) {
System.out.println("参赛队伍如下:");
for (int i = 0; i < allTeam.size(); i++) {
System.out.println(allTeam.get(i));
}
}
System.out
.println("-----------------------------------------------------");
} else if (input.equals("4")) {
System.out.println("请输入您要查询的队伍名:");
String team = scanner.next();
List<String> list = action.findTeam(team);
System.out.println("比赛日期\t\t\t主队\t\t客队\t\t\t比赛结果");
if (list.size() != 0) {
for (int i = 0; i < list.size(); i++) {
System.out.print(list.get(i) + "\t\t");
}
} else {
System.out.println("暂时没有您所提供队伍的比赛信息,敬请关注...");
}
System.out.println();
System.out
.println("-----------------------------------------------------");
} else if (input.equals("5")) {
System.out.println("请输入您要查询日期(格式如下:xx.xx.xxxx):");
String date = scanner.next();
List<String> info = action.findGame(date);
System.out.println("比赛日期\t\t\t主队\t\t客队\t\t\t比赛结果");
if (info.size() != 0) {
for (int i = 0; i < info.size(); i++) {
if (i % 4 == 0 && i != 0) {
System.out.println();
}
System.out.print(info.get(i) + "\t\t");
}
} else {
System.out.println("暂时没有您所提供的比赛信息,敬请关注...");
}
System.out.println();
System.out
.println("------------------------------------------------------------------------");
} else {
System.out.println("请输入正确的对应编号..");
System.out
.println("------------------------------------------------------------------------");
}
}
} }
FootBallMain.java
基于Java的数据采集(三)的更多相关文章
- 基于Java的数据采集(一)
之前写过2篇关于PHP数据采集入库的文章: 基于PHP数据采集入库(一):http://www.cnblogs.com/lichenwei/p/3872307.html 基于PHP数据采集入库(二): ...
- 基于Java的数据采集(二)
在上一篇文章<基于Java的数据采集(一)>:http://www.cnblogs.com/lichenwei/p/3904715.html 提到了如何如何读取网页源代码,并通过group ...
- 基于Java的数据采集(终结篇)
关于写过关于JAVA采集入库的三篇文章: 基于Java数据采集入库(一):http://www.cnblogs.com/lichenwei/p/3904715.html 基于Java数据采集入库(二) ...
- memcached学习——常用命令+基于java客户端的3种简单实现(二)
常用命令: memcached设计的原则就是简单,所以支持的命令也不是特别多~ 1.查看memcached的状态,主要用于分析内存的使用状况.优化内存分配等 stats 查看memcached的运行状 ...
- 三 基于Java动态数组手写队列
手写队列: package dataStucture2.stackandqueue; import com.lt.datastructure.MaxHeap.Queue; import dataStu ...
- 0038 Java学习笔记-多线程-传统线程间通信、Condition、阻塞队列、《疯狂Java讲义 第三版》进程间通信示例代码存在的一个问题
调用同步锁的wait().notify().notifyAll()进行线程通信 看这个经典的存取款问题,要求两个线程存款,两个线程取款,账户里有余额的时候只能取款,没余额的时候只能存款,存取款金额相同 ...
- 基于Java Netty框架构建高性能的部标808协议的GPS服务器
使用Java语言开发一个高质量和高性能的jt808 协议的GPS通信服务器,并不是一件简单容易的事情,开发出来一段程序和能够承受数十万台车载接入是两码事,除去开发部标808协议的固有复杂性和几个月长周 ...
- Java设计模式(三) 抽象工厂模式
原创文章,同步发自作者个人博客,转载请注明出处 http://www.jasongj.com/design_pattern/abstract_factory/ 抽象工厂模式解决的问题 上文<工厂 ...
- 基于java的设计模式入门(1)——为什么要学习设计模式
大年初一,楼主在这里给大家拜年,祝大家码上升职加薪,码上有对象结婚,码上有车有房,幸福安康. 过完年,回学校注册报道之后,大概就要回深圳到公司开始实习了.提高自己,无非就有两种方式,一是看书学习,二是 ...
随机推荐
- [洛谷U40581]树上统计treecnt
[洛谷U40581]树上统计treecnt 题目大意: 给定一棵\(n(n\le10^5)\)个点的树. 定义\(Tree[l,r]\)表示为了使得\(l\sim r\)号点两两连通,最少需要选择的边 ...
- SSH使用自定义私钥进行登录
ssh -i /root/.ssh/id_rsa root@192.168.1.2 -i指定了私钥文件的路径
- 关于iphone6/5/4s 在iOS8.0系统下 仅仅读@3x图片
做iphone6和plus适配时候发现一个问题,先来看图(一下讨论所有在真机下完毕,非模拟器) 128*750图片是 nav@2x.png watermark/2/text/aHR0cDovL2Js ...
- python测试开发django-49.allow_tags和mark_safe
前言 前面一篇使用allow_tags方法可以在xadmin的后台页面中插入html代码,在2.x版本ModelAdmin里面删除了allow_tags属性的支持,使用mark_safe函数代替 al ...
- 解密gzip压缩的网页数据流(转)
因为采集某个网页遇到问题,一直无法获取页面数据. 经过一番排查,发现该网站会检查客户端的Header信息,如果遇到不明确的Header信息就直接否定,返回0数据. 如果Header信息正确,就会返回经 ...
- 详解CentOS设置163的yum源的过程
转自启动CentOS系统,打开火狐浏览器,如下图所示: 2 登录“mirrors.163.com”,如下图所示: 3 点击centos后面的“centos使用帮助”,如下图所示: 4 可以看到设置和使 ...
- Excel如何固定表头,任意一行
在日常Excel操作中,有时候内容比较多,需要将表头固定才能方便查看.那么,该如何固定表头呢?或者说如何固定任意一行我们制定的呢?下面以Excel2013进行详细的步骤讲解. 首先打开需要操作的Exc ...
- IIS 之 应用程序池
IIS(Internet Information Services),由于我使用的是Windows10系统,所以本文以其内置 10.0.14393.0 版本说明. 应用程序池 → 右键(待设置应用程序 ...
- 【Linux】top命令
top命令经常用来监控linux的系统状况,比如cpu.内存的使用,程序员基本都知道这个命令,但比较奇怪的是能用好它的人却很少,例如top监控视图中内存数值的含义就有不少的曲解.本文通过一个运行中的W ...
- Nginx 介绍
Nginx 是什么 Nginx ("engine x") 是一个开源的,支持高性能.高并发的 Web 服务和代理服务软件.它是由俄罗斯人 Igor Sysoev 开发的,最初被应用 ...