2

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

 2 years ago
source link: https://zmister.com/archives/269.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

文章目录 [显示]

1、问题来源

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

dad85526f11aca69.png

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

6bf0ed0ca7a1e6e0.png

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

3384c14f079b4045.png

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

e0bf0151354ac48f.png

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

2、解决方法

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

c0e9ca59170605c7.png

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

3、Python实现

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

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

4c78b33ba72ff9a6.png

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

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的值就是加密字符串的真实电子邮箱地址:

strip

a6f167bd7f363e65.gif

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK