获取网页内容的最可靠方法是什么?

时间:2012-09-10 20:07:57

标签: java java-ee html-parsing web-crawler

我试图找出最可靠的方法来获取网页内容,其中url作为输入参数在Java中?

我尝试过的事情是:  1. JSOUP  2. HtmlUnit  3. URL和URLConnection

1&的问题2他们有时会抛出SocketTimeoutException或者行为不可预测,即使可以获取页面的内容(即使robots.txt允许)。

使用3我无法在不使用毫秒减法的情况下获得loadTime。这是最大的问题,会产生不准确的结果。另外,为了获取内容,我需要使用Streams并逐行读取内容。

当前的实现使用方法#2。它具有LoadTime和contentType的功能。

对于每个网页的内容,我需要contentType,loadTime等。

基本上它是用于验证整个网站的链接验证器项目,包括css的背景图像,图像,js,html等。所以基于contentType我只过滤和解析HTML的内容。

P.S。将超时提高超过9秒将使链接验证变慢。所以我目前的超时是9秒。

我需要帮助,因为我想让我的链接验证工具尽可能可靠。

2 个答案:

答案 0 :(得分:2)

听起来您的问题分为两部分:

  1. 如何从远程服务器获取内容

  2. 如何解析内容以进行链接验证

  3. 而你的问题实际上是关于第1部分,但你同时考虑第1部分和第2部分。这可能是您问题的一部分。

    真正的问题是阅读远程内容。所有这三种方法都是使用完全相同的后台API读取内容,即JRE内置的基于URLConnection的解决方案。 URLConnection是可以的,但不是真正想要在真实网络上使用的。

    您可以使用几个更好的库来通过HTTP协议获取远程资源的内容...

      来自JBoss的
    1. Netty
    2. 来自Apache的
    3. HttpComponents
    4. 来自Jean-Francois的
    5. AsyncHttpClient
    6. 我发现即使在阻止模式下,AsyncHttpClient也是最好用的。它有一个非常好的API来获取页面,它适用于多线程。您应该很容易获得总加载时间,更重要的是,您应该能够并行完成大量工作。

      您实质上将使用AsyncHttpClient加载内容,然后将该内容传递到JSoup(或者您喜欢的任何内容...... JSoup是我推荐的那个)并在那里进行解析。

      错误不是使用JSoup或HtmlUnit,而是尝试使用它们来做所有事情。这些工具旨在做一件事并做好一件事......你需要做两件事,所以使用两个工具,每个工具都针对手头的任务进行了优化。

答案 1 :(得分:0)

你应该实现某种重试机制。