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

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

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

    小明思考

    Just a software engineer
    posts - 124, comments - 36, trackbacks - 0, articles - 0
      BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理
    程序員的核心價(jià)值是創(chuàng)造有用的軟件。
                             ----------小明

    背景
    我有時(shí)會(huì)去特定的網(wǎng)站去下載一些資料,比如去englishpod.com去下載英語(yǔ)聽(tīng)力資料,或者去某論壇下載美女貼圖:-),但是通用的爬蟲(chóng)無(wú)法滿足需求,一來(lái)很多網(wǎng)站需要登錄才能下載,另外我也不想下載不需要的東西,只想下載特定的內(nèi)容,所以我只能寫(xiě)一些小程序來(lái)去下載。這樣的小程序?qū)懥藥讉€(gè),重復(fù)的部分很多,所以能不能寫(xiě)一個(gè)通用的平臺(tái),讓寫(xiě)類似的程序更簡(jiǎn)單?于是有了現(xiàn)在這個(gè)開(kāi)源項(xiàng)目Snaker:http://code.google.com/p/ssnaker/

    插件設(shè)計(jì)
    我的目標(biāo)之一,是讓寫(xiě)特定的爬蟲(chóng)更簡(jiǎn)單,一個(gè)想法是做成插件式的。有幾個(gè)需求:
    1. 很容易添加插件
    2. 很容易修改插件,不需要重啟程序
    3. 特定網(wǎng)站的邏輯都應(yīng)該在插件中,framework只包含通用部分。

    所以插件最好是用一種腳本語(yǔ)言來(lái)書(shū)寫(xiě)。平臺(tái)層我使用Java來(lái)開(kāi)發(fā),插件腳本我決定用javascript來(lái)編寫(xiě)。為什么用javascript?主要是受到nodejs和greasemonkey的啟發(fā),尤其是greasemonkey那種javascript插件的方式,我覺(jué)得非常不錯(cuò)。

    Java和JavaScript的互動(dòng)

    我選擇了mozilla的rhino庫(kù)來(lái)實(shí)現(xiàn)腳本的執(zhí)行。
    Java調(diào)用Javascript腳本比較簡(jiǎn)單:

    Context cx = Context.enter();
            
    try {
                Scriptable scope = cx.initStandardObjects();
     
               Script script = cx.compileString(sourceCode, engine.getName(), 1null);
                script.exec(cx, scope);
            } 
    finally {
                Context.exit();
            }

    因?yàn)閖avascript本身并沒(méi)有網(wǎng)絡(luò)下載的功能,所以我要定義一些方法,讓javascript可以調(diào)用java的方法來(lái)實(shí)現(xiàn)下載,這稱為Host object。具體的方法請(qǐng)參見(jiàn)rhino的官方文檔,我這里貼出一小段code。

    下面這個(gè)類定義了一個(gè)sleep的方法。
    Java:
    public class JsHelper extends NativeObject {
        
    public JsHelper() {
        }

        @Override
        
    public String getClassName() {
            
    return "JsHelper";
        }

        
    public void jsFunction_sleep(int millis) {
            
    try {
                Thread.sleep(millis);
            } 
    catch (InterruptedException e) {
                logger.error(
    "interrupted",e);
            }
        }
    }

    Scriptable tx = cx.newObject(scope, "JsHelper");
    scope.put("$", scope, tx);


    這樣就可以在javascript中調(diào)用了:

    $.sleep(1000);

    更多的Snaker API設(shè)計(jì)請(qǐng)參考:

    評(píng)論

    # re: Snaker開(kāi)發(fā)筆記(1)-實(shí)現(xiàn)插件  回復(fù)  更多評(píng)論   

    2012-01-20 21:36 by nkjava
    程序挺好,只是注釋寫(xiě)得不多

    # re: Snaker開(kāi)發(fā)筆記(1)-實(shí)現(xiàn)插件  回復(fù)  更多評(píng)論   

    2012-01-23 23:13 by tb
    挺好的
    主站蜘蛛池模板: 亚洲第一成年男人的天堂| 爱情岛亚洲论坛在线观看| 四虎成人免费影院网址| 一级美国片免费看| 91亚洲一区二区在线观看不卡| 毛片免费在线观看网站| 国产精品内射视频免费| 亚洲人6666成人观看| 亚洲中文字幕丝袜制服一区| 1000部啪啪未满十八勿入免费| 国产综合成人亚洲区| 亚洲一区二区三区电影| 免费人成视频x8x8入口| 真实国产乱子伦精品免费| www成人免费视频| 亚洲欧美日韩一区二区三区| 亚洲国产精品无码专区在线观看| 午夜免费福利在线| 99久热只有精品视频免费观看17| 看成年女人免费午夜视频| 亚洲视频在线观看不卡| 国产亚洲精品福利在线无卡一 | 无码人妻一区二区三区免费视频| 亚洲老熟女@TubeumTV| AV在线播放日韩亚洲欧| 在线观看成人免费视频| 91精品免费不卡在线观看| 三年片在线观看免费观看大全中国| 亚洲乱码中文论理电影| 亚洲av综合色区| 亚洲精品天堂成人片?V在线播放| 在线视频观看免费视频18| 国产精品免费AV片在线观看| 国产精品视频全国免费观看| 国产精品亚洲lv粉色| 99亚偷拍自图区亚洲| 亚洲视频一区在线播放| 亚洲AV无码乱码在线观看富二代 | 国产免费爽爽视频在线观看| 婷婷亚洲综合一区二区| 亚洲日韩国产AV无码无码精品|