破解爬虫过程中遇到的网页加密Email地址
2018-05-15 本文已影响79人
9c8bd366d2f7
文章首发个人微信公众号及博客:http://zmister.com/archives/269.html
欢迎访问个人博客:http://zmister.com 查看更多Python应用文章
欢迎关注个人微信公众号:州的先生 及时交流讨论
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的值就是加密字符串的真实电子邮箱地址:
是不是很简单?