首页 > 学院 > 开发设计 > 正文

基于Java的数据采集(一)

2019-11-14 20:50:19
字体:
来源:转载
供稿:网友
基于java的数据采集(一)

之前写过2篇关于php数据采集入库的文章:

基于PHP数据采集入库(一):http://www.VEVb.com/lichenwei/p/3872307.html

基于PHP数据采集入库(二):http://www.VEVb.com/lichenwei/p/3873281.html

《基于Java的数据采集(二)》:http://www.VEVb.com/lichenwei/p/3905370.html

《基于Java数据采集入库(三)》:http://www.VEVb.com/lichenwei/p/3907007.html

《基于Java数据采集入库(终结篇)》:http://www.VEVb.com/lichenwei/p/3910492.html

其实采集的原理都是一样的:远程获取信息->提取所需内容(正则)->分类存储->读取->展示

用什么编程语言没所谓,编程语言只是种工具

这次来采集一个足球网站的数据:http://www.footballresults.org/league.php?league=EngDiv1

下图是我们要采集的数据:

好了,关于采集原理就看上面那2篇文章吧,剩下的直接上代码:

GerData.java(采集数据方法封装)

其实也就是简单的匹配正则:

group():返回在以前匹配操作期间由给定组捕获的输入子序列。

find():尝试查找与该模式匹配的输入序列的下一个子序列。

 1 package com.lcw.curl;
 2  3 import java.util.regex.Matcher; 4 import java.util.regex.Pattern; 5  6 public class GetData { 7      8     /** 9      * 10      * @param regex 正则表达式11      * @param content 所要匹配的内容12      * @return13      */14     public String getData(String regex,String content){15         Pattern pattern=Pattern.compile(regex, Pattern.CASE_INSENSITIVE);//设定正则表达式,不区分大小写16         Matcher matcher=pattern.matcher(content);17         if(matcher.find()){18             return matcher.group();19         }else{20             return "";21         }22     }23 24 }

CurlMain.java(主程序)

InputStreamReader()是字节流通向字符流的桥梁。

InputStreamReader()是字节流通向字符流的桥梁。

openStream()打开到此URL的连接并返回一个用于从该连接读入的字节流。

 1 package com.lcw.curl; 2  3 import java.io.BufferedReader; 4 import java.io.InputStreamReader; 5 import java.net.URL; 6  7  8 public class CurlMain { 9 10     /**11      * @param args12      */13     public static void main(String[] args) {14         try {15             String address="http://www.footballresults.org/league.php?league=EngDiv1";16             URL url=new URL(address);17             InputStreamReader inputStreamReader=new InputStreamReader(url.openStream(),"utf-8");//打开地址,以UTF-8编码的形式返回字节并转为字符18             BufferedReader bufferedReader=new BufferedReader(inputStreamReader);//从字符输入流中读取文本,缓冲各个字符,从而提供字符、数组和行的高效读取。19             20             GetData data=new GetData();21             String content="";//用来接受每次读取的行字符22             int flag=0;//标志,队伍信息刚好在日期信息后面,则正则相同,用于分离数据23             String dateRegex="//d{1,2}//.//d{1,2}//.//d{4}";//日期匹配正则表达式24             String teamRegex=">[^<>]*</a>";//队伍匹配正则表达式25             String scoreRegex=">(//d{1,2}-//d{1,2})</TD>";//比分正则表达式26             int i=0;//记录信息条数27             28             while((content=bufferedReader.readLine())!=null){//每次读取一行数据29                 //获取比赛日期信息30                 String dateInfo=data.getData(dateRegex, content);31                 if(!dateInfo.equals("")){32                     System.out.PRintln("日期:"+dateInfo);33                     flag++;34                 }35                 //获取队伍信息,需先读到日期信息让标志符自增36                 String teamInfo=data.getData(teamRegex, content);37                 if(!teamInfo.equals("")&&flag==1){38                     teamInfo=teamInfo.substring(1, teamInfo.indexOf("</a>"));39                     System.out.println("主队:"+teamInfo);40                     flag++;41                 }else if (!teamInfo.equals("") && flag == 2) {  42                     teamInfo = teamInfo.substring(1, teamInfo.indexOf("</a>"));43                     System.out.println("客队:" + teamInfo);  44                     flag = 0;45                 }46                 //获取比分信息47                 String scoreInfo=data.getData(scoreRegex, content);48                 if(!scoreInfo.equals("")){49                     scoreInfo=scoreInfo.substring(1, scoreInfo.indexOf("</TD>"));50                     System.out.println("比分:"+scoreInfo);51                     System.out.println();52                     i++;53                 }54                 55             }56             bufferedReader.close();57             System.out.println("一共收集到了"+i+"条信息");58         } catch (Exception e) {59             e.printStackTrace();60         }61         62     }63     64 65 }

数据轻松采集,效果如下图:


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表