经过这两天对正则表达式以及网友一些分享资料的学习,今天终于写出了抓取股票数据挖掘的程序了,虽然大部分借鉴了一位网友的思路,但是也经过自己学习消化和封装整理,尤其是正则表达式方面(?=等特殊结构,网上资料很少,我会贴出几个特殊的正则表达式结构以供后来者学习)。
其实很简单,因为现在只是简单的抓取信息,仅是开始。不多说,分享一下封装好的代码(可直接复制,然后在main函数调用就行了)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import .MalformedURLException;
import .URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 抓取网络数据的类
* 数据位 : 日期、开、高、收、低、交易量(交易金额)
* @author Administrator
*
*/
public class StockDataMining {
private static String myStr="http://money./corp/go.php/vMS_MarketHistory/stockid/";
/*完整链接如:http://money./corp/go.php/vMS_MarketHistory/stockid/" +
"600006.phtml?year=&jidu=4";*/
/**
* 根据url从新浪财经上获取股票数据
* @param
* @param code 股票代码
* @param year 年份
* @param jidu 季度(1、2、3、4)
* @return null,如果异常发生。否则返回一个arraylist ,其中每个元素为一个hashmap———里面的值从1~7分别为 :日期、开、高、收、低、交易量、交易金额
* @throws MalformedURLException
*/
public List<HashMap<Integer, Object>> getStockData(String code,String year,String jidu){
try {
//拼接完整url
String tempStr=myStr+code+".phtml?year="+year+"&jidu="+jidu;
URL url=new URL(tempStr);
BufferedReader reader=null;
///创建输入流
reader=new BufferedReader(new InputStreamReader(url.openStream()));
///创建list存储器
List<HashMap<Integer,Object>> list=new ArrayList<HashMap<Integer,Object>>();
//创建hashmap存储每一行具体数据
HashMap<Integer, Object> hashMap=new HashMap<Integer, Object>();
//创建获取数据的pattern正则表达式
String regex="(?<=(date=)).*?(?=('>))|(?<=(\"center\">))\\d{1}.*?(?=(</div>))";
Pattern dataPattern=pile(regex);
///匹配读取内容,并存入list里面
int i=0;
String str;
while((str=reader.readLine())!= null){
//获得这一行匹配的数据
Matcher matcher=dataPattern.matcher(str);
//存入hashMap里面
while(matcher.find()){
i++;
hashMap.put(Integer.valueOf(i), matcher.group());
///左对齐输出
///System.out.printf("%-22s", matcher.group());
}
if(7==i){
//每七个数据算一行,此时把该行数据存入list并且重置i,与hashMap
list.add(hashMap);
i=0;
hashMap=new HashMap<Integer, Object>();
///换行
///System.out.println();
}
}//end of while
return list;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
欢迎大家指正!
最近才来CSDN,所以代码直接贴上去的,望见谅!
}