用Java EE创建一个网络爬虫

3
我正在使用Java EE技术创建网页爬虫。我已经创建了一个爬虫服务,其中包含WebCrawler的结果,以CrawlerElement对象的形式存储,其中包含我感兴趣的信息。
目前我正在使用JSOUP库来实现这一点。但是它不可靠,尽管我尝试连接三次并且超时时间为10秒,仍然不可靠。不可靠的意思是即使可以公开访问,也无法被爬虫程序访问。我知道这可能是由于robots.txt排除导致,但即使是允许的情况下,它仍然不可靠。
因此,我决定使用URLConnection对象,该对象具有openConnection方法和connect方法来实现这一点。
我还有一个要求,这让我困扰不已,那就是:对于一个CrawlerElement,我必须以毫秒为单位获取响应时间,也就是从页面A到页面B加载需要多少秒?我检查了URLConnection的方法,没有办法实现这一点。
对此有任何想法吗?有人能帮我吗?
我考虑在获取内容代码之前和之后编写一个代码,以毫秒为单位取得当前时间,并将当前时间减去获取内容代码之前的时间并将毫秒保存在数据库中,但我想知道这样做是否准确?
提前感谢。
编辑:当前实现
目前的实现可以给我提供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呢?


在我看来,将之前和之后的时间相减听起来非常准确。 - Danny
谢谢 Danny。我想对于加载时间,我将使用减法方法本身。我必须考虑使用哪种方法来获取实际内容。 - Dhruvenkumar Shah
3个回答

3

使用已经被证明的框架比重复造轮子更好。尝试使用Apache Nutch(我推荐1.x分支,2.x似乎还不够成熟)。实现自己的爬虫需要考虑并行性、robots.txt/"noindex"元标签、重定向和可靠性等问题,这将会是一个非常痛苦的过程。有很多问题需要解决。


嗨,我决定使用HtmlUnit API,可以在这里找到:http://htmlunit.sourceforge.net/,它还具有加载时间功能。基本上它是用于测试,但它拥有我需要的所有东西。感谢您的帮助。 - Dhruvenkumar Shah

2

好的,它意味着您已经在API /库中进行了工作并遇到了问题。我知道构建一个东西然后浪费所有代码并转移到另一个东西是令人恐惧的,但如果可能的话,因为JSoup只是一个解析器库,它可能会在将来给您带来更多问题,所以我建议您使用这些更稳定的API。您还可以使用crawler4j

这里是一些开源爬虫API的列表,通过进行一些研究和开发,您可以找到一个好的解决方案:)


0

尝试使用Apache HttpClient库。我用它取得了不错的结果。对于HTTP特定通信,它似乎要好得多。


我考虑过这个库,但我不确定它是否支持HTTPS? - Dhruvenkumar Shah
是的,它似乎有相当好的支持,虽然有点啰嗦但还不错。 - Robert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接