【问题标题】:scraping data from website that could change从网站上抓取可能改变的数据
【发布时间】:2017-10-06 13:40:10
【问题描述】:

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

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

这是我的第一次抓取经验,任何答案都会对我有很大帮助。 谢谢

【问题讨论】:

标签: android html web-scraping screen-scraping


【解决方案1】:

一个更好的方法是有一个服务器来执行网站的实际抓取,然后你的应用程序将与你的服务器通信并只接收应用程序需要的数据,这样应用程序就不会破坏每个网站更改的时间。

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

您可以通过将网站数据报废并将结果与​​之前的结果进行比较来了解网站数据是否发生了变化,如果结果是新的,则您允许应用程序获取新数据。

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

【讨论】:

  • 我的服务器的频率是多少才能检测到更改?如何确保我的网站服务器不会超载?
  • @habenah 您必须根据要提取的数据类型自己做出决定,考虑网站通常更改的频率以及您希望更新应用程序用户的频率。如果您一次只使用一台服务器进行下载,几乎不可能使网站超载,一个用户可以超载哪种类型的网站?请记住,应用程序用户只会与您的服务器对话,因此他们不会访问网站,只有服务器会访问网站。
  • 就像我说的,如果您一次执行一个请求,您不能从一台服务器产生太多请求,这与一个用户重新加载页面相同。
【解决方案2】:

这完全取决于您想从哪里进行抓取。我使用的其中一个库是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 提供给您的应用程序。这样您就可以在应用中进行抓取时更改抓取算法。

【讨论】:

  • 我的服务器的频率是多少才能检测到更改?如何确保我的网站服务器不会超载?
  • 服务器的频率是什么意思?您是否要在服务器上保留一份报废数据的副本并根据请求将其发送到您的应用程序?
  • 我的意思是我需要运行多少次服务器才能检测网站上的更改?每次网站数据发生变化时,我都需要在我的应用中显示推送通知。
  • 嗯,这完全取决于网站更改其内容的频率,如果内容真的经常更改,比如 facebook,你可以每 5 分钟刷新一次数据,如果它类似于 youtube,例如我猜每 15 分钟会好的等等
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-14
  • 2013-05-21
  • 1970-01-01
  • 2014-07-06
  • 1970-01-01
相关资源
最近更新 更多