Оптимальный алгоритм парсинга для BAS
-
@ruzne без разницы какой рефер, интересует алгоритм обхода графа, а не как обмануть сайт.
-
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 Огромнейшее спасибо за ответ! Буду завтра разбирать