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

Posted

技术标签:

【中文标题】如何查找网站上的所有链接/页面【英文标题】:How to find all links / pages on a website 【发布时间】:2010-11-29 04:29:30 【问题描述】:

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

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

【问题讨论】:

crawlmysite.in - 网站不存在 【参考方案1】:

查看linkchecker——它会爬取网站(同时服从robots.txt)并生成报告。从那里,您可以编写用于创建目录树的解决方案。

【讨论】:

非常感谢汉克!完美——正是我所需要的。非常感谢。 一个不错的工具。我之前使用的是“XENU 链接侦探”。 Linkchecker 更加冗长。 我自己该怎么做?如果网站中没有 robots.txt 怎么办? @MariusKavansky 您如何手动抓取网站?或者你如何构建一个爬虫?我不确定我是否理解你的问题。如果没有robots.txt 文件,那只是意味着你可以爬到你心中的内容。 大家好,当我扫描网站时,linkchecker 对我不起作用,它只返回断开链接的报告。非常小的报告。虽然确实如此,但他们检查了数千个链接,但我看不到这些链接的报告位置。使用 9.3 版可以请您帮忙吗?【参考方案2】:

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

【讨论】:

“Javascript-ed”网址怎么样? 像什么?什么意思? 我的意思是使用 Javascript 完成的链接。您的解决方案不会显示它。 @ElectroBit 我真的很喜欢它,但我不确定我在看什么? $$ 运算符是什么?或者只是an arbitrary function name, 与n=ABC(''a'); 相同我不明白urls 如何获取所有'a' 标记元素。你可以解释吗?我假设它不是 jQuery。我们在说什么原型库函数? @zipzit 在少数浏览器中,$$() 基本上是document.querySelectorAll() 的简写。此链接的更多信息:developer.mozilla.org/en-US/docs/Web/API/Document/…【参考方案3】:

另一种选择可能是

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

$$( 更短

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

【讨论】:

加 1 - 就像您正在使用现代 JS。我运行了这个程序,虽然它返回了一些链接,但它并没有返回顶层的所有 .html 页面。数组列表中没有返回所有页面是否有原因?谢谢【参考方案4】:

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

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

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

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

祝你好运!

【讨论】:

不不不不,don't parse HTML with regex,它让耶稣宝宝哭了!【参考方案5】:
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;

试试这个代码....

【讨论】:

虽然这个答案可能是正确且有用的,但最好在其中附上一些解释来解释它如何帮助解决问题。如果有更改(可能不相关)导致它停止工作并且用户需要了解它曾经是如何工作的,这在未来变得特别有用。 呃,有点长。 完全没有必要在 php.ini 中以这种方式解析 html。 php.net/manual/en/class.domdocument.phpPHP 确实有理解 DOM 的能力!

以上是关于如何查找网站上的所有链接/页面的主要内容,如果未能解决你的问题,请参考以下文章

PHP 查找页面上的所有链接

PHP 查找页面上的所有链接

查找页面上的所有时间(H:i)字符串并转换为UTC

如何使用Selenium WebDriver查找错误的链接?

如何使用python在网站中查找反向链接[关闭]

查找页面上的所有链接