zoukankan      html  css  js  c++  java
  • 基于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

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

    《基于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 import java.util.regex.Pattern;
     5 
     6 public class GetData {
     7     
     8     /**
     9      * 
    10      * @param regex 正则表达式
    11      * @param 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()打开到此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 args
    12      */
    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 }

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

  • 相关阅读:
    结对编程项目---四则运算
    作业三(代码规范、代码复审、PSP)
    作业2(源程序管理软件与项目管理软件)
    学习总结
    作业1
    寒假超市实习
    《软件工程》课程总结
    结对编程项目---四则运算
    作业三: 代码规范、代码复审、PSP
    作业二(2)目前流行的源程序版本管理软件和项目管理软件都有哪些,各有什么优缺点?
  • 原文地址:https://www.cnblogs.com/lichenwei/p/3904715.html
Copyright © 2011-2022 走看看