让我们从例子开始。有一个网站,说它是Twitter的一个克隆,名为Tlitter。像Twitter一样,碎屑会不断更新以新的内容(大多数只是碎屑,因此得名)。与twitter不同,没有JSON / XML API可以方便地获取内容。为了从中获取数据,您必须获取良好的旧HTML并进行解析。这是获取该内容的唯一方法。
小型管理员有时会改变主意。他们可能会更改网站外观和HTML代码,以使提取数据的代码无法正常工作。您无法预测何时进行更改。它可以每周一次,每月一次甚至可能永远不会做。
您创建了一个Android应用程序,该应用程序使用Tlitter中的内容来补充其他来源的内容(例如Twitter)。 Twitter是至关重要的,它没有问题,因为它有一个不错的api,但是Tlitter停止工作时可能会让您头疼。假设Twitter给您商店的价格,而Tlitter给您折扣。没有Tlitter的应用仍然可以运行,但是有了Tlitter,它会变得更好,更完整。
您不想发布新版本只是为了解决与Tlitter相关的所有功能,因此您在Google Appspot上创建了一个应用程序,其作用类似于您的应用程序和Tlitter之间的代理。如果Tlitter发生更改,则只需要更新代理应用,所有用户都可以再次使用。
但是,您的应用程序越来越受欢迎,Google更改了其定价政策,为Appspot引入了“实例时间”。这两件事使您的应用几乎使用了所有免费配额。您不想为Appspot付费,只需以某种方式解决此问题。
有不止一种解决方案,可能没有完美的解决方案。我问你,你将如何解决这个问题?我的想法如下:
放弃代理应用程序的想法,处理移动应用程序中的所有内容
优点:Appspot没问题
缺点:当Tlitter更改时需要更新应用程序,用户端会有更多网络流量
在代理应用程序中缓存数据并尝试对其进行优化,或者找到更好的云服务
优点:更新没有问题,可能响应时间更快
缺点:如果该应用继续受到欢迎,它将最终使用所有免费资源,无论进行了何种优化
结合两个解决方案。使应用程序维护一些'Tlitter结构定义
文件”,在线托管。根据文件中指定的规则提取来自Tlitter的内容,应用程序(每天或每小时)检查一次该文件的更新。
优点:更改时间微调时无需更新应用
缺点:一个非常复杂的解决方案,目前我不知道如何实现它,可能的安全风险等。
提供的示例似乎很通用,但它几乎完美地模拟了我的问题。您将如何解决?如果可以找到实现它的好方法,我会选择解决方案1或3。
最佳答案
对于解决方案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上直接工作。
关于java - 从外部网站获取数据(其结构可能会更改),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8624718/