对于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();
}
}
答案 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
内的links
和doc
的局部变量修复此问题。