在Java EE中创建Web爬网程序

时间:2012-08-15 17:10:09

标签: java java-ee web web-crawler jsoup

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

目前我正在使用JSOUP库来执行此操作。但它不可靠我尝试连接三次,并且超时仍然是10秒仍然是不可靠的。

不可靠我的意思是即使可以公开访问它,爬虫程序也无法访问它。我知道这可能是由于robots.txt排除,但在此也允许但仍然是不可行的。

所以我决定选择具有URLConnection然后openConnection方法的connect对象来执行此操作。

我还有一个要求让我烦恼的是:我必须得到CrawlerElement的响应时间(以毫秒为单位),这意味着从页面A加载页面B需要多少秒。我检查了URLConnection的方法没有出路才能做到这一点。

该主题中的任何想法?谁能帮我?

我在考虑编写前后代码,在getContent代码之前以毫秒为单位,当前时间以毫秒为单位减去并保存数据库中的毫秒,但我是否准确无误?

提前致谢。

编辑:当前实施

当前实现,它给我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);     
   }
}

说什么可以这样做,或者我应该使用像Apache HttpClient或Apache Nutch这样的重API ..

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

好的,这意味着你已经完成了工作,并在API / Library中遇到问题。我知道构建一件事然后浪费所有代码并转移到另一件代码是可怕的,但是如果你有可能作为{{{ 1}}只是一个解析器库,将来可能会给你带来更多问题所以我建议你使用这些more stable API。你也可以使用crawler4j来实现这个目的。
这是the list of some open source crawler API's,通过做一些R& D你可以找到一个很好的解决方案:)

答案 2 :(得分:0)

尝试使用Apache HttpClient库。我用它取得了不错的成绩。对于HTTP特定通信来说,这似乎更好一点。