0%

[Python] 爬蟲遇到 email protected 的原因與解決方法

前言

爬蟲盛行的年代,防爬蟲的技術也隨之而起,其中一種技術是將電子郵件編碼,藉由網頁載入 js 後還原回正常的電子郵件格式。但是這種防禦手法效用可以說是微乎其微,甚至還要多花時間去解碼,可以說是得不償失。

沒有效用的原因有很多,主要是因為這不是加密解密問題,單純只是編碼與解碼,所以非常容易破解。再者,可以使用 selenium 等網頁載入好再進行爬蟲的動作。

雖然如此,現在遇到這項技術還是要研究一下其原理,為了以後遇到其他問題時可以有不一樣的思路。

問題解析

在爬蟲時遇到電子郵件的地方有可能會顯示被加密的狀態,例如

1
<span class="__cf_email__" data-cfemail="f2f0ded3dcd1dad7c6c6f2">[email&#160;protected]</span>

真正的電子郵件被編碼變成 data-cfemail 屬性的數值,這長長一串都是 16 進位的表示,且分為兩個部分

  1. 密鑰:前兩碼為密鑰的 16 進位表示法。
  2. 信箱本體:除了密鑰,都為信箱本體,每兩個字元分為一組。

採取最簡單的異或 (xor) 編碼方法,也就是密鑰與信箱本體依序的去做 xor運算,所得結果即為編碼後的結果。

解決方法

知道規則後,接下來只要解碼就可以了。若要解碼,對編碼後的數值多 xor 一次,就能得到原本的信箱字串

1
2
3
4
5
6
7
8
9
10
codedMail = '4D08202C242108232E222924232A0d39283E39632E222063393A'
key = int(codedMail[:2], 16) # 前兩字元為 16 進位的密鑰
codedMail = codedMail[2:] # 刪除前兩字元
EMail = ''
while len(codedMail) != 0:
temp = int(codedMail[:2], 16) # 每兩碼當一個 16 進位的數字
EMail += chr(key ^ temp) # 做 xor 運算後為正確的 ascii 碼,再轉為字元
codedMail = codedMail[2:] # 繼續刪除前兩碼
print(EMail)
# EmailEncoding@test.com.tw

參考文獻

  1. 破解爬虫过程中遇到的网页加密Email地址
很高興能在這裡幫助到您,歡迎登入 Liker 為我鼓掌 5 次,或者成為我的讚賞公民,鼓勵我繼續創造優質文章。
以最優質的內容回應您的鼓勵