JavaScript | Список ссылок сайта

Как получить все ссылки с сайта?

В этой публикации вы найдёте самый примитивный алгоритм, который умеет собирать все ссылки сайта при помощи языка программирования JavaScript, а также браузерного API. В готовом скрипте не будет ничего лишнего. Более того, он будет максимально облегчён для любого пользователя. Не нужно ничего устанавливать, подключать, экспортировать и т.п.. Максимально легко.

Если тебе уже не терпится начать сканировать чей-то сайт, тогда копируй скрипт и запускай его в своём браузере. Но на построение ссылочного профиля может уйти приличное время, так что учитывай этот нюанс.

Также знай, что тебя в любой момент может заблокировать веб-сервер сканируемого сайта, а ещё может упасть сеть, а ещё ты можешь закрыть вкладку, а ещё у тебя может не хватить оперативной памяти, а ещё … много чего ещё. Версия простая, а значит не отрабатывает все возможные «препятствия» и «преграды». Не ставь завышенных ожиданий, просто воспользуйся и пойми — подходит или нет.

По-умолчанию сканер работает только с HTTPS сайтами и при необходимости переписывает URI-схему ссылок с HTTP на HTTPS. По-прежнему встречаются сайты, где вручную редактировались ссылки с абсолютными путями. Они 5 лет назад «шлёпнули» HTTP ссылку на какой-то странице, а потом сайт переехал на HTTPS. Для пользователей веб-сервер, конечно же, редиректит «старый» протокол 1.1 на 2.0, ну а сканер просто переписывает такие ссылки на новый лад.

 

Скрипт сбора внутренних ссылок сайта

var mainArray = []; var mainCounter = 0; var timerDelay = ("efim360.ru".length * "https://efim360.ru/javascript-spisok-ssylok-sajta/".length) * 2; var mainURIscheme = "https:"; Array.prototype.unique = function () { return Array.from(new Set(this)).sort() }; Array.prototype.toHTTPS = function () { return this.map(i=>{i.protocol = mainURIscheme; return i}) }; function scan(arr){ if(mainArray[0]==undefined){ mainArray[0] = [arr, false]; setTimeout(newScanUri, timerDelay, mainArray[0]) }else{ setTimeout(newScanUri, timerDelay, arr) } }; function newScanUri(arr){ var arrUri = arr[0]; fetch(arrUri, {redirect: "manual"}) .then(res => res.text()) .then(resBody => resBody) .then(str => { arr[1] = true; var x = arrayInternalLinksFromString(str); console.log(`№ ${mainCounter}: внутренних ${x.length} шт`); is_in_the_main_array (x); console.log(`Уникальных: ${mainArray.length} шт`); mainCounter ++; if (mainCounter > mainArray.length){console.log(`Сбор ссылок завершён!!! Собрано ${mainArray.length} внутренних адресов`)} else{scan(mainArray[mainCounter])} }) }; function arrayInternalLinksFromString(str){ var nDoc = new DOMParser().parseFromString(str, "text/html"); var nHTMLcoll = nDoc.getElementsByTagName("a"); var nArr = Array .from(nHTMLcoll) .filter(i => i.hostname == nDoc.domain) .toHTTPS() .map(i => {if(i.hash != "" || i.search != ""){return i.origin + i.pathname}else{return i.origin + i.pathname}}) .unique(); return nArr } function is_in_the_main_array (arr) { console.log("Обновление массива"); for (i = 0; i < arr.length; i++){ if (mainArray.find(x=>x[0]==arr[i]) == undefined) {mainArray.push( [arr[i],false] ); console.log("Элемент добавлен")} else if(arr[i] == mainArray.find(x=>x[0]==arr[i])[0] && mainArray.find(x=>x[0]==arr[i] && x[1]==false) == undefined) {continue} else if(arr[i] == mainArray.find(x=>x[0]==arr[i])[0] && mainArray.find(x=>x[0]==arr[i] && x[1]==true) == undefined) {continue} } }

Как запустить скрипт? Команда запуска скрипта

scan(document.location.origin)

 

Как собрать все ссылки с сайта?

Пошаговая инструкция:

  1. Запускаешь браузер — Google Chrome, Opera, Mozilla и т.п..
  2. Открываешь в браузере любую страницу сайта, с которого хочешь получить список ссылок
  3. Открываешь «инструменты разработчика» на той вкладке, в которой открыт нужный тебе сайт
  4. Выделяешь текст кода «Скрипт сбора внутренних ссылок сайта» на этом сайте. Копируешь.
  5. Переходишь в инструментах разработчика на вкладку «Console«
  6. Вставляешь в белое поле «Скрипт сбора внутренних ссылок сайта«
  7. Нажимаешь Enter
  8. Копируешь команду сканирования — «scan(document.location.origin)»
  9. Вставляешь команду сканирования на вкладке «Console» в свободное белое поле
  10. Нажимаешь Enter

После этого твой браузер начнёт собирать список всех внутренних ссылок нужного тебе сайта.

 

Карта ссылок сайта

Хочу заранее определиться с тем, что я буду считать картой сайта. Для меня это набор всех внутренних ссылок, которые ведут на какие-либо страницы контента в пределах одной доменной зоны. То есть если мы говорим о сайте «example.com«, то я имею ввиду все его ссылки вида:

  • example.com/vasya
  • example.com/vasya/petya
  • example.com/vasya/petya/dima
  • example.com/vasya/petya/kolya

…и тому подобное

Запусти скрипт, чтобы собрать все ссылки с сайта и облегчить себе работу по дальнейшему анализу контента на них. Так ты сможешь узнать сколько страниц товаров есть у конкурентов.

Для кого создан этот сканер сайтов?

В первую очередь для людей, которым просто нужны все ссылки сайта, и которые уже перепробовали все остальные методы получения карты сайта. Предполагается, что человек, читающий эту публикацию, уже знает что такое «sitemap.xml», знает как получить все индексированные страницы сайта из поисковиков Google и Yandex (прям из строки поиска). Сканер поможет ответить на вопрос «как посмотреть все ссылки на сайте?».

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

В этой статье описан процесс того, как вытащить с стороннего сайта все ссылки с помощью js.

 

Что пропускает сканер?

Сканер не учитывает URI-запросы и URI-фрагменты. Он их просто отрезает и складывает очищенный адрес. Если этого не делать, то сканер просто утонет в череде страниц-пагинаций и всяческих страниц-фильтраций. Это технические страницы, которые нужны для корректной работы самого сайта, но не для сбора ссылок на них.

На 2021 год могут встречаться сайты, работающие на URI-запросах, но это уже «сайт-динозавр». На таком ископаемом, скорее всего, будет мало полезной информации. Сканер ориентирован на сайты с ЧПУ-адресами.

Также сканер пропускает любые внешние ссылки (исходящие). То есть он отбрасывает все ссылки, которые не ведут на тот же самый ORIGIN (источник). Это значит, что сканер не пойдёт в далёкие дали бездонного интернета и не будет «пылесосить» триллионы страниц каких-то внешних сайтов типа соцсетей, интернет-магазинов, статейников, новостников и прочего. Сканер работает только внутри одного доменного имени.

 

Когда сканер перестаёт работать?

Любое падение сети остановит работу сканера, но данные будут сохранены в массиве и их всегда можно будет получить.

Любое падение сертификата для протокола HTTPS остановит работу сканера.

 

Как докачать данные после падения?

Заново запускаете сканер и устанавливаете переменную «mainCounter» на последний номер этапа сканирования до падения.

 

Как сохранить данные после сканирования?

Если ты не знаешь как это сделать, тогда просто напиши мне сообщение на электронную почту, которая указана в разделе «Контакты«. Мне нужна обратная связь.

 

Информационные ссылки

Стандарт ECMAScript — https://tc39.es/ecma262/

Стандарт DOM — https://dom.spec.whatwg.org

Стандарт Fetch —

Перевод стандарта DOM на русский язык — https://efim360.ru/dom/

JavaScript | Как получить все ссылки на HTML-странице?

Поделись записью