字体反爬虫破破解

发布时间丨2021-10-31 11:22:17作者丨zhaomeng浏览丨4


现在的很多的企业对数据的重视程度逐步提高,很多公司在自己的网站上对联系人的信息进行各种的反爬虫的处理,一方面是防止爬虫的无休止的采集,另一方面是不希望自己网站 的联系方式别复制粘贴,本次博客记录是一种在网站使用对数字加密反爬虫的方式,预防一定的爬虫直接获取到网站的联系人数据,博客记录紧紧是作为技术分享的初衷.

如下图我们看到的这个数据经过浏览器的渲染就是正确的数据,但是我们复制这个数字的时候就会出现这一串的如下的空白格子,这样的数据无疑给爬虫或者个人用户带来了一定的复杂性,增加了一些难度.

随后我们接着查看他 的源代码,发现我们能获取到的就是一些字符串,n看这些字符串对我们看来说没有任何的用处,因此我们需要将这样的数据转化成我们需要的0-9的数字.

下面我们结合网站的设计方法i倒推回去,浏览器能够识别源码中的h这些奇怪的数据,说明存在一层的数据对应映射关系,只需要找到对应的关系并还原出来 就可以实现这个反爬虫的破解了,因此找多组数据对比发现了如下的映射关系:

 self.font_map = {'&#x10010': 0, '&#x1000d': 1, '&#x10011': 2, '&#x1000f': 3, '&#x10017': 4, '&#x1000e': 5,
                         '&#x10015': 6,
                         '&#x10014': 7, '&#x10012': 8, '&#x10013': 9, '&#x10016': '-'}

现在我们需要使用程序的方式将我们采集到的数据进行还原出来就可以实现我们最初页面上看到的数据了. 

class FontMapPhone(object):
    def __init__(self):
        self.font_map = {'&#x10010': 0, '&#x1000d': 1, '&#x10011': 2, '&#x1000f': 3, '&#x10017': 4, '&#x1000e': 5,
                         '&#x10015': 6,
                         '&#x10014': 7, '&#x10012': 8, '&#x10013': 9, '&#x10016': '-'}

    def phonenull(self, p:str) -> str:
        # 根据映射表获取电话信息
        if p:
            s = self.getstr(p)
            phone = ''
            for n in s:
                phone += str(self.font_map[n])
            # print(phone)
            return phone
        else:
            return p

    def nenull(self, i) -> str:
        # 过滤为空的字符
        if i != "":
            return i

    def getstr(self, p: str) -> list:
        # 过滤为空的字符;返回列表
        data = p.split(";")
        phone = list(filter(self.nenull, data))
        return phone

if __name__ == '__main__':
    s = FontMapPhone().phonenull('𐀒𐀕𐀖𐀐𐀑𐀎𐀖𐀎𐀒𐀒𐀗𐀐𐀎𐀒𐀑')
    print(s)

本片博文作为技术分享,不作为其他的用途,上面的代码可以复制并直接运行出结果,案例中的对数字的反爬虫的难度较低 ,你学会了吗?

推荐文章:win10部署django项目