2017-05-08 17 views
0

我想创建一个Android应用程序,我可以从特定网站上抓取数据。该网站上的信息可能会改变(文本数据)。另外,我不知道HTML结构是否会随着时间而改变。我的问题是:从网站抓取数据可能会改变

  1. 有没有人推荐特定的工具或框架刮 (免费)?
  2. 如何知道何时信息(文本数据)在 网站上发生变化,以便我可以更新我的应用程序?
  3. 如何处理网站HTML结构的变化?

这是我的第一次抓取经验,任何答案可以帮助我很多。 谢谢

+0

检查网站是否提供使用的API。另外检查这些链接:http://stackoverflow.com/questions/2861/options-for-html-scraping和http://stackoverflow.com/questions/2530285/how-to-know-if-the-website-being -scraped-has-changed – Denny

回答

0

一个更好的方法来做到这一点将是有一个服务器,实际上刮网站,然后你的应用程序将与此服务器对话,并只接收应用程序需要的数据,这种方式应用程序每次网站改变时都不会中断。

至于服务器抓取,每当网站结构发生变化时,您都需要更新您的抓取代码,您会知道在您的刮码代码中断或返回垃圾结果时它是否发生了变化。

如果结果是新的,那么您可以通过将其废弃并将结果与​​以前的结果进行比较来了解网站数据是否已更改,然后允许应用程序获取新数据。

如果您在应用程序中执行此操作,您将消耗大量数据,因为您每次要检查更改时都必须下载该站点。 当网站结构发生变化时,您的应用程序也会中断甚至崩溃,这会让用户感到沮丧,而且用户需要很长时间才能收到应用程序更新,而其中一些更新根本不会更新。

+0

我的服务器的频率是多少,以便它可以检测到这些变化?如何确保我不会超载网站服务器? – habenah

+0

@habenah您必须根据您正在提取的数据类型自行做出决定,考虑网站经常更改的频率以及您希望更新App用户的频率。如果您只使用一台服务器一次下载一个网站,一个用户可以重载哪种类型的网站,那么几乎没有办法使网站超载。请记住,应用程序用户只会与您的服务器通话,以便他们不会访问该网站,只有服务器才会访问该网站。 – mbwasi

+0

我认为太多的请求可能会导致服务器崩溃。 – habenah

0

这一切都取决于你想从哪里进行刮擦。一个我用的是李raries的是Jsoup它可以让你连接到一个URL并获取像这样的HTML:

Connection.Response page = Jsoup.connect("http://example.com").method(Method.GET).execute(); 
Document pDoc = page.parse(); 

然后,您可以使用Jsoup的方法,这是很容易的,因为解析页面Jsoup 1.10即可使用CSS选择器,像这样:

Element element = pDoc.select(".class-in-html-element"); 

你总是可以做刮服务器端,并将其投放到您的应用程序,这样你可以改变刮算法一旦网站的变化,但如果你有太多的用户,你会从相同的IP(您的服务器IP)发出太多请求。

我会建议在应用程序中进行刮擦,但使用来自服务器的变量。 例如,在您的服务器上使用"title_of_scrapped_page":"css_selector_to_use_in_app"等值来保存JSON文件,并在每次启动时向您的应用程序提供此json文件。通过这种方式,您可以在应用程序中进行更改刮取算法。

+0

我的服务器的频率是多少,以便它可以检测到这些变化?如何确保我不会超载网站服务器? – habenah

+0

你是什么意思服务器的频率?您是否要在服务器上保留一份报废数据的副本,并根据请求将其发送给您的应用程序? –

+0

我的意思是我需要多少次运行我的服务器才能检测网站上的更改?每次数据在网站中发生变化时,我都需要在应用程序中发送推送通知。 – habenah