如何查找网站上的所有链接/页面


97

是否可以在任何给定的网站上找到所有页面和链接?我想输入URL并生成该站点所有链接的目录树吗?

我看过HTTrack,但是下载了整个网站,我只需要目录树。


2
crawlmysite.in-网站不存在
Sarah Trees

Answers:


70

检出linkchecker-它会爬行网站(同时遵循robots.txt)并生成报告。从那里,您可以编写脚本来创建目录树。


非常感谢Hank!完美-正是我所需要的。非常感谢。
乔纳森·里昂,

2
一个不错的工具。我之前使用过“ XENU链接侦听”。Linkchecker更为冗长。
Mateng

我自己该怎么做?如果网站上没有robots.txt,该怎么办?
艾伦·科罗马诺

1
@MariusKavansky您如何手动抓取网站?或如何建立搜寻器?我不确定我是否理解您的问题。如果没有robots.txt文件,那就意味着您可以抓紧自己的内心。
汉克·盖伊

8
嗨,大家好,当我扫描站点时,linkchecker不适用于我,它仅返回断开链接的报告。很小的报告。虽然它确实检查了数千个链接,但我看不到报告的位置。使用9.3版是否可以提供帮助?
JayPex

42

如果浏览器中具有开发者控制台(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
那“ Javascript-ed”网址呢?
Pacerier

像什么?你什么意思?
ElectroBit 2015年

2
我的意思是使用Javascript完成的链接。您的解决方案不会显示出来。
Pacerier,2015年

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页面。为什么所有页面都没有返回数组列表有原因吗?谢谢
克里斯22

0

如果这是一个编程问题,那么我建议您编写自己的正则表达式来解析所有检索到的内容。目标标记是IMG和A,用于标准HTML。对于JAVA,

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

这与Pattern和Matcher类一起应该可以检测标记的开头。如果还需要CSS,请添加LINK标记。

但是,这并不像您最初想象的那么容易。许多网页格式不正确。如果您需要考虑所有不规则表达,那么以编程方式提取人类可以“识别”的所有链接确实非常困难。

祝好运!


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
尽管此答案可能是正确且有用的,但如果您在其中包含一些解释以说明它如何帮助解决问题,则最好使用该答案。如果发生更改(可能不相关)导致它停止工作,并且用户需要了解它曾经如何工作,那么这在将来特别有用。
凯文·布朗

2
嗯,有点长。
ElectroBit

1
完全不需要以这种方式在php中解析html。php.net/manual/en/class.domdocument.php PHP确实具有理解DOM的能力!
JamesH 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.