基于Java的数据采集(二)
在上一篇文章《基于Java的数据采集(一)》:http://www.cnblogs.com/lichenwei/p/3904715.html
提到了如何如何读取网页源代码,并通过group正则 动态抓取我们所需要的网页数据
现在来写下关于数据的存储,思路很简单,只需要在我们每次读取一个数据的时候,把数据存放在临时变量,然后插入数据库即可。
《基于Java数据采集入库(三)》:http://www.cnblogs.com/lichenwei/p/3907007.html
《基于Java数据采集入库(终结篇)》:http://www.cnblogs.com/lichenwei/p/3910492.html
先来建一个表:

DoMysql.java(数据库连接类,并提供插入数据的方法)
package com.lcw.curl; import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement; public class DoMySql { //定义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) {
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();
}
} }
GetData.java(过滤数据类)
package com.lcw.curl; import java.util.regex.Matcher;
import java.util.regex.Pattern; public class GetData { /**
*
* @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 "";
}
} }
CurlMain.java主程序类:
package com.lcw.curl; import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL; public class CurlMain { /**
* @param args
*/
public static void main(String[] args) { 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);// 从字符输入流中读取文本,缓冲各个字符,从而提供字符、数组和行的高效读取。 GetData data = new GetData();
DoMySql mySql = new DoMySql();
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 + "')";
System.out.println(sql);
mySql.datatoMySql(sql);
} }
bufferedReader.close();
System.out.println("一共收集到了" + i + "条信息");
} catch (Exception e) {
e.printStackTrace();
} } }
看下运行效果图:



下一篇文章:《基于Java的数据采集(三)》:http://www.cnblogs.com/lichenwei/p/3905370.html
基于Java的数据采集(二)的更多相关文章
- 基于Java的数据采集(一)
之前写过2篇关于PHP数据采集入库的文章: 基于PHP数据采集入库(一):http://www.cnblogs.com/lichenwei/p/3872307.html 基于PHP数据采集入库(二): ...
- 基于Java的数据采集(三)
<基于Java的数据采集(一)>:http://www.cnblogs.com/lichenwei/p/3904715.html <基于Java的数据采集(二)>:http:/ ...
- 基于Java的数据采集(终结篇)
关于写过关于JAVA采集入库的三篇文章: 基于Java数据采集入库(一):http://www.cnblogs.com/lichenwei/p/3904715.html 基于Java数据采集入库(二) ...
- 基于Java的简易表达式解析工具(二)
之前简单的介绍了这个基于Java表达式解析工具,现在把代码分享给大家,希望帮助到有需要的人们,这个分享代码中依赖了一些其他的类,这些类大家可以根据自己的情况进行导入,无非就是写字符串处理工具类,日期处 ...
- 移动开发首页业界资讯移动应用平台技术专题 输入您要搜索的内容 基于Java Socket的自定义协议,实现Android与服务器的长连接(二)
在阅读本文前需要对socket以及自定义协议有一个基本的了解,可以先查看上一篇文章<基于Java Socket的自定义协议,实现Android与服务器的长连接(一)>学习相关的基础知识点. ...
- memcached学习——常用命令+基于java客户端的3种简单实现(二)
常用命令: memcached设计的原则就是简单,所以支持的命令也不是特别多~ 1.查看memcached的状态,主要用于分析内存的使用状况.优化内存分配等 stats 查看memcached的运行状 ...
- Spring核心技术(十二)——基于Java的容器配置(二)
使用@Configuration注解 @Configuration注解是一个类级别的注解,表明该对象是用来指定Bean的定义的.@Configuration注解的类通过@Bean注解的方法来声明Bea ...
- Java设计模式(二) 工厂方法模式
本文介绍了工厂方法模式的概念,优缺点,实现方式,UML类图,并介绍了工厂方法(未)遵循的OOP原则 原创文章.同步自作者个人博客 http://www.jasongj.com/design_patte ...
- Java 验证码、二维码
Java 验证码.二维码 资源 需要: jelly-core-1.7.0.GA.jar网站: http://lychie.github.io/products.html将下载下来的 jelly ...
随机推荐
- Cocos Creator的小点
声明的时候,变量如此:但用的时候就变成了border,找了很久的问题,一直没找到啊,后来就发现命名的时候和内置的一定不要太相似否则后悔的只能是自己: cc.Class({ extends: cc.Co ...
- C++泛型编程(2)--通过排序和查找元素理解迭代器
许多C++开源库(stl,opencv,ros和blas等)都使用了大量的泛型编程的思想,如果不理解这些思想,将很难看懂代码,而<泛型编程与STL>一书对理解泛型编程思想非常的有帮助,这里 ...
- java合并单元格同时导出excel
POI进行跨行需要用到对象HSSFSheet对象,现在就当我们程序已经定义了一个HSSFSheet对象sheet. 跨第1行第1个到第2个单元格的操作为 sheet.addMergedRegion(n ...
- [转]delphi 有授权许可的字符串拷贝函数源码
一段看上去“貌不惊人”的Delphi插入汇编代码,却需要授权许可,但是与经典的同类型函数比较,确实“身手不凡”. 研究代码的目的在于借鉴,本文通过分析,并用C++重写代码进行比较,再次证明这段代码效率 ...
- 根据请求号(request ID)查找正在运行的sql
--下面的SQL可以根据Request ID找到对应的Session信息: select * from v$session where paddr in (select addr from v$pro ...
- Markdown 语法手册 - 完整版(上)
https://blog.csdn.net/witnessai1/article/details/52551362 1. 斜体和粗体 代码: *斜体*或_斜体_ **粗体** ***加粗斜体*** ~ ...
- 在 Visual Studio 2010 中配置SharpPcap
最近需要在C#下写一个抓取ARP包的程序,网上找来找去,在C#下只能用SharpPcap来做了.SharpPcap是作者把winPcap用C#重新封装而来的,详细信息见如下的链接. SharpPcap ...
- 谷歌、亚马逊相继宣布屏蔽 Flash 广告,又一个时代行将结束?【转载+整理】
原文地址 其实,如果你看一下乔布斯的传记,早在十几年以前,乔布斯就说过类似的话,他狠透了 Flash~ 据 InfoWorld 报道,谷歌已经正式宣布,在默认情况下,Chrome将不再自动播放Web页 ...
- [Python设计模式] 第11章 迪米特法则——最少知识原则
github地址:https://github.com/cheesezh/python_design_patterns 迪米特法则 迪米特法则(LoD),也叫最少知识原则,如果两个类不必彼此直接通信, ...
- OpenCV学习代码记录——人脸检测
很久之前学习过一段时间的OpenCV,当时没有做什么笔记,但是代码都还在,这里把它贴出来做个记录. 代码放在码云上,地址在这里https://gitee.com/solym/OpenCVTest/tr ...