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

137

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

我查看了HTTrack,但那会下载整个站点,而我只需要目录树。


2
crawlmysite.in - 网站不存在 - Sarah Trees
5个回答

92

看看 linkchecker 吧,它可以爬取网站(同时遵守robots.txt),并生成报告。 从那里,您可以编写脚本来创建目录树。


2
一个不错的工具。我之前一直在使用“XENU链接检查器”。Linkchecker更加详细。 - Mateng
1
@MariusKavansky 你如何手动爬取网站?或者说你如何构建一个网络爬虫?我不确定我是否理解你的问题。如果没有robots.txt文件,那就意味着你可以放心爬取。 - Hank Gay
1
这是一个非常棒的小程序! - Arash Saidi
10
大家好,当我扫描网站时,链接检查器对我没有起作用,它只返回了一个关于损坏链接的非常小的报告。虽然它确实检查了成千上万个链接,但我看不到它们在哪里报告。我使用的是9.3版本,你能帮忙吗? - Jay
3
常见的写入文件的命令是 linkchecker https://example.com --file-output=csv --verbose。也可以选择不同的格式。 - laimison
显示剩余5条评论

64

如果您在浏览器中拥有开发者控制台(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)

2
“Javascript-ed”网址怎么样? - Pacerier
像什么?你是什么意思? - ElectroBit
3
我的意思是使用Javascript创建一个链接。你的解决方案不会显示它。 - Pacerier
3
@ElectroBit,我真的很喜欢它,但我不确定我在看什么?$$运算符是什么?还是只是一个任意的函数名,就像n=ABC(''a');一样。我不明白urls如何获取所有'a'标记元素。你能解释一下吗?我假设这不是jQuery。我们在谈论哪个原型库函数? - zipzit
2
@zipzit 在一些浏览器中,$$() 基本上是 document.querySelectorAll() 的简写。更多信息请参见此链接:https://developer.mozilla.org/en-US/docs/Web/API/Document/querySelectorAll - ElectroBit
显示剩余2条评论

6

另一个选择可能是

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类一起使用可以检测标签的开始。如果您还想要CSS,请添加LINK标签。

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

祝你好运!


23
不不不,不要使用正则表达式解析HTML,这会让小耶稣哭泣! - dimo414

-1
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;
}

尝试这段代码...


11
尽管这个答案可能是正确和有用的,但最好在其中包含一些解释,以说明它如何帮助解决问题。如果将来发生任何变化(可能是不相关的),导致答案无法正常工作,用户需要了解其原理,那么解释会变得尤为有用。 - Kevin Brown-Silva
3
嗯,这有点 - ElectroBit
2
在PHP中以这种方式解析HTML是完全不必要的。http://php.net/manual/en/class.domdocument.php PHP确实有理解DOM的能力! - JamesH

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接