<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆 - 170  文章 - 536  trackbacks - 0
    <2007年7月>
    24252627282930
    1234567
    891011121314
    15161718192021
    22232425262728
    2930311234

    常用鏈接

    我參與的團隊

    隨筆分類(103)

    搜索

    •  

    積分與排名

    • 積分 - 414008
    • 排名 - 135

    最新評論

    閱讀排行榜

    上一篇中我們說到了,如何使用 HttpClient 抓取所需要的數據,接下來介紹一下如何對這些數據進行處理。基本的處理原理是使用正則表達式進行內容的匹配。

    為了便于處理,我們首先把使用 HttpClient 抓取到的數據做一些簡單的處理。

    第一步要做的就是刪除回車符,當然我不會寫含有回車符的正則表達式才會這么寫的,當然如果您有更好的方法也可以不用這么做。

    代碼很簡單:

    1protected 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


    另外因為為了抓取其他東西,代碼已經被我改的面目全非了,暫時就不方便貼出來了,請大家諒解,如果大家有什么疑問的話可以和我聯系,我會盡量說明清楚的。
    posted on 2007-06-28 22:58 steady 閱讀(1783) 評論(2)  編輯  收藏 所屬分類: 技術隨筆

    FeedBack:
    # re: Java打造簡易股指跟蹤系統(2) 2007-07-04 16:36 寒江
    剩下的只有定時抓取HTML源碼,然后使用正則匹配數據。復雜的通過htmlparser解析HTML,簡單的可以通過正則過濾HTML標簽 (\s*</?(\w+)(>|[^r][^>]*>)\s*)+|(&nbsp;)+|(\s)+ ,然后在進行數據提取工作

    定時可以簡單的在while(true)里放個Thread.currentThread().sleep(millis),而不必使用quartz 。

    不過老大寫出來沒幾天 ,印花稅就漲了。。。
    感覺老大還是很會理財的

    ORO木大用過,似乎靜態的 java.util.regex.Pattern 變量更適合提升程序性能  回復  更多評論
      
    # re: Java打造簡易股指跟蹤系統(2) 2007-07-05 00:21 steady
    @寒江
    我一般是 sleep(60000),也就是 60 秒。  回復  更多評論
      
    主站蜘蛛池模板: 亚洲成aⅴ人在线观看| 九月丁香婷婷亚洲综合色| 亚洲日韩中文字幕| 四虎成人精品永久免费AV| 亚洲av福利无码无一区二区 | 国产又黄又爽又猛的免费视频播放 | 亚洲精品高清国产一线久久| 久久夜色精品国产噜噜噜亚洲AV| 免费观看一区二区三区| 国产亚洲AV无码AV男人的天堂| 中文字幕免费在线看电影大全 | 国产啪精品视频网站免费尤物 | 国产亚洲精品国产| 三年片在线观看免费大全电影| 亚洲综合久久综合激情久久| 91精品视频在线免费观看| 亚洲国产成人综合| 国产大片91精品免费看3| 一本到卡二卡三卡免费高| 亚洲国产另类久久久精品黑人| 午夜免费啪视频在线观看| 亚洲日韩乱码中文无码蜜桃臀| 精品免费久久久久久成人影院| 美女被羞羞网站免费下载| 亚洲熟妇无码八AV在线播放| 91香蕉国产线在线观看免费| 亚洲日韩国产欧美一区二区三区| 日韩免费无码一区二区三区| 亚洲一级高清在线中文字幕| 四虎影视在线永久免费看黄 | 三年片免费高清版| 亚洲一区二区中文| 在线观看成人免费| 中国极品美軳免费观看| 亚洲五月综合缴情婷婷| 亚洲AV无码乱码在线观看性色扶 | 无码人妻丰满熟妇区免费| 2020久久精品亚洲热综合一本| 亚洲人成网站色在线入口| 久久99国产乱子伦精品免费| 国产亚洲人成在线播放|