2011-12-24 26 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