之前寫過2篇關于php數據采集入庫的文章:
基于PHP數據采集入庫(一):http://www.companysz.com/lichenwei/p/3872307.html
基于PHP數據采集入庫(二):http://www.companysz.com/lichenwei/p/3873281.html
《基于Java的數據采集(二)》:http://www.companysz.com/lichenwei/p/3905370.html
《基于Java數據采集入庫(三)》:http://www.companysz.com/lichenwei/p/3907007.html
《基于Java數據采集入庫(終結篇)》:http://www.companysz.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="http://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.數據輕松采集,效果如下圖:
新聞熱點
疑難解答