从外部网站获取数据(它的结构可能会改变)

时间:2011-12-24 13:06:48

标签: java android

让我们以身作则。有一个网站,说它是Twitter的一个名为Tlitter的克隆。像Twitter一样,Tlitter会不断更新新内容(大多数内容只是一个垃圾,因此得名)。与twitter不同,没有JSON / XML API以方便的方式获取内容。为了从中获取数据,您必须获取旧的HTML并解析它。这是获取该内容的唯一方式。

Tlitter管理员有时会改变主意。它们可能会改变网站外观和HTML代码,从而使代码提取数据不起作用。您无法预测何时进行更改。它可以每周制作一次,每月制作一次,也可以......永远不会。

您创建了一个Android应用程序,它使用来自Tlitter的内容来补充来自其他来源的内容(比如它的推特)。 Twitter是至关重要的,并没有任何问题,因为它有一个很好的api,但Tlitter可能会让你头疼,当它停止工作。假设Twitter为您提供商店的价格,Tlitter为您提供折扣。应用程序在没有Tlitter的情况下仍然可以正常运行,但对于Tlitter来说它更好更完整。

您不想仅仅为修复每个与Tlitter相关的功能而制作新版本,因此您在Google Appspot上创建了一个应用程序,它就像您的应用程序和Tlitter之间的代理一样。如果Tlitter发生变化,您只需要更新代理应用程序,所有用户都可以再次运行。

但是,您的应用程序受到欢迎,Google改变了定价政策,为Appspot引入了“实例时间”。这两件事使您的应用程序几乎使用了所有免费配额。你不想为Appspot付费,你只需要以某种方式解决这个问题。

有多个解决方案,可能没有完美的解决方案。我问你,你怎么解决这个问题?我的想法如下:

  1. 放弃代理应用程序的想法,处理移动应用程序内的所有内容
    • 优点:Appspot没问题
    • 缺点:需要在Tlitter更改时更新应用程序,在用户端更多网络流量
  2. 在代理应用内缓存数据并尝试对其进行优化,或者找到更好的云服务
    • 优点:更新没问题,响应时间可能更快
    • 缺点:如果应用程序将继续获得普及,它将最终使用所有免费资源,无论优化如何
  3. 结合两种解决方案。使应用程序保持一些'Tlitter结构定义 文件',在线托管。根据文件中指定的规则提取Tlitter中的内容,应用程序检查(每天或每小时)更新该文件。
    • 优点:无需在时间Tlitter更改时更新应用
    • 缺点:一个非常复杂的解决方案,目前我不知道如何实施它,可能存在安全风险等。
  4. 提供的示例可能看起来很通用,但它几乎完美地模拟了我的问题。你会如何解决它?如果我找到一个很好的方法来实现它,我会选择解决方案1或3。

3 个答案:

答案 0 :(得分:1)

大多数网站都可以使用单个正则表达式轻松解析,尤其是推特克隆。

因此,这个'结构定义文件'很容易只是一个正则表达式,具有命名的捕获组。所以我会去3。

答案 1 :(得分: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上直截了当。

答案 2 :(得分:0)

如果Android运行时可用于该语言,则可以使用某种动态语言(如Python)。然后,您可以经常下载最新版本的脚本。这个脚本将获得html页面(已经由你的应用程序下载)并生成一些格式良好的xml。此xml将由您的应用使用。

看看python-for-android作为可能的路径。