java 抓取新浪财经网上的股票数据(1)

博主通过学习正则表达式和网友分享,成功编写出抓取新浪财经股票数据的程序,主要涉及正则表达式的特殊结构,如?=。目前程序仅实现简单信息抓取,代码已封装好,可在main函数中直接调用。

经过这两天对正则表达式以及网友一些分享资料的学习,今天终于写出了抓取股票数据挖掘的程序了,虽然大部分借鉴了一位网友的思路,但是也经过自己学习消化和封装整理,尤其是正则表达式方面(?=等特殊结构,网上资料很少,我会贴出几个特殊的正则表达式结构以供后来者学习)。

其实很简单,因为现在只是简单的抓取信息,仅是开始。不多说,分享一下封装好的代码(可直接复制,然后在main函数调用就行了)

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.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.finance.sina.com.cn/corp/go.php/vMS_MarketHistory/stockid/";
/*完整链接如:http://money.finance.sina.com.cn/corp/go.php/vMS_MarketHistory/stockid/" +
"600006.phtml?year=2013&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=Pattern.compile(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;
}


欢迎大家指正!

最近才来优快云,所以代码直接贴上去的,望见谅! 





}
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值