Как мы создаем сайт Crawler, используя Java - PullRequest
1 голос
/ 31 декабря 2010

повторная отправка этого вопроса. Я начал с сканера, но застрял в части индексации. Я хочу эффективный и быстрый способ индексации ссылок. В настоящее время я делаю вставку ссылок в базу данных., но проверка уникальных ссылок является непосильной задачей, поэтому кто-нибудь может предложить мне лучший способ сделать это.


Привет! Я пытаюсь создать сканер веб-сайтов, который будет сканировать весь веб-сайт и получать всессылки внутри него. Что-то очень похожее на "XENU".Но я не могу понять, как это сделать.У меня в голове один алгоритм, но он будет очень медленным, об этом ниже.

  1. Получить исходную страницу.
  2. Получить все теги привязки из источника.
  3. Получить URL-адреса из тега привязки.
  4. Проверьте, принадлежит ли URL-адрес тому же сайту или внешнему сайту.
  5. Получите источник для URL-адресов, которые мы нашли в приведенном выше.обработать и пометить эти URL как проверенные.
  6. Повторяйте процесс до тех пор, пока не останется неразмеченных URL.

Вот несколько грубое представление о том, что я придумал.Но это будет очень медленно.Поэтому любой может предложить мне другой подход или усовершенствовать этот алгоритм.

С уважением, Сагар.

Ответы [ 4 ]

2 голосов
/ 31 декабря 2010

Метод, который вы описали, является практически единственным, что вы можете сделать.Единственный способ сделать это быстрее - это обрабатывать несколько URL-адресов параллельно через отдельные потоки.Это можно сделать относительно легко и масштабно: вам нужно только синхронизировать доступ к пулу URL-адресов, которые должны быть обработаны, и сохранить результаты, поэтому при параллельном выполнении 1000 потоков это должно работать вполне нормально.

1 голос
/ 31 декабря 2010

Я сделал нечто подобное на J2ME три года назад.Идея заключалась в том, чтобы реализовать простой анализатор HTML, который будет обнаруживать все теги и теги медиа.Каждая ссылка помещается в синхронизированную коллекцию.Элементы коллекции потребляются несколькими потоками, которые будут исследовать следующий URL и так далее.Это было 3 года назад на ограниченном устройстве J2ME. Теперь есть Lucene, который является очень мощным полнотекстовым поисковым движком Java.Я рекомендую вам прочитать эту ссылку, которая заключается в использовании Lucene для сканирования веб-страниц: http://www.codeproject.com/KB/java/JSearch_Engine.aspx

пример:

приватный статический void indexDocs (String url) выдает исключение {

    //index page
    Document doc = HTMLDocument.Document(url);
    System.out.println("adding " + doc.get("path"));
    try {
        indexed.add(doc.get("path"));
        writer.addDocument(doc);          // add docs unconditionally
        //TODO: only add HTML docs
        //and create other doc types

        //get all links on the page then index them
        LinkParser lp = new LinkParser(url);
        URL[] links = lp.ExtractLinks();

        for (URL l : links) {
            //make sure the URL hasn't already been indexed
            //make sure the URL contains the home domain
            //ignore URLs with a querystrings by excluding "?"
            if ((!indexed.contains(l.toURI().toString())) &&
                (l.toURI().toString().contains(beginDomain)) &&
                (!l.toURI().toString().contains("?"))) {
                //don't index zip files
                if (!l.toURI().toString().endsWith(".zip")) {
                    System.out.print(l.toURI().toString());
                    indexDocs(l.toURI().toString());
                }
            }
        }

    } catch (Exception e) {
        System.out.println(e.toString());
    }
} 
0 голосов
/ 21 сентября 2014

Думаю, вам стоит взглянуть на Apache Nutch Project .

0 голосов
/ 31 декабря 2010

Предполагая, что это для целей обучения, я предлагаю вам прочитать больше о веб-сканерах здесь , и это даст вам больше информации / контекста, чем вы уже имеете Вам не нужно реализовывать все это, но вы можете выбрать наиболее важные моменты. Пройдите эту статью , которая предоставляет простую реализацию.

Разделите вашу проблему на небольшие логические куски, чтобы вы могли выполнять их параллельно. Посмотрите на реализации MapReduce , такие как Hadoop и GridGain.

...