2012-05-02 2 views
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){ 

     } 
    } 

}

поиска в настоящее время снимает вниз дерево веб-страниц без проблем. Мне нужна помощь, чтобы он вернулся, а затем перешел на страницы, которые он пропустил. Спасибо за помощь.

ответ

1

Когда я сделал сканер, я использовал две очереди вместо одного списка. Одна очередь содержала URL-адреса для посещения, а другая содержала URL-адреса. Я добавил все URL-адреса, которые я хотел посетить, в очередь toVisit, и когда я посетил эти URL-адреса, я удалил их из очереди toVisit (и добавил в посещенную очередь) и добавил все ссылки на этой странице в очередь toVisit, если они не были в посещенных очередь. Нет необходимости проходить таким образом.

+0

У меня есть ширина первого искателя, который делает именно это. Однако я хочу использовать этот конкретный метод поиска здесь. – kmaz13

+0

Итак, вы должны использовать стек вместо очереди для toVisit. Подойдя как можно глубже, вы захотите пойти к следующему глубочайшему родному брату. Имеет ли это смысл? Я бы предположил, что вы все равно захотите добавить hrefs, когда вы столкнетесь с ними, поскольку это было бы проще, чем перемещение части страницы, а затем последующее перемещение остальной части позже. – ulu5

+0

Это имеет смысл, не могли бы вы привести пример? – kmaz13

1

я мог бы что-то отсутствует, но,

в глубину первых, вам нужно следить за укрупненными узлами, а также. каждый сгенерированный дочерний узел должен добавить их в стек (FILO).

вы должны нажать() каждый расширенный узел на стек и pop() на каждой итерации. когда вы достигнете предела, вы будете вводить верхние узлы.

Это домашнее задание?

вы можете найти хорошее объяснение в псевдокоде в Википедии.

+0

Да, это домашнее задание, как я должен работать над работой стека? – kmaz13

+0

Не обязательно должен быть STACK, если вы используете свою структуру данных в режиме First-In Last-Out. – bmartins

Смежные вопросы