JavaScript | Список ссылок сайта — efim360.ru

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

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

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

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

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

 

Видеоролик о том, как собирать список ссылок сайта при помощи только браузера и JavaScript

 

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

// Набор уникальных внутренних адресов

let naborIN = new Set()

// Идентификатор таймера

let si

// Счётчик

let counter = -1

 

let scaner = async () => {

    // Начало работы сканера. Первичный вызов.

    if(counter == -1){

        naborIN.add(location.origin)

        counter+=1

        return console.log("---Сканирование началось---")

    }

 

    // Условие окончания работы сканера

    if(counter>=[...naborIN].length){

        clearInterval(si)

        return console.log("---Сканирование завершено---")

    }

 

    // Получение адреса для сканирования

    let scanURI = [...naborIN][counter]

    console.log(`Сканируется: ${scanURI}`)

 

    // Выборка строки HTML-разметки с сервера

    let str = await fetch(scanURI).then(resp=>resp.text())

 

    let scanDoc = new DOMParser().parseFromString(str, "text/html")

    let arrHrefs = [...scanDoc.getElementsByTagName("a")].map(i=>i.href)

    let aIN = arrHrefs.filter(i=>i.includes(location.origin))

    aIN

      .map(i=>i.replace(/\?.+/g, "").replace(/\#.+/g, ""))

      .map(i=>naborIN.add(i))

    return counter+=1

}

 

// Вызов сканера

si = setInterval(scaner, 5000)

 

 

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

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

  1. Запускаешь браузер на ПК - Google Chrome, Opera, Mozilla и т.п..
  2. Открываешь в браузере любую страницу сайта, с которого хочешь получить список ссылок
  3. Открываешь "инструменты разработчика" на той вкладке, в которой открыт нужный тебе сайт
  4. Выделяешь текст кода "Скрипт сбора внутренних ссылок сайта" на этом сайте. Копируешь.
  5. Переходишь в инструментах разработчика на вкладку "Console"
  6. Вставляешь в белое поле "Скрипт сбора внутренних ссылок сайта"
  7. Нажимаешь 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 остановит работу сканера.

 

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

Заново запускаете сканер и устанавливаете переменную "counter" на последний номер этапа сканирования до падения. Основной массив уже будет иметь предыдущие результаты сканирования и индексы найденных адресов.

 

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

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

 

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

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

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

Стандарт Fetch - https://fetch.spec.whatwg.org

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

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

 

Версия 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)

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