Как найти все ссылки / страницы на сайте

100

Можно ли найти все страницы и ссылки на ЛЮБОМ сайте? Я хочу ввести URL-адрес и создать дерево каталогов всех ссылок с этого сайта?

Я посмотрел на HTTrack, но он загружает весь сайт, и мне просто нужно дерево каталогов.

Джонатан Лайон
источник
2
crawlmysite.in - сайт не существует
Sarah Trees

Ответы:

70

Проверьте linkchecker - он просканирует сайт (при соблюдении robots.txt) и сгенерирует отчет. Оттуда вы можете создать сценарий решения для создания дерева каталогов.

Хэнк Гей
источник
большое спасибо, Хэнк! Идеально - именно то, что мне нужно. Очень признателен.
Джонатан Лайон,
2
Хороший инструмент. Раньше я использовал "поиск ссылок XENU". Linkchecker гораздо более подробный.
Mateng
как мне самому это сделать? а что, если на веб-сайте нет robots.txt?
Алан Коромано
1
@MariusKavansky Как вручную сканировать веб-сайт? Или как построить краулер? Я не уверен, что понимаю ваш вопрос. Если robots.txtфайла нет , это просто означает, что вы можете сканировать сколько душе угодно.
Hank Gay
8
Привет, ребята, у меня не работает проверка ссылок, когда я просматриваю сайт, он возвращает только отчет о битых ссылках. Очень маленький отчет. пока это происходит, они проверили тысячи ссылок, но я не вижу, где о них сообщается. Не могли бы вы помочь, используя версию 9.3?
JayPex 05
46

Если в вашем браузере есть консоль разработчика (JavaScript), вы можете ввести этот код в:

urls = document.querySelectorAll('a'); for (url in urls) console.log(urls[url].href);

Укороченный:

n=$$('a');for(u in n)console.log(n[u].href)
ЭлектроБит
источник
1
А как насчет URL-адресов "Javascript-ed"?
Pacerier
Как что? Что вы имеете в виду?
ElectroBit
2
Я имею в виду ссылку, сделанную с использованием Javascript. Ваше решение этого не покажет.
Pacerier 06
2
@ElectroBit Мне это очень нравится, но я не уверен, на что я смотрю? Какой $$оператор? Или это просто произвольное имя функции, так же как n=ABC(''a'); я не понимаю, как urlsполучить все элементы с тегами 'a'. Вы можете объяснить? Я предполагаю, что это не jQuery. О какой функции библиотеки прототипов идет речь?
zipzit
1
@zipzit В некоторых браузерах $$()это сокращение от document.querySelectorAll(). Больше информации по этой ссылке: developer.mozilla.org/en-US/docs/Web/API/Document/…
ElectroBit
2

Другой альтернативой может быть

Array.from(document.querySelectorAll("a")).map(x => x.href)

С твоим $$( еще короче

Array.from($$("a")).map(x => x.href)
Себастьян
источник
плюс 1 - вот так вы используете современный JS. Я запустил эту программу, и хотя она вернула несколько ссылок, она не вернула все страницы .html, которые находятся на верхнем уровне. Есть ли причина, по которой все страницы не возвращаются в список массивов? Спасибо
Chris22
0

Если это вопрос программирования, я бы посоветовал вам написать собственное регулярное выражение для анализа всего извлеченного содержимого. Целевые теги - это IMG и A для стандартного HTML. Для JAVA,

final String openingTags = "(<a [^>]*href=['\"]?|<img[^> ]* src=['\"]?)";

это вместе с классами Pattern и Matcher должно определять начало тегов. Добавьте тег LINK, если вам также нужен CSS.

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

Удачи!

Mizubasho
источник
19
Нет, нет, нет, не анализируйте HTML с помощью регулярных выражений , это заставит младенца Иисуса плакать!
dimo414
-2
function getalllinks($url) {
    $links = array();
    if ($fp = fopen($url, 'r')) {
        $content = '';
        while ($line = fread($fp, 1024)) {
            $content. = $line;
        }
    }
    $textLen = strlen($content);
    if ($textLen > 10) {
        $startPos = 0;
        $valid = true;
        while ($valid) {
            $spos = strpos($content, '<a ', $startPos);
            if ($spos < $startPos) $valid = false;
            $spos = strpos($content, 'href', $spos);
            $spos = strpos($content, '"', $spos) + 1;
            $epos = strpos($content, '"', $spos);
            $startPos = $epos;
            $link = substr($content, $spos, $epos - $spos);
            if (strpos($link, 'http://') !== false) $links[] = $link;
        }
    }
    return $links;
}

попробуйте этот код ....

user4318981
источник
10
Хотя этот ответ, вероятно, правильный и полезный, желательно, чтобы вы включили вместе с ним некоторые пояснения, чтобы объяснить, как он помогает решить проблему. Это станет особенно полезным в будущем, если произойдет изменение (возможно, не связанное с этим), из-за которого он перестанет работать, и пользователям необходимо понять, как он работал раньше.
Кевин Браун
2
Эх, это немного длинновато.
ElectroBit
1
Совершенно необязательно анализировать html таким образом в php. php.net/manual/en/class.domdocument.php PHP действительно способен понимать DOM!
JamesH