java - 循环在网络爬虫项目中效果不佳

标签 java algorithm web

对于练习,我想制作自己的网络爬虫,但我在重复调用我的爬网方法时遇到问题。它应该从我的链接数组中的每个链接开始,一直持续到我决定中止整个程序,但它只适用于该数组中的第一个元素,所以它只是来回移动而没有任何进展。我该如何解决这个问题?

爬虫.java

package regularmikey.mikecrawler;

import java.io.IOException;

import org.jsoup.HttpStatusException;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class Crawler implements Runnable {

    private Elements links;
    private Document doc;
    private String start_url;


    public Crawler(){};
    public Crawler(String url){start_url = url;};


    public void crawl(String url)  {

        try {
            System.out.println(url);
            doc = Jsoup.connect(url).get();

            String title = doc.title();
            System.out.println("title : " + title);

            links = doc.select("a[href]");
            for (Element link : links) {
                if(AdressValidator.validAddress(link.attr("href"))) {
                crawl(link.attr("href"));
                }
            }
        } catch (org.jsoup.UnsupportedMimeTypeException e) {

            e.printStackTrace();
        } catch (IOException e) {

            e.printStackTrace();
        }

    }


    public void run() {

            crawl(start_url);

    }
}

应用程序.java

package regularmikey.mikecrawler;

public class App 
{
    public static void main( String[] args )
    {
       Thread thread = new Thread(new Crawler("http://facebook.com"));
       thread.run();

    }
}

最佳答案

您可以创建一个您已经到达的 url 列表。

private List<String> urls = new ArrayList<String>();

//some code

for (Element link : links) {
            if(!urls.contains(link.attr("abs:href"))){
                urls.add(link.attr("abs:href"));
                crawl(link.attr("abs:href"));
            }
}

编辑:用@PallyP 回答完成

关于java - 循环在网络爬虫项目中效果不佳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34706495/

相关文章:

php - 可点击获取的数据: Website Redirect

javascript - 大写两个姓氏之间有破折号

html - 网页密码字段,浏览器不会记住

Java GSON - 将 int 作为字符串序列化为 json 文件

javascript - 实现极小极大

Java串行通信和多线程

algorithm - 可以处理这些查询的算法

c++ Floodfill算法最终错误

java - 将 char 转换为 int java 时出现问题

java - Java要求main()方法是静态的。 C和C++不需要这样。为什么?