基于Java的数据采集(一)
之前写过2篇关于PHP数据采集入库的文章: 基于PHP数据采集入库(一):http://www.cnblogs.com/lichenwei/p/3872307.html 基于PHP数据采集入库(二):http://www.cnblogs.com/lichenwei/p/3873281.html ? 《基于Java的数据采集(二)》:http://www.cnblogs.com/lichenwei/p/3905370.html @L_502_3@ 《基于Java数据采集入库(终结篇)》:http://www.cnblogs.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 java.util.regex.Pattern; 5 6 public class GetData { 7 8 /** 9 * 10 * @param regex 正则表达式 11 content 所要匹配的内容 12 @return 13 */ 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()打开到此 com.lcw.curl; java.io.BufferedReader; java.io.InputStreamReader; 5 java.net.URL; 6 7 8 CurlMain { 9 10 args 12 13 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= 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,1)">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,1)">43 System.out.println("客队:" + teamInfo); 44 flag = 045 46 获取比分信息 47 String scoreInfo=data.getData(scoreRegex,1)">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 } ? 数据轻松采集,效果如下图: ? (编辑:北几岛) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |