基於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 }

 

數據輕松采集,效果如下圖:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM