0

我正在尝试创建一个基本的基于深度优先搜索的网络爬虫。这是我当前的代码:

import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.io.*;
import java.net.*;

public class DepthFirstSpider {
    private List<String> visitedList; //web pages already visited
    private static String hrefExpr = "href\\s*=\\s*\"([^\"]+)\"";
    private static Pattern pattern = Pattern.compile(hrefExpr);
    private int limit;
    private static Matcher matcher;
    private static URL contextURL;
    private static URL url;

    public List<String>  getVisitedList() { return visitedList; }

    //initialize the visitedlist and limit instance variables. Visit the starting url.
    public DepthFirstSpider(int limit, String startingURL) {
        visitedList = new ArrayList<String>();
        this.limit = limit;
        try {
            contextURL = new URL(startingURL);
        } catch (MalformedURLException e) {

        }

        visit(startingURL);
    }

    //print and add urlString to list of visited web pages 
    //create url and connect, read through html contents:
    //when href encountered create new url relative to the current url and visit it (if not already visited and limit not reached)
    public void visit(String urlString) {
        try{
            url = new URL(contextURL, urlString);
            URLConnection connection = url.openConnection();
            InputStream inputStream = connection.getInputStream();
            BufferedReader reader = new BufferedReader(
                    new InputStreamReader(inputStream));
            String nextLine;
            while((nextLine=reader.readLine()) != null){
                matcher = pattern.matcher(nextLine);
                while(matcher.find() && limit > 0 && !visitedList.contains(url.toString())){
                    System.out.println("visiting " + url.toString());
                    visitedList.add(url.toString());
                    visit(matcher.group(1));
                    limit--;
                }
            }
        } catch (MalformedURLException e){

        } catch (IOException e){

        }
    }

}

搜索当前可以毫无问题地击落网页树。我需要帮助让它重新启动,然后转到它错过的页面。谢谢您的帮助。

4

2 回答 2

1

当我做一个爬虫时,我使用了两个队列而不是一个列表。一个队列包含要访问的 url,另一个包含访问过的 url。我将所有我想访问的 URL 添加到 toVisit 队列中,当我访问这些 URL 时,我将它们从 toVisit 队列中删除(并添加到访问队列中),并将该页面上的所有链接添加到 toVisit 队列中,除非它们在访问中队列。这样做不需要遍历。

于 2012-05-02T07:16:38.750 回答
1

我可能会遗漏一些东西,但是,

首先,您还需要跟踪 Expanded 节点。您应该将每个生成的子节点添加到堆栈 (FILO) 中。

您应该在每次迭代时将每个扩展节点 push() 到堆栈和 pop() 。当您达到限制时,您将弹出上层节点。

这是作业吗?

你可以在维基百科的伪代码中找到一个好的解释。

于 2012-05-02T07:40:12.033 回答