破解爬虫过程中遇到的网页异或加密Email地址

1、问题来源

在数据采集过程中,经常有需要采集各种联系方式,其中就包括电子邮箱地址。一些毫不设防的网站的电子邮件地址可以直接从网页源码中获取到,而一些稍微有点防备爬虫意识的网站会将电子邮箱中的@符号替换为#号:

最近工作中,遇到一种之前从未遇到过的电子邮箱加密方式。在审查元素的时候能够获取到正确的数据:

查看网页源码的时候,也能够定位到相应的元素:

但是从上图中,可以发现,其对应于显示电子邮箱的位置,显示的是一个“[email protected]”的链接,我们查看一下源码:

这个显示电子邮箱的字段与显示其他文字的结构不一样,如果是非电子邮箱数据,则没有a链接;如果是电子邮箱数据,那么则是通过这个a链接在网页前端中显示出数据。

2、解决方法

通过一番搜索,在百度知道中发现了其原理和解决思路:

只是简单的异或运算加密,解密起来并不困难。

3、Python实现

通过这位大神的解决思路,我们可以很快速地使用Python写一个解密电子邮箱的函数。

首先提取出真实邮箱地址的加密数据:

出于隐私考虑,在此使用百度知道上公开的电子邮箱的加密字符串

import re
from urllib.parse import unquote

email_str = '71121003141403311a140210051e5f121e1c'

然后将这个加密数据两两分割为一个列表:

email_list = re.findall(r'.{2}',email_str)

提取出加密字符串的密钥,即字符串的前两个字符:

key = email_list[0]

定义一个空列表,用于存储十六进制异或运算的结果:

ll = []

对剩余的加密字符串进行遍历,在遍历中与密钥进行异或运算,结果添加到ll列表中:

    for e in email_list[1:]:
        # 对十六进制进行异或运算
        r = hex(int(key,16) ^ int(e,16))
        ll.append(r)

接着对列表中的结果进行字符串拼接和替换:

    # 拼接运算后的字符串
    a = ''.join(ll)
    # URL解码字符串
    email = unquote(a.replace('0x','%'))

这样,email的值就是加密字符串的真实电子邮箱地址:


是不是很简单?欢迎关注微信公众号:州的先生 交流讨论:)

猜你也喜欢

发表评论

电子邮件地址不会被公开。