在Web Crawler项目中,重复性不能很好地运行

时间:2016-01-10 14:24:10

标签: java algorithm web

对于excerise我想创建自己的Web Crawler,但是我的爬行方法的重复调用存在问题。它应该从我的链接数组中的每个链接开始,直到我决定中止整个程序,但它只适用于该数组中的第一个元素,因此它只是来回而没有任何进展。我该如何解决这个问题?

Crawler.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);

    }
}

App.java

package regularmikey.mikecrawler;

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

    }
}

3 个答案:

答案 0 :(得分:1)

您可以创建已经到达的网址列表。

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答案

完成

答案 1 :(得分:0)

尝试更改

crawl(link.attr("href"))

crawl(link.attr("abs:href"))

添加abs:前缀将返回绝对网址(例如&#34; http://facebook.com&#34;)

答案 2 :(得分:0)

listViewMother.getChildAt(position).setBackgroundColor( Color.parseColor("#00743D")); 的每个(递归)调用都会覆盖class Crawler的私有成员:

crawl()

这意味着,如果对private Elements links; private Document doc; public void crawl(String url) { try { // ... doc = Jsoup.connect(url).get(); links = doc.select("a[href]"); crawl(link.attr("href")); } } 的递归调用返回,则crawl()links不会恢复为之前的值。

首先应使用doc内的linksdoc的局部变量修复此问题。