Оптимальный алгоритм парсинга для BAS



  • @romanbiz

    foo(url){
      arr = getUrl();
      foreach iUrl(arr){
        foo(iUrl)
      }
    }
    


  • @ruzne Вот еще метод в ширину. Вопрос как это переложить на Для каждого элемента- Начать цикл

    Поместить узел, с которого начинается поиск, в изначально пустую очередь.
    Извлечь из начала очереди узел U и пометить его как развёрнутый.
    Если узел U является целевым узлом, то завершить поиск с результатом «успех».
    В противном случае, в конец очереди добавляются все преемники узла U, которые ещё не развёрнуты и не находятся в очереди.
    Если очередь пуста, то все узлы связного графа были просмотрены, следовательно, целевой узел недостижим из начального; завершить поиск с результатом «неудача».
    Вернуться к п. 2.
    Примечание: деление вершин на развёрнутые и не развёрнутые необходимо для произвольного графа (так как в нём могут быть циклы). Для дерева эта операция не нужна, так как каждая вершина будет выбрана один-единственный раз.



  • @ruzne said in Оптимальный алгоритм парсинга для BAS:

    foo(url){
      arr = getUrl();
      foreach iUrl(arr){
        foo(iUrl)
      }
    }
    

    Можете пояснить что это и как работает?



  • функция принимающая на вход урл,
    переходит по этому урлу, получает со страницы все ссылки в массив селектором а. для каждой полученой ссылки вызывем ту же функцию
    можно добавить после foo(iUrl) history.go(-1) - перейти к предидущей страници

    а я бы открывал каждую новую ссылку в новой вкладке, и после того как обошол все ссылки на первой вкладке переходил бы к следующей



  • @ruzne Повторюсь, я просил алгоритм для Для каждого элемента- Начать цикл.
    Можете мне рассказать об алгоритме обхода по Вашему методу? То есть каким образом он сумеет перейти по всем ссылкам сайта, чтобы я понимал что это работает. А то, к сожалению, я не вижу как это решает задачу по обходу всех страниц.



  • @romanbiz , ты все как-то усложняешь. Нет гарантий, что пройдешь по всем страницам. Пройдешь только по тем страницам, которые перелинкованы. Соответственно берешь те страницы, которые тебе уже известны и добавляешь их в список 1. Проходишь по ним и собираешь ссылки, сохраняешь в список 2 (может быть не за один проход, а как настроишь). Потом убираешь из списка 1 ссылки по которым прошел и переносишь их в список 3. Чистишь список 2 от дублей и вхождений строк из списка 3. Оставшееся переносишь в список 1. Повторяешь. Мне кажется, что тут принципиально нового не сделать ничего.



  • @romanbiz
    0_1520263883664_test.xml
    вероятно это будет работать.

    это лишшаблон необходимо добвавить нужные проверки и убрать лишние, так же проверить правильность формирования ссылок, в зависимости от того относительные они или абсолютные, а если го хистори не работает то заменить на загрузить страницу урл, он в том месте как раз востанавливается из стека
    upd: там еще состояние forech нужно сохранять, но это домашняя работа, так же в стек



  • @Antonio Это очень неоптимальный алгоритм к сожалению. Все страницы перелинкованы, такова структура сайта.



  • @romanbiz, если на сайте меньше 10000 страниц, то ты будешь думать дольше, чем таким образом ссылки пройдешь. Но я с интересом, конечно, почитаю, если кто-то предложит реальный и более оптимальный алгоритм.



  • @romanbiz Меня тут мысль посетила, может можно карту сайта использовать? В ней по идее все есть в xml формате



  • @Denis_krsk Спасибо за мысль, я писал выше

    Нет, sitemap никак не получить. Сайт закрытый. Ну и еще есть детали типа отсутствия ссылок в браузере (не IFRAME а JS), приходится сохранять каждую страницу с идентификатором, но я уже просто решил не грузить кучей подробностей. В общем нужен именно алгоритм обхода сайта.



  • Делаем ассоциированный массив
    VAR_LINKS = {}
    

    Делаем While цикл

    while(true){
        VAR_TEMP_LINKS = []
        if(VAR_CYCLE_INDEX == 0)
        {
            //Тут собираем ссылки первый раз
        }else
        {
                 //Проверка есть ли список для этой иттерации
                try{
                 var a = VAR_LINKS[VAR_CYCLE_INDEX]
                  }catch(e){
                _break()
                }
                  Foreach(VAR_LINKS[VAR_CYCLE_INDEX])
                         //Парсим ссылки с каждой страницы в массив TEMP_LINKS
     
        }
            //Ложим в ассоц массив наш массив
             if(VAR_TEMP_LINKS.length  > 0) 
             VAR_LINKS[VAR_CYCLE_INDEX + 1 ] = VAR_TEMP_LINKS
    
    }
    

    За первый проход помещаем в массив спаршенных ссылок

    VAR_LINKS = {
    1:["ссылка1", "ссылка2"]
    }
    

    Следующий проход

    VAR_LINKS = {
    1:["ссылка1", "ссылка2"];
    2:["ссылка3", "ссылка4"]
    }
    

    При этом в общем цикле еще делаем добавление в общий список и ресурс, а так же проверку перед переходом по ссылке, что бы много раз не переходить по тем же ссылкам.
    Так же желательно поменять переменный cycle index
    П.С.
    Мог ошибиться в где то в синтаксисе с асоц массивами, лень искать скрипт в котором этом реализовано, но факт того что это рабочее - подтверждаю на личном опыте. Делал такой "ПАУК" для одной соц сети, что собирать друзей друзей * N раз



  • @DrPrime Огромнейшее спасибо за ответ! Буду завтра разбирать


Log in to reply
 

Looks like your connection to Bablosoft was lost, please wait while we try to reconnect.