3

我正在使用 Java EE 技术创建一个网络爬虫。我创建了一个爬虫服务,其中包含 WebCrawler 在术语CrawlerElement对象中的结果,其中包含我感兴趣的信息。

目前我正在使用JSOUP图书馆来做到这一点。但它不可靠我正在尝试连接 3 次,并且超时仍然是 10 秒它是不可靠的。

不可靠是指即使可以公开访问,爬虫程序也无法访问。我知道这可能是由于robots.txt排斥,但在这方面也是允许的,但它仍然是不现实的。

因此,我决定使用URLConnection具有openConnection然后connect执行此操作的方法的对象。

我还有一个困扰着我的要求,那就是:我必须以毫秒为单位获取 CrawlerElement 的响应时间,这意味着从页面 A 加载页面 B 需要多少秒?我检查了 URLConnection 的方法,没有办法做到这一点。

在那个话题上有什么想法吗?谁能帮我?

我在考虑编写一个代码之前和之后在gettingContent代码之前以毫秒为单位的当前时间和以毫秒为单位的当前时间减去并将该毫秒保存在数据库中,但我认为它是否准确?

提前致谢。

编辑:当前实现

当前的实现,它给了我 statusCode、contentType 等。

import java.io.IOException;
import java.net.URL;
import java.net.URLConnection;


public class GetContent {
public static void main(String args[]) throws IOException {
    URL url = new URL("http://www.javacoffeebreak.com/faq/faq0079.html");
    long startTime = System.currentTimeMillis();
    URLConnection uc = url.openConnection();
    uc.setRequestProperty("Authorization", "Basic bG9hbnNkZXY6bG9AbnNkM3Y=");
    uc.setRequestProperty("User-Agent", "");
    uc.connect();
    long endTime = System.currentTimeMillis();
    System.out.println(endTime - startTime);
    String contentType = uc.getContentType();
    System.out.println(contentType);
    String statusCode = uc.getHeaderField(0);
    System.out.println(statusCode);     
   }
}

怎么说可以这样做,或者我应该使用重型 API,如 Apache HttpClient 或 Apache Nutch ..

4

3 回答 3

3

最好使用经过验证的框架,而不是重新发明轮子。试试 Apache Nutch(我推荐 1.x 分支,2.x 似乎太原始了)。实现自己的爬虫并支持并行、robots.txt / "noindex" 元标记、重定向、可靠性会很痛苦......有很多问题需要解决。

于 2012-08-15T17:24:49.700 回答
2

好的,这意味着您已经完成了工作并在该 API/库中遇到了问题。我知道构建一个东西然后浪费所有代码并转移到另一个东西是很可怕的,但是如果您有可能的话,因为JSoup它只是一个解析器库并且将来可能会给您带来更多问题,因此我建议您使用这些更稳定的API。您也可以为此目的使用crawler4j
这是一些开源爬虫 API 的列表,通过进行一些研发,您可以找到一个很好的解决方案:)

于 2012-08-15T17:31:55.217 回答
0

试试 Apache HttpClient 库。我用它取得了很好的效果。对于 HTTP 特定的通信来说,这似乎要好一些。

于 2012-08-15T17:14:34.337 回答