<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 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

    Snaker開發筆記(1)-實現插件

    Posted on 2012-01-20 15:27 小明 閱讀(1977) 評論(2)  編輯  收藏 所屬分類: 開發日志
    程序員的核心價值是創造有用的軟件。
                             ----------小明

    背景
    我有時會去特定的網站去下載一些資料,比如去englishpod.com去下載英語聽力資料,或者去某論壇下載美女貼圖:-),但是通用的爬蟲無法滿足需求,一來很多網站需要登錄才能下載,另外我也不想下載不需要的東西,只想下載特定的內容,所以我只能寫一些小程序來去下載。這樣的小程序寫了幾個,重復的部分很多,所以能不能寫一個通用的平臺,讓寫類似的程序更簡單?于是有了現在這個開源項目Snaker:http://code.google.com/p/ssnaker/

    插件設計
    我的目標之一,是讓寫特定的爬蟲更簡單,一個想法是做成插件式的。有幾個需求:
    1. 很容易添加插件
    2. 很容易修改插件,不需要重啟程序
    3. 特定網站的邏輯都應該在插件中,framework只包含通用部分。

    所以插件最好是用一種腳本語言來書寫。平臺層我使用Java來開發,插件腳本我決定用javascript來編寫。為什么用javascript?主要是受到nodejs和greasemonkey的啟發,尤其是greasemonkey那種javascript插件的方式,我覺得非常不錯。

    Java和JavaScript的互動

    我選擇了mozilla的rhino庫來實現腳本的執行。
    Java調用Javascript腳本比較簡單:

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

    因為javascript本身并沒有網絡下載的功能,所以我要定義一些方法,讓javascript可以調用java的方法來實現下載,這稱為Host object。具體的方法請參見rhino的官方文檔,我這里貼出一小段code。

    下面這個類定義了一個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中調用了:

    $.sleep(1000);

    更多的Snaker API設計請參考:

    評論

    # re: Snaker開發筆記(1)-實現插件  回復  更多評論   

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

    # re: Snaker開發筆記(1)-實現插件  回復  更多評論   

    2012-01-23 23:13 by tb
    挺好的
    主站蜘蛛池模板: 宅男666在线永久免费观看| 91精品视频免费| 中文字幕一精品亚洲无线一区| 亚洲欧美自偷自拍另类视 | 91视频免费网站| 亚洲午夜国产精品无码老牛影视| 日日摸夜夜添夜夜免费视频| 免费观看午夜在线欧差毛片| 爱爱帝国亚洲一区二区三区| 四虎亚洲国产成人久久精品| 美女被免费视频网站| 久久久久亚洲爆乳少妇无 | 亚洲精品国产福利一二区| 日日躁狠狠躁狠狠爱免费视频 | 菠萝菠萝蜜在线免费视频| 四虎国产精品免费视| 日韩免费在线中文字幕| 亚洲精品成人片在线观看精品字幕 | a国产成人免费视频| 亚洲av日韩av无码| 免费在线看v网址| 亚洲精品国产suv一区88| 国产福利电影一区二区三区,亚洲国模精品一区 | 国产片AV片永久免费观看| 亚洲熟妇成人精品一区| 婷婷亚洲天堂影院| 免费在线看污视频| 亚洲一区二区三区91| 亚洲AV无码专区日韩| 四虎影视在线影院在线观看免费视频 | baoyu116.永久免费视频| 久久久久久亚洲精品成人| 成人爽A毛片免费看| 日韩精品无码免费视频| 亚洲午夜精品久久久久久人妖| 国产又黄又爽又猛免费app| 国产精品亚洲а∨无码播放麻豆| 久久精品国产亚洲精品| 99re6在线视频精品免费下载| 亚洲熟妇无码AV不卡在线播放 | 最新亚洲成av人免费看|