2011-12-24 23 views
2

讓我們通過實例啓動。有一個網站,說它是Twitter的一個名爲Tlitter的克隆。 Tlitter就像Twitter一樣不斷更新新的內容(其中大部分只是垃圾,因此而得名)。與twitter不同,沒有JSON/XML API以便捷的方式獲取內容。爲了從中獲取數據,您必須獲取良好的舊HTML並解析它。這是獲取該內容的唯一途徑。獲取數據(它的結構可能會發生變化)

Tlitter管理員有時會改變他們的想法。他們可能會改變網站外觀和HTML代碼,從而導致代碼提取數據失效。您無法預測何時會進行更改。它可以每週一次,一個月一次或者......從不。

創建使用內容從Tlitter,以補充從其他來源的內容Android應用程序(說這是Twitter的)。 Twitter是至關重要的,它沒有問題,因爲它有一個很好的API,但Tlitter在停止工作時可能會讓你頭疼。比方說,Twitter給你的商店價格和Tlitter給你的折扣。 App沒有Tlitter功能,但Tlitter只是更好更完整。

你不想做一個新的版本只是爲了解決每一個Tlitter相關的功能,讓你做在谷歌Appspot上這就像你的應用程序和Tlitter之間的代理應用程序。如果Tlitter發生變化,您只需更新代理應用程序,並且所有用戶都可以再次使用代理應用程序。

但是,你的應用得到普及和谷歌改變了他們的定價政策,引入「實例時間」爲Appspot上。這兩件事使你的應用程序使用幾乎所有的免費配額。你不想爲Appspot付費,你只需要以某種方式解決這個問題。

有多個解決方案,可能沒有完美的人。我問你,你會如何解決這個問題?我的思路如下:

  1. 下降代理應用程序的想法,過程一切手機應用程序內
    • 優點:與Appspot上
    • 缺點沒有出現問題,需要更新應用程序時Tlitter變化,更在用戶側網絡流量
  2. 代理內部應用程序緩存數據,並嘗試優化它,或者找到更好的雲服務
    • 優點:用U沒問題pdates,也許更快的響應時間
    • 缺點:如果應用程序將繼續得到普及它最終將使用所有可用資源,無論優化取得
  3. 結合兩種解決方案。使應用程序保持一些'Tlitter結構定義 文件',在線託管。來自Tlitter的內容根據文件中指定的規則提取,應用程序檢查(每天或每小時)更新該文件。
    • 優點:無需更新應用程序時,時間Tlitter改變
    • 缺點:一個非常複雜的解決方案,目前我不知道如何實現它,可能的安全風險等

提供的示例看起來很通用,但它幾乎完美地模擬了我的問題。你會如何解決它?如果我找到一個很好的實現方法,我會選擇解決方案1或3。

回答

1

對於解決方案3,您需要尋找一些您可以更新的DSL或腳本語言。也許jsoup是一個很好的基礎。您將加載包含選擇器字符串的文件以檢索該數據。在下面的示例中(來自jsoup網頁),您將基本上從Web服務加載字符串(#mp-itn b a)。

Document doc = Jsoup.connect("http://en.wikipedia.org/").get(); 
Elements newsHeadlines = doc.select("#mp-itn b a"); 

Jsoup在android上直接工作。

+0

嗯,我認爲這是我爲了實現#3而正在尋找的東西。它比RegEex更方便,並且易於通過託管文件進行更新。 – user1234567 2011-12-24 13:41:08

1

大多數站點都可以通過單個正則表達式輕鬆解析,尤其是一個推特克隆。

因此,這個'結構定義文件'可以很容易地只是一個正則表達式,帶有命名捕獲組。所以我會去3.

+0

我忘了在這裏使用正則表達式。謝謝指出(這也意味着我應該休息一下)。我會檢查他們將如何執行與其他評論中建議的jsoup相比。 – user1234567 2011-12-24 13:51:35

0

如果Android運行時可用於該語言,您可以使用一些動態語言(如Python)。然後您可以經常下載最新版本的腳本。該腳本將獲得html頁面(已經由您的應用下載)並生成一些格式良好的xml。這個XML將被你的應用程序使用。

看看python-for-android作爲可能的路徑。

+0

這會給我一個最大的靈活性,但據我所知,爲了運行Python,我需要在用戶的手機上安裝SL4A和Py4A,對吧? – user1234567 2011-12-24 13:49:04

+0

不知道,你需要調查一下。但我認爲有可能將運行時嵌入到特定的應用程序中。換句話說,你的.apk文件應該託管運行時。 – inazaruk 2011-12-24 14:12:37