在此之前我常看到簡單的保護e-mail的作法就是把@打成at、.換成dot,目的就是為了破壞原有e-mail的規則,讓爬蟲判讀不出來這是一個有效的電子郵件,簡單易懂,卻對真的想要寫信給你的人造成困擾。
因此,以下就分析幾種躲避爬蟲爬出e-mail的方法~
##ReadMore##
首先,對於顯示在網頁上的部分,出現完整的E-Mail地址絕對是不可行,這是最容易被收錄的情況,爬蟲甚至不用拜訪你的網頁,直接在Google找資料就可以了,因此以下就逐步分析有效的對付爬蟲的方法:
用圖片來顯示E-Mail是有效的方法之一,在爬蟲不具備文字辨識下,能夠有效的防止被收錄,因為爬蟲將其視為一張圖片。
如上例,是不是看起來就像一般文字呢?facebook也是利用此方法保護信箱的位置,不過大家應該也發現問題了,這個方法麻煩的地方在於,想要寫信給你的人還得要自己把e-mail打進收件者的地方,打錯就麻煩了~.~
因此在網路上出現一種利用JavaScript的方法,來顯示信箱,一個簡單的範例如下:
<script type="text/javascript">
document.write('username@' + 'example.com');
</script>
將這段程式碼放在網頁上,最後的結果就是顯示出:
username@example.com
這樣一來就可以讓使用者複製了,而且對於爬蟲來說,他看到的是那段程式碼,因此並不符合他想收錄的信箱格式,事情真有那樣簡單?!
天不從人願,事實並非如此,事實上,只要爬蟲觀察DOM,就可以輕易的找出完整的信箱地址,用任何瀏覽器提供的開發者工具就能輕易的找出來,如下圖:
因此利用JavaScript的document.write方法並不妥當,所以利用圖片顯示是比較保險的方法,不過為了讓想要寫信給你的人方便,通常我們會用一個連結,並配合mailto的語法,讓你點email時,直接呼叫寫信的軟體,並自動填上收件人,一個簡單的例子如下:
<a href="mailto:username@example.com"><img src="mail.gif" border="0"></a>
或者因為有連結,我們也可以使用非email的文字替代連結,如下:
<a href="mailto:username@example.com">寫信給我</a>
然而,相同的問題又出現了,爬蟲只要觀察原始碼,就能輕易找出藏在href參數中的值就是信箱位置,而且這次還多了mailto這個關鍵字可以判斷,更不會跟一般的連結搞混。
有鑑於此,我們就不要讓信箱出現在href參數當中,我們利用JavaScript,讓連結的位置在當點下這個連結時才動態產生,動態的目的是因為爬蟲通常只觀察載入完畢後的DOM,只有人類才會有動作去點這個連結,而DOM也就在點擊時才發生改變,一個簡單的範例如下:
HTML:
<a href="#" onClick="m('username','example.com');">寫信給我</a>
JavaScript:
<script language="JavaScript">
function m(a,b){
var x="@";
window.location.replace("m"+'a'+"i"+'l'+"t"+'o'+":"+a+x+b);
}
</script>
你可以看的出來,href當中已經沒有任何有意義的值,我們利用onClick,讓當點下此連結時,呼叫m涵式,再利用location的方式,連結至mailto。你也看的出來,我們故意將mailto每個字母分離,並用單、雙引號來混淆視聽,甚至連涵式的名字我們都故意用m一個字母表示,絕不出現mail或sendmail之類的關鍵字。有人也許會有疑問,在呼叫m時所傳入的參數上就有除了@之外的usename與example.com!沒錯,但是對於爬蟲來說,這個字串並沒有很明顯的特徵清楚的告訴爬蟲,這是一個去掉@的信箱位置。
不過對於爬蟲,他也許會判別出所有的a標籤,並全部都去點點看,假設是普通連結,則忽略,假如是呼叫了系統預設的郵件軟體,則判定是信箱位置。這是一個很棘手的問題,對於這種『都點點看、連連看』的爬蟲,我們可以偽裝這個超連結來躲避,一個簡單的範例如下:
HTML:
<span style="cursor:pointer;" onClick="m('username','example.com');">寫信給我</span>
JavaScript:
同前例
看出來了嗎?我們避免使用a這個HTML標籤,而使用span這個標籤來代替他,並用CSS讓他看起來像連結,像是滑鼠移上去變成手指,你也可以為他加上底線跟顏色,讓他看起來更像連結。
廣告信一直以來就是一個頭痛的問題,網路上絕對沒有一種有效的方法能夠保護好信箱的位置,因為爬蟲只要換成人,什麼信箱位置都無所遁形,因此我們也只能盡量的保護我們的信箱位置,不隨便洩漏信箱,或是申請一個信箱專門對外公開,過一段時間拋棄,而真正在使用的信箱只給身旁的親友才是比較上策的方法。
歡迎提出更有效或是改進的方法!
沒有留言:
張貼留言