Java打造简易股指跟踪系统(2)

Java打造简易股指跟踪系统(2)

上一篇中我们说到了,如何使用 HttpClient 抓取所需要的数据,接下来介绍一下如何对这些数据进行处理。基本的处理原理是使用正则表达式进行内容的匹配。

为了便于处理,我们首先把使用 HttpClient 抓取到的数据做一些简单的处理。

第一步要做的就是删除回车符,当然我不会写含有回车符的正则表达式才会这么写的,当然如果您有更好的方法也可以不用这么做。

代码很简单:

1 protected  String removeEnter(String response)  {
2    response = StringUtils.replace(response, "\r\n""");
3    response = StringUtils.replace(response, "\n""");
4    return response;
5}

接下来就可以使用正则表达式来对所抓取的内容进行匹配了:

正则表达式是一种可以用于模式匹配和替换的强有力的工具,一个正则表达式就是由普通的字符(例如字符 a 到 z)以及特殊字符(称为元字符)组成的文字模式,它描述在查找文字主体时待匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。正则表达式在字符数据处理中起着非常重要的作用,我们可以用正则表达式完成大部分的数据分析处理工作,如:判断一个串是否是数字、是否是有效的Email地址,从海量的文字资料中提取有价值的数据等等,如果不使用正则表达式,那么实现的程序可能会很长,并且容易出错。对这点本人深有体会,面对大量工具书电子档资料的整理工作,如果不懂得应用正则表达式来处理,那么将是很痛苦的一件事情,反之则将可以轻松地完成,获得事半功倍的效果。

在这里,我使用了 Jakarta-ORO 作为正则表达式工具来进行匹配。

Jakarta-ORO是最全面以及优化得最好的正则表达式API之一,Jakarta-ORO库以前叫做OROMatcher,是由Daniel F. Savarese编写,后来他将其赠与Jakarta Project,读者可在jakarta.apache.org的网站下载该API包。
因为在这里我们不需要用到太多正则表达式的知识,仅仅是简单的用用而已,所以几行简单的代码就可以解决问题:
protected  String match(String response, String template,  int  index)  {
    Perl5Util engine 
= new Perl5Util();
    String name 
= null;
    
if (response != null{
        
if (engine.match(template, response)) {
            name 
= engine.group(index);
        }

    }

    
return name;
}

第一个参数 response 表示抓取到的页面源码,第二个参数 template 表示我们预先设定的模板,第三个表示第几个匹配。返回的结果是匹配成功的 group 中的内容。

于是我们可以这样的调用它:

String template  =   " /(沪综指)</font></b></a> <span id=\ " STK1\ " >(\\d{4,5}\\.\\d{1,4})</span> " ;
String name 
=   match(response, template,  1 );
String index 
=   match(response, template,  2 );

注意一下,我们正则表达式前后都有 "/"。
另外,我们用() 括起来的部分表示我们要匹配的内容,所以这里 name 可以匹配到 沪综指,index 可以匹配到大盘的点数。 

该匹配对应于: http://web7.jrj.com/homev1/StockIndex.htm
为了防止页面以后打不开了大家找不到,我把其中相关的匹配部分的页面源码也发出来:

< href =javascript:ShowImg('000001',2)  target =_self >< b >< font  color =#000000 > 沪综指 </ font ></ b ></ a >   < span  id ="STK1" > 3914.20 </ span >   < span  id ="STK2"  class ="c1" >< img  src =/HomeV1/images/down.gif  width =8  height =8 > 164.40 </ span >   < href =javascript:ShowImg('399001',1)  target =_self >< b >< font  color =#000000 > 深成指 </ font ></ b ></ a >   < span  id ="STK3" > 12882.17 </ span >   < span  id ="STK4"  class ="c1" >< img  src =/HomeV1/images/down.gif  width =8  height =8 > 701.53 </ span >   < href =javascript:ShowImg('399300',1)  target =_self >< b >< font  color =#000000 > 沪深300 </ font ></ b ></ a >   < span  id ="STK5" > 3858.52 </ span >   < span  id ="STK6"  class ="c1" >< img  src =/HomeV1/images/down.gif  width =8  height =8 > 181.96 </ span >   < b > 香港恒生 </ b >   < span  id ="STK7" > 21938.22 </ span >   < span  id ="STK8"  class ="c3" >< img  src =/HomeV1/images/up.gif  width =8  height =8 > 232.66 </ span >   < b > 道琼斯 </ b >   < span  id ="STK9" > 13414.48 </ span >   < span  id ="STK10"  class ="c1" >< img  src =/HomeV1/images/down.gif  width =8  height =8 > 13.25 </ span >   < b > 纳斯达克 </ b >   < span  id ="STK11" > 2612.02 </ span >   < span  id ="STK12"  class ="c3" >< img  src =/HomeV1/images/up.gif  width =8  height =8 > 6.67 </ span >  
< div  id ="indexdata" >< object  id ="STKData"  width ="0"  height ="0"  classid ="CLSID:333C7BC4-460F-11D0-BC04-0080C7055A83"  viewastext >< param  name ="FieldDelim"  value ="F" >< param  name ="DataURL"  value ="/HomeV1/text/StockIndex.htm" >< param  name ="UseHeader"  value ="true" ></ object >< input  type ="hidden"  id ="STKValue"  datasrc ="#STKData"  datafld ="a"  name ="STKValue" ></ div >

因为我不是为了介绍正则表达式而写这篇文章的,所以对正则表达式不会做太多的介绍,如果大家对正则表达式有兴趣或想进一步了解的话可以参考:

JAVA中正则表达式的应用
http://www.ibm.com/developerworks/cn/java/l-regp/part1/index.html
http://www.ibm.com/developerworks/cn/java/l-regp/part2/index.html


另外因为为了抓取其他东西,代码已经被我改的面目全非了,暂时就不方便贴出来了,请大家谅解,如果大家有什么疑问的话可以和我联系,我会尽量说明清楚的。

你可能感兴趣的:(Java打造简易股指跟踪系统(2))