使链接完全不可见?

Jul*_*ano 9 html web-crawler hyperlink

我很确定很多人都想过这个,但由于某些原因我无法使用Google和StackOverflow搜索找到它.

我想将一个看不见的链接(由robots.txt列入黑名单)到一个CGI或PHP页面,它将"陷阱"恶意机器人和蜘蛛.到目前为止,我已经尝试过:

  1. 身体中的空链接:

    <a href='/trap'><!-- nothing --></a>
    
    Run Code Online (Sandbox Code Playgroud)

    这大部分时间都很好用,有两个小问题:

    问题:链接是文档正文的一部分.即使用鼠标几乎无法点击,一些访问者仍然无意中击中了键盘 - 用Tab和导航网站Enter.此外,如果他们将页面复制粘贴到文字处理器或电子邮件软件中,例如,陷阱链接被复制,有时甚至可以点击(某些软件不喜欢空<a>标签并将href复制为文本的内容)标签).

  2. 体内隐形块:

    <div style="display:none"><a href='/trap'><!-- nothing --></a></div>
    
    Run Code Online (Sandbox Code Playgroud)

    这解决了键盘导航的问题,至少在我测试的浏览器中.从页面的正常显示中有效地无法访问该链接,而对于大多数具有当前智能水平的蜘蛛机器人仍然完全可见.

    问题:链接仍然是DOM的一部分.如果用户复制粘贴页面的内容,则会再次出现.

  3. 内部评论栏:

    <!-- <a href='/trap'>trap</a> -->
    
    Run Code Online (Sandbox Code Playgroud)

    这有效地从页面的DOM中删除了链接.从技术上讲,注释仍然是DOM的一部分,但它实现了合规用户代理不会生成A元素的预期效果,因此它不是实际链接.

    问题:现在大多数蜘蛛机器人都足够聪明,可以解析(X)HTML并忽略评论.我个人看到机器人使用Internet Explorer COM/ActiveX对象来解析(X)HTML并通过XPath或Javascript提取所有链接.这些类型的机器人不会陷入跟踪陷阱超链接.

直到昨晚我才使用方法#3,当时我被一群机器人击中,这些机器人似乎对他们所遵循的链接非常有选择性.现在我回到方法#2,但我仍然在寻找一种更有效的方法.

我错过了任何建议,或其他不同的解决方案?

San*_*ken 12

像你说的那样添加它:

<a id="trap" href='/trap'><!-- nothing --></a>
Run Code Online (Sandbox Code Playgroud)

然后用javascript/jQuery删除它:

$('#trap').remove();
Run Code Online (Sandbox Code Playgroud)

垃圾邮件机器人不会执行javascript并看到该元素,几乎任何浏览器都会删除该元素,因此无法点击它

编辑:最简单的非jQuery方式是:

<div id="trapParent"><a id="trap" href='/trap'><!-- nothing --></a></div>
Run Code Online (Sandbox Code Playgroud)

然后用javascript删除它:

var parent = document.getElementById('trapParent');
var child = document.getElementById('trap');
parent.removeChild(child);
Run Code Online (Sandbox Code Playgroud)