不少站长在网页上丢个邮箱链接,没过多久收件箱就被垃圾广告、钓鱼邮件塞爆。那些爬虫脚本满网抓取邮箱地址,跟牛皮癣广告一样烦人。这里头有个叫“混淆”的招儿挺管用——把邮箱地址搞得机器看不懂、人却能正常用。下面聊几个亲测有效的方案,按需安排上。
网站公开邮箱地址后,垃圾爬虫会自动抓取并塞垃圾邮件。解决办法是让地址对机器难读,对人易用。文中介绍四种方案:HTML注释打乱、CSS隐藏干扰码、JavaScript解码Base64、第三方表单中转。每种都附带详细步骤和避坑点,小白照着点几下就能搞定。
HTML注释法
操作流程
打开网页源码,找到要展示邮箱的地方。正常写法是email@address.com,爬虫一眼认出。改成这样:
如果联系,请发邮件至<!-- 乱入一堆废话 --> email@<!-- 再来点干扰 -->address.com页面显示效果不变,用户看到“email@address.com”。爬虫抓取源码时会顺带把注释里的内容也拿进去,但注释里的字符打断了邮箱格式,不少简单爬虫就认不出来了。
细节进阶
需要mailto:链接的话,把href属性也做手脚:
<a href="mailto:email<!-- 加料 -->@<!-- 加料 -->address.com">发邮件</a>注意注释别夹在邮箱关键字符中间,比如e<!-- -->mail会变成“email”少字母。每个片段至少保留完整字母。另外有些高级爬虫会先剔除注释再匹配,这招对它们失效。可以配合反转顺序使用:
<!-- 前半段 --> address.com <!-- 后半段 --> email@然后在显示时靠CSS的unicode-bidi属性调回来?有点复杂,简单场景用第一个方法就够了。
CSS障眼法
加点干扰再藏起来
HTML里写真实邮箱,但中间塞一堆废话并用span包住,然后CSS让这堆废话不显示。步骤:
第一步,构造HTML:
<p>联系邮箱:<span class="hideSpam" aria-hidden="true">别爬了求求</span> email@<!-- 再来点 -->address.com</p>第二步,写CSS:
span.hideSpam {
display: none;
}用户看到“联系邮箱:email@address.com”。爬虫抓源码时那堆“别爬了求求”还在,打乱了邮箱模式。aria-hidden="true"确保读屏软件忽略废话,不影响无障碍访问。
多重干扰加强版
多塞几层不同类名的隐藏元素:
email<span class="x1" aria-hidden="true">【广告位招租】</span>@<span class="x2" aria-hidden="true">【爬虫退散】</span>address.<span class="x3" aria-hidden="true">【已防护】</span>comCSS分别隐藏.x1、.x2、.x3。爬虫需要同时识别并移除多个不同类名,难度提升。不过注意mailto:链接里用这招会失效,因为href属性值里的干扰码不会被CSS处理,链接会变成无效地址。
JS解码术
Base64编解码一条龙
把邮箱地址转成乱码,等页面加载完再用JS还原。具体分三步:
第一步,找个在线编码工具(搜“base64编码”就有),输入邮箱如hello@example.com,得到编码结果aGVsbG9AZXhhbXBsZS5jb20=。
第二步,写HTML占位:
<a id="mailLink" href="">点我发邮件</a>第三步,在页面底部或单独JS文件里写:
var encodedMail = "aGVsbG9AZXhhbXBsZS5jb20=";
var linkElement = document.getElementById("mailLink");
linkElement.setAttribute("href", "mailto:" + atob(encodedMail));atob是浏览器内置方法,把Base64字符串解码回原文。页面打开后,链接的href变成mailto:hello@example.com,点击就能调起邮件客户端。
动态插入内容
不想用链接,直接显示邮箱文本也行:
<span id="mailSpan"></span>
<script>
var coded = "aGVsbG9AZXhhbXBsZS5jb20=";
document.getElementById("mailSpan").innerText = atob(coded);
</script>进阶玩法:用凯撒密码,比如每个字母往后移三位。写个解密函数,爬虫看不懂JS逻辑就抓瞎。但注意JS必须能正常运行,如果浏览器关了JS,邮箱位置就是空白。可以加个<noscript>提示:“启用JavaScript查看邮箱”。
嵌入表单法
第三方服务中转
完全不公开邮箱,访客通过表单填消息,服务商转发到邮箱。注册某表单服务(搜“表单后端服务”能找到免费档),拿到专属的action地址。复制以下代码到网页:
<form action="https://某服务.com/f/你的密钥" method="POST">
<label> 你的邮箱:
<input type="email" name="email" />
</label>
<label> 消息内容:
<textarea name="message"></textarea>
</label>
<input type="text" name="_gotcha" style="display:none" />
<button>发送</button>
</form>注意那个隐藏的_gotcha输入框。真人看不到也不会填,但有些机器人会无脑填满所有表单域。服务端发现这个字段有内容就直接扔进垃圾堆,不转发邮件。
自定义字段和防刷
可以增加更多字段,比如姓名、主题。在action地址后加?参数或者修改表单内name属性。另外可以加验证码(reCAPTCHA类服务),但会稍微麻烦点。不想依赖第三方的话,自己写后端接收表单再发邮件,那就得伺候服务器了。
| 方案名 | 上手难度 | 需要JS | mailto支持 | 防爬强度 |
|---|---|---|---|---|
| HTML注释 | 极低 | 否 | 部分可用 | 弱 |
| CSS障眼 | 低 | 否 | 否 | 中等 |
| JS解码 | 中 | 是 | 是 | 较强 |
| 嵌入表单 | 中高 | 否 | 否 | 最强 |
挑哪个:随便摆个联系方式用HTML注释够快;想要mailto链接又不怕JS关闭的,上JS解码;完全不差事、只想收消息的,直接表单走起。记得每个方案都有适用场景,按需抄代码就完事了。
