Як знайти всі посилання / сторінки на веб-сайті


98

Чи можна знайти всі сторінки та посилання на БУДЬ-ЯКОМУ веб-сайті? Я хотів би ввести URL-адресу та створити дерево каталогів усіх посилань із цього сайту?

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


2
crawlmysite.in - сайт не існує
Sarah Trees

Відповіді:


70

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


дякую, Хенк! Ідеально - саме те, що мені було потрібно. Дуже ціную.
Джонатан Ліон

2
Хороший інструмент. Я використовував "XENU link sleuth before". Linkchecker набагато детальніший.
Mateng

як я можу це зробити сам? а що, якщо на веб-сайті немає файлу robots.txt?
Алан Коромано

1
@MariusKavansky Як вручну сканувати веб-сайт? Або як ви будуєте гусеничний робот? Я не впевнений, що розумію ваше запитання. Якщо robots.txtфайлу немає , це просто означає, що ви можете повзати до душі.
Hank Gay

8
привіт, хлопці, linkchecker у мене не спрацював, коли я сканую сайт, він повертає лише повідомлення про непрацюючі посилання. Дуже маленький звіт. хоча вони перевіряли тисячі посилань, але я не бачу, де про них повідомляється. Використовуючи версію 9.3, будь ласка, допоможіть?
JayPex

43

Якщо у вашому браузері є консоль розробника (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?
Pacerier

Як що? Що ви маєте на увазі?
ElectroBit

2
Я маю на увазі посилання, зроблене за допомогою Javascript. Ваше рішення цього не показало б.
Pacerier

2
@ElectroBit Мені це дуже подобається, але я не впевнений, на що дивлюсь? Що таке $$оператор? Або це просто довільне ім'я функції, так само, як n=ABC(''a'); я не розумію, як urlsотримуються всі позначені тегом елементи "a". Ти можеш пояснити? Я припускаю, що це не jQuery. Про яку функцію бібліотеки-прототипу ми говоримо?
zipzit

1
@zipzit У декількох браузерах це, $$()в основному, скорочення document.querySelectorAll(). Більше інформації за цим посиланням: developer.mozilla.org/en-US/docs/Web/API/Document/…
ElectroBit

1

Іншою альтернативою може бути

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.

Однак це не так просто, як ви могли подумати. Багато веб-сторінок мають неправильну форму. Витягнути всі посилання програмно, які людина може «розпізнати», насправді важко, якщо потрібно врахувати всі неправильні вирази.

Удачі!


18
Ні ні, ні, не розбирайте 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;
}

спробуйте цей код ....


10
Хоча ця відповідь, вірогідно, правильна та корисна, бажано, якщо ви додасте до неї якесь пояснення, щоб пояснити, як це допомагає вирішити проблему. Це стає особливо корисним у майбутньому, якщо відбудеться зміна (можливо, не пов’язана), яка призведе до того, що вона перестане працювати, і користувачі повинні зрозуміти, як це колись працювало.
Kevin Brown

2
Е, це трохи довго.
ElectroBit

1
Зовсім непотрібно аналізувати html таким чином у php. php.net/manual/en/class.domdocument.php PHP має можливість зрозуміти DOM!
JamesH
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.