Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于javaswing的Web爬行_Java_Swing_Web Crawler - Fatal编程技术网

基于javaswing的Web爬行

基于javaswing的Web爬行,java,swing,web-crawler,Java,Swing,Web Crawler,我正在开发一个基于Java的网络爬虫。我创建了一个JFrame(Java:Swing)。我的爬虫程序正在成功运行。它正在访问创建的链接。但我想在JTextArea中添加动态爬网链接,但它没有。我不能那样做。当我尝试这个时,我的程序被冻结了。但我可以将访问的url设置为控制台 我的gui如下所示: Document html = null; try { html = Jsoup.connect(url).get(); Elements lin

我正在开发一个基于Java的网络爬虫。我创建了一个JFrame(Java:Swing)。我的爬虫程序正在成功运行。它正在访问创建的链接。但我想在JTextArea中添加动态爬网链接,但它没有。我不能那样做。当我尝试这个时,我的程序被冻结了。但我可以将访问的url设置为控制台

我的gui如下所示:

    Document html    = null;

    try {
        html = Jsoup.connect(url).get();
        Elements links = html.select("a");

        for(Element link: links) {
            String tmp = link.attr("abs:href");
            jTextArea2.append(tmp + "\n");

            if(!this.visitedUrl.contains(tmp)) {
                this.foundedUrl.add(tmp);
                System.out.println(tmp);
            }
        }

        while(this.foundedUrl.size() > 0) {
            String tmp = this.foundedUrl.get(this.foundedUrl.size() - 1);
            this.foundedUrl.remove(this.foundedUrl.size() - 1);
            if(!this.visitedUrl.contains(tmp)) {
               this.linkTracker(tmp); 
            }
        }

我的代码行如下所示:

    Document html    = null;

    try {
        html = Jsoup.connect(url).get();
        Elements links = html.select("a");

        for(Element link: links) {
            String tmp = link.attr("abs:href");
            jTextArea2.append(tmp + "\n");

            if(!this.visitedUrl.contains(tmp)) {
                this.foundedUrl.add(tmp);
                System.out.println(tmp);
            }
        }

        while(this.foundedUrl.size() > 0) {
            String tmp = this.foundedUrl.get(this.foundedUrl.size() - 1);
            this.foundedUrl.remove(this.foundedUrl.size() - 1);
            if(!this.visitedUrl.contains(tmp)) {
               this.linkTracker(tmp); 
            }
        }
如何在JTextarea中动态设置访问过的url?

试试以下方法:

new Thread((Runnable)() ->
{
  Document html    = null;

  try {
    html = Jsoup.connect(url).get();
    Elements links = html.select("a");

    for(Element link: links) {
        String tmp = link.attr("abs:href");
        EventQueue.invokeLater(() -> {
           jTextArea2.append(tmp + "\n");
        });

        if(!this.visitedUrl.contains(tmp)) {
            this.foundedUrl.add(tmp);
            System.out.println(tmp);
        }
    }

    while(this.foundedUrl.size() > 0) {
        String tmp = this.foundedUrl.get(this.foundedUrl.size() - 1);
        this.foundedUrl.remove(this.foundedUrl.size() - 1);
        if(!this.visitedUrl.contains(tmp)) {
           this.linkTracker(tmp); 
        }
    }
  }catch(Exception e){}
}).start();
GUI冻结的原因是您正在阻止GUI线程。因此,通过创建一个新线程,在不同的线程上开始您的操作,然后从那里开始运行。 要获取更新,请致电EventQue 它将告诉GUI线程将文本添加到JTextArea

尝试以下操作:

new Thread((Runnable)() ->
{
  Document html    = null;

  try {
    html = Jsoup.connect(url).get();
    Elements links = html.select("a");

    for(Element link: links) {
        String tmp = link.attr("abs:href");
        EventQueue.invokeLater(() -> {
           jTextArea2.append(tmp + "\n");
        });

        if(!this.visitedUrl.contains(tmp)) {
            this.foundedUrl.add(tmp);
            System.out.println(tmp);
        }
    }

    while(this.foundedUrl.size() > 0) {
        String tmp = this.foundedUrl.get(this.foundedUrl.size() - 1);
        this.foundedUrl.remove(this.foundedUrl.size() - 1);
        if(!this.visitedUrl.contains(tmp)) {
           this.linkTracker(tmp); 
        }
    }
  }catch(Exception e){}
}).start();
GUI冻结的原因是您正在阻止GUI线程。因此,通过创建一个新线程,在不同的线程上开始您的操作,然后从那里开始运行。 要获取更新,请致电EventQue
它将告诉GUI线程将文本添加到JTextArea

您是否从UI事件线程调用此代码?大多数Swing控件只支持从UI事件线程调用。欢迎使用Stack Overflow,请阅读并浏览,这将引导您找到,这将在稍后告诉您发布一个有效的消息来演示您的问题。由于您的程序不完整,因此不可编译,我们不希望您的整个应用程序都是完整的,但需要一个简单但完整的示例(不是代码片段)来演示您的问题。例如,您可以对URL进行硬编码,并使用一个
JTextArea
和一个
JButton
启动该过程。我们知道您的GUI冻结,但您的问题太广泛,因为它缺乏足够的信息(即MCVE)来回答。。。。。。因为你可能还没有在EDT中初始化你的应用程序,或者你正在EDT中运行它,也许你也想看看,这允许你在一个单独的线程中处理长任务,而不阻塞EDT(这会冻结你的GUI)。另外,请阅读您是否从UI事件线程调用此代码?大多数Swing控件只支持从UI事件线程调用。欢迎使用Stack Overflow,请阅读并浏览,这将引导您找到,这将在稍后告诉您发布一个有效的消息来演示您的问题。由于您的程序不完整,因此不可编译,我们不希望您的整个应用程序都是完整的,但需要一个简单但完整的示例(不是代码片段)来演示您的问题。例如,您可以对URL进行硬编码,并使用一个
JTextArea
和一个
JButton
启动该过程。我们知道您的GUI冻结,但您的问题太广泛,因为它缺乏足够的信息(即MCVE)来回答。。。。。。因为你可能还没有在EDT中初始化你的应用程序,或者你正在EDT中运行它,也许你也想看看,这允许你在一个单独的线程中处理长任务,而不阻塞EDT(这会冻结你的GUI)。也请阅读