我的编程空间,编程开发者的网络收藏夹
学习永远不晚

python爬虫字体加密的解决

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

python爬虫字体加密的解决

直接点 某8网 https://*****.b*b.h*****y*8*.com/

具体网址格式就是这样的但是为了安全起见,我就这样打码了.

抛出问题

在这里插入图片描述

我们看到这个号码是在页面上正常显示的

在这里插入图片描述

F12 又是这样就比较麻烦,不能直接获取.

用requests库也是获取不到正常想要的 源码的,因为字体加密了.

在这里插入图片描述

查看页面源代码又是这样的.所以就是我们想怎么解密呢.

解决步骤

  • 获取到真正的源码
  • 找到对应的字体库
  • 进行解析操作.

获取到真正的源码

为什么用webdriver,因为requests拿不到真正的源码.

from selenium import webdriver
# --- 进行chrome的配置
options = webdriver.ChromeOptions()

prefs = {"profile.managed_default_content_settings.images": 2}  # 设置无图模式
options.add_experimental_option("prefs", prefs)
options.add_argument("service_args = ['–ignore-ssl-errors = true', '–ssl-protocol = TLSv1']")
options.binary_location = r'C:\Program Files\Google\Chrome\Application\chrome.exe'
# ---- chrome进行端口接管调用
options.add_argument('-incognito')

driver = webdriver.Chrome(options=options)
driver.set_page_load_timeout(5)
# --- 设置宽和高位置
driver.maximize_window()
# --- 拦截webdriver检测代码
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument",
                       {"source": """
                  Object.defineProperty(navigator, 'webdriver', {
                  get: () => undefined
                  })
                  """})

找到对应的字体库

在这里插入图片描述

在这里插入图片描述

这上面进行申明了告诉了我们这个是字体base64,然后就是那下来然后生成文件.

# 示例
import base64

# 省略了很长的...
b64_code = 'AAEAAAAKAIAAAwAgT1MvMla19RMAAACsAAAAYGNtYXAGQAPOAAABDAAAAa5nbHlmZrwdwAAAArwAAAakaGVhZBQx4JoAAAlgAAAANmhoZWEFswFxAAAJmAAAACRobXR4DVYBYgAACbwAAAAubG9jYQwQCnYAAAnsAAAAIm1heHAAFABOAAAKEAAAACBuYW1lUuodRwAACjAAAAGecG9zdDHgxUkAAAvQAAAAdAAEAgsBkAAFAAACmQLMAAAAjwKZAswAAAHrADMBCQAAAgAGAwAAAAAAAAAAAAEQAAAAAAAAAAAAAABQZkVkAMAAI4EEAyz/LABcAywA1AAAAAEAAAAAAxgAAAAAACAAAQAAAAQAAAADAAAAJAABAAAAAABcAAMAAQAAACQAAwAKAAABYgAEADgAAAAKAAgAAgACACMAKwAtAC///wAAACMAKgAtAC/e/9j/1//WAAEAAAAAAAAAAAAAAAABBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAgMABAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAABMAAAAAAAAAAUAAAAjAAAAIwAAAAEAAAAqAAAAKwAAAAIAAAAtAAAALQAAAAQAAAAvAAAALwAAAAUACID7AAiBBAAAAAYAAAACACIAAAEyAqoAAwAHAAA3ESERJzMRIyIBEO7MzAACqv1WIgJmAAAAAgAdAAACIALbABsAHwAAARUjByM3IwcjNyM1MzcjNTM3MwczNzMHMxUjByMzNyMB/4AmSCZrJ0knZnQjdoQkSSVrJkkmYnAitWwkbAEUR83Nzc1HuUjGxsbGSLm5AAAAAQAkAKQB3gI2ABEAABM3FyczBzcXBxcHJxcjNwcnNyQumSJzJZkun58umSRyIZguoAGXZ26mpGpmKClma6anbWYqAAABAEMAkwH6AkoACwAAARUjNSM1MzUzFTMVAUNKtrZKtwFKt7dJt7dJAAAAAAEAGgFCASQBrQADAAATNSEVGgEKAUJrawAAAAABAAD/gwEnAwoAAwAAFycTM0pK30h9AQOGAAAAAgAj//YCGgLmABMAJwAAARQOAiMiLgI1ND4CMzIeAgUUHgIzMj4CNTQuAiMiDgICGhw9X0NGYDwaGjxgR0JfPRz+qAgUJB0cJBUHBxQkHB0kFQgBb1WLYzY2Y4xVVYpiNTVii1VKc08qKk9zSklzTykpT3MAAAAAAQArAAACCgLfACEAADc1MzI+AjURDgMjIi4CNT4DPwEzERQeAjsBFWRUDRMNBhQiIB8PDRUQChAiJiwaSHIFCxUQUgA3Bg8aEwIBGCccDwoUHBEEDBIbEjX9mhAZEQg3AAAAAAEAJAAAAg4C5gArAAABFA4EDwEzMjY/ATMHITU3PgM1NCYjIgYVIi4CNTQ+AjMyHgIB9AsYKDtPM2fvHy0JCD0G/hyYLz0jDiomNCodMCMTHThUODpXPB4CPBgtMDZATjFhJCMf12qaMU5HRSg6NllYCxgnGxwyJhcYLD8AAAAAAQAd//YCDgLmAEQAABciLgI1ND4CMxQeAjMyPgI1NC4CKwE1MzI+AjU0JiMiDgIVIiY1ND4CMzIeAhUUDgIHHgMVFA4C+TpTNhkOGB8SEiEvHBktIxUVKDsnP0MhMSAQKyobIxMHQEUdOVQ4N1c+IRgqOSIfQTUiL01kChQiLRgTHhUKITEhEA4iOiweMSMUQBUoOCE4PxstOR4tLxsvJBQWKz4oIzouIgwFGSo/LD5VNBYAAgAOAAACKQLbABgAIwAAJRUUHgI7ARUhNTMyPgI9ASE1ATMRMxUlNDY3DgMPATMBvw0XHxEN/pkcEh4XDf7lASKPav8AAwQFFhkXBorUvz8YHQ8FNzcFDx0YPz4B3v4nQ/YtaDAMKiwoCeUAAQAp//YCBgLbADoAADcyPgI1NCYjIg4CBycTIRcjJy4DKwEUDgIPAT4DMzIeAhUUDgIjIi4CNTQ2MxQeAuwZLiIVSUMTIBsYCy8gAYQFOwgCBgsQDNUCAgMBCAgZHiIPPGBFJTBNXy85UDIXLSUMGis+ECVAL0xLAwUHAxIBYrojCQ4KBgEQGyISXgMGBAMcNlI3Q1o3GBUiLRgkIxYsIxYAAAACAC7/9gIZAuYALAA8AAABIg4CBz4DMzIeAhUUDgIjIi4CNTQ+AjMyHgIVFA4CIzQuAgMiDgIHFB4CMzI2NTQmAUkeMSMVAwobIysaL0s2HR48WDs5XUMlJEhuSjJFKxMNHS4iBg8bNw4fHBgGEh4pFygtMgKpJEVkQQcNCwcdN04yN1tBJCpWg1lVk20/EyAoFhAdFg0XLyYY/tkIDhIJSWpEIFBZU0wAAAAAAQAtAAACGwLbAAsAADcBISIGDwEjNyEVAakBEf7yHBwDBj4FAen+5QACbBsZNNcy/VcAAAMAH//2Ah4C5gAlADkATQAANzQ+AjcuATU0PgIzMh4CFRQOAgceAxUUDgIjIi4CFzI+AjU0LgInDgMVFB4CEzQuAiMiDgIVFB4CFz4DHxUoOCE9QRg4W0I2UjcbEyQzIC5BKBMkQ2E+QF4+Hf4aKx4QESU4KBEeFQ0RHit6DBgkFxUhFgsOHCkbExsSCLshNSslESNaPCRDNCAbMEInHi8nIRAXLTI2HzFLNBwfNUhiEyIvHBkpIyISCx0jLBseMiMUAgQWKyEUER8qGBsoIBkNCxkgKAAAAAIAJP/2Ag8C5gAoADYAABciLgI1NDY3HgMzMjY3DgMjIi4CNTQ+AjMyHgIVFA4CAzI2NzQuAiMiBhUUFukvQCgRGBoHFR4nGkVKBQwdJS0aLEo1HiA9Vzc3XkUmIUdvHyU1DxEcKBgsMDAKFCAqFhYfBRcoHRGVkw8ZEwobNk80N1tCJChUglpVlG9AAW4lH0JePB1WV0dJAAAAAAEAAAABAACt4Ie1Xw889QALBAAAAAAA2XTOiAAAAADZdM6IAAD/gwIpAwoAAAAIAAIAAAAAAAAAAQAAAyz/LABcAj0AAAAAAikAAQAAAAAAAAAAAAAAAAAAAAcBdgAiAj0AHQICACQCPQBDAT4AGgEnAAACPQAjACsAJAAdAA4AKQAuAC0AHwAkAAAAAAAUAEQAZgB8AIoAmADUAQYBRgGgAdYCKAJ+ApgDBANSAAAAAQAAABAATgADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAlgABAAAAAAABAA0AAAABAAAAAAACAAYADQABAAAAAAADAA0AEwABAAAAAAAEAA0AIAABAAAAAAAFAB4ALQABAAAAAAAGAA0ASwADAAEECQABABoAWAADAAEECQACAAwAcgADAAEECQADABoAfgADAAEECQAEABoAmAADAAEECQAFADwAsgADAAEECQAGABoA7kxlZVRyZWVzaGFkb3dNZWRpdW1MZWVUcmVlc2hhZG93TGVlVHJlZXNoYWRvd1ZlcnNpb24gMS4wOyBGb250RWRpdG9yICh2MS4wKUxlZVRyZWVzaGFkb3cATABlAGUAVAByAGUAZQBzAGgAYQBkAG8AdwBNAGUAZABpAHUAbQBMAGUAZQBUAHIAZQBlAHMAaABhAGQAbwB3AEwAZQBlAFQAcgBlAGUAcwBoAGEAZABvAHcAVgBlAHIAcwBpAG8AbgAgADEALgAwADsAIABGAG8AbgB0AEUAZABpAHQAbwByACAAKAB2ADEALgAwACkATABlAGUAVAByAGUAZQBzAGgAYQBkAG8AdwAAAAIAAAAAAAAAMgAAAAAAAAAAAAAAAAAAAAAAAAAAABAAEAAAAAYADQAOABAAEgECAQMBBAEFAQYBBwEIAQkBCgELBHplcm8Db25lA3R3bwV0aHJlZQRmb3VyBGZpdmUDc2l4BXNldmVuBWVpZ2h0BG5pbmU='

with open('font.ttf', 'wb') as f:
    f.write(base64.decodebytes(b64_code.encode()))


from fontTools.ttLib import TTFont  # 导包

font = TTFont('font.ttf')
font.saveXML('font.xml')
# 简单封装下
import base64
def w_tff(one_html):
    res_tff = re.findall(r';base64,(.*?)"', one_html, re.S)
    if res_tff and len(res_tff) == 1:
        new_res_ttf = res_tff[0]
        with open('123_new_ttf.ttf', 'wb') as f:
            f.write(base64.decodebytes(new_res_ttf.encode()))

读取文件找到里面的对应关系,就是 你这个数字的格式 是存储在.ttf文件里的.

from fontTools.ttLib import TTFont
def get_num_phone(es_str: str):
    # 加载字体生成映射关系
    path = '123_new_ttf.ttf'
    font = TTFont(path)

    # font.saveXML('font.xml')   # 生成xml文件
    # 得到映射关系
    bestcmap = font.getBestCmap()

    ss = {}
    for key, value in bestcmap.items():
        keys = hex(key).replace('0x', '').replace("&#x", "")  # 10进制转16进制
        if value == "zero":
            value = 0
        elif value == "one":
            value = 1
        elif value == "one":
            value = 1
        elif value == "two":
            value = 2
        elif value == "three":
            value = 3
        elif value == "four":
            value = 4
        elif value == "five":
            value = 5
        elif value == "six":
            value = 6
        elif value == "seven":
            value = 7
        elif value == "eight":
            value = 8
        elif value == "nine":
            value = 9
        elif value == "hyphen":
            value = "-"
        ss.update({
            keys: value
        })

    need_re = es_str
    list_phone = ""
    try:
        for item in need_re.split(";"):
            if item:
                new_item = item.replace("&#x", "")
                list_phone += "".join(str(ss[new_item]))
        if not list_phone or len(list_phone) < 2:
            return None
        return list_phone
    except Exception as e:
        return None
<cmap>
    <tableVersion version="0"/>
    <cmap_format_4 platformID="0" platEncID="3" language="0">
      <map code="0x23" name="numbersign"/><!-- NUMBER SIGN -->
      <map code="0x2a" name="asterisk"/><!-- ASTERISK -->
      <map code="0x2b" name="plus"/><!-- PLUS SIGN -->
      <map code="0x2d" name="hyphen"/><!-- HYPHEN-MINUS -->
      <map code="0x2f" name="slash"/><!-- SOLIDUS -->
    </cmap_format_4>
    <cmap_format_0 platformID="1" platEncID="0" language="0">
      <map code="0x23" name="numbersign"/>
      <map code="0x2a" name="asterisk"/>
      <map code="0x2b" name="plus"/>
      <map code="0x2d" name="hyphen"/>
      <map code="0x2f" name="slash"/>
    </cmap_format_0>
    <cmap_format_4 platformID="3" platEncID="1" language="0">
      <map code="0x23" name="numbersign"/><!-- NUMBER SIGN -->
      <map code="0x2a" name="asterisk"/><!-- ASTERISK -->
      <map code="0x2b" name="plus"/><!-- PLUS SIGN -->
      <map code="0x2d" name="hyphen"/><!-- HYPHEN-MINUS -->
      <map code="0x2f" name="slash"/><!-- SOLIDUS -->
    </cmap_format_4>
    <cmap_format_12 platformID="3" platEncID="10" format="12" reserved="0" length="76" language="0" nGroups="5">
      <map code="0x23" name="numbersign"/><!-- NUMBER SIGN -->
      <map code="0x2a" name="asterisk"/><!-- ASTERISK -->
      <map code="0x2b" name="plus"/><!-- PLUS SIGN -->
      <map code="0x2d" name="hyphen"/><!-- HYPHEN-MINUS -->
      <map code="0x2f" name="slash"/><!-- SOLIDUS -->
      <map code="0x880fb" name="zero"/><!-- ???? -->
      <map code="0x880fc" name="one"/><!-- ???? -->
      <map code="0x880fd" name="two"/><!-- ???? -->
      <map code="0x880fe" name="three"/><!-- ???? -->
      <map code="0x880ff" name="four"/><!-- ???? -->
      <map code="0x88100" name="five"/><!-- ???? -->
      <map code="0x88101" name="six"/><!-- ???? -->
      <map code="0x88102" name="seven"/><!-- ???? -->
      <map code="0x88103" name="eight"/><!-- ???? -->
      <map code="0x88104" name="nine"/><!-- ???? -->
    </cmap_format_12>
  </cmap>

读取ttf文件,(再生成xml文件,第一次寻找映射关系是需要做的)

  • font.getBestCmap() 获取映射关系表
  • 我们观察 xml文件的cmap段进行研究 ,可以看到我们明确需要的结果
  • keys = hex(key).replace('0x', '').replace("&#x", "") 10进制转16进制 ,会得到映射关系表 {'23': 'numbersign', '2a': 'asterisk', '2b': 'plus', '2d': '-', '2f': 'slash', '8826e': 0, '8826f': 1, '88270': 2, '88271': 3, '88272': 4, '88273': 5, '88274': 6, '88275': 7, '88276': 8, '88277': 9}
  • 和从页面上那些来的结果 进行 逐个匹配调整就行了.

注意的点

webdriver拿下来的页面源码有可能有点问题,所以我用了 soup_text = bs4.BeautifulSoup(driver.page_source, 'lxml').text 的方法来处理源代码 (import bs4)

其他的就是一些小细节上的问题了.基本的思路就是这样的.

到此这篇关于python爬虫字体加密的解决的文章就介绍到这了,更多相关python爬虫字体加密内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

python爬虫字体加密的解决

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

python爬虫字体加密的解决

本文主要介绍了python爬虫字体加密的解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-03-03

python爬虫字体加密问题怎么解决

本文小编为大家详细介绍“python爬虫字体加密问题怎么解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“python爬虫字体加密问题怎么解决”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。抛出问题我们看到这个号
2023-07-05

利用python爬虫怎么破解加密字体

本篇文章为大家展示了利用python爬虫怎么破解加密字体,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。python是什么意思Python是一种跨平台的、具有解释性、编译性、互动性和面向对象的脚本语言
2023-06-06

使用K近邻算法与CSS动态字体加密后Python怎么反爬虫

本篇内容主要讲解“使用K近邻算法与CSS动态字体加密后Python怎么反爬虫”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“使用K近邻算法与CSS动态字体加密后Python怎么反爬虫”吧!  1.
2023-06-02

Python爬虫中常见的加密算法有哪些

这篇文章主要讲解了“Python爬虫中常见的加密算法有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python爬虫中常见的加密算法有哪些”吧!1. 基础常识首先我们需要明白的是,什么是
2023-07-02

python中如何实现反爬2021猫眼票房字体加密

这篇文章主要介绍python中如何实现反爬2021猫眼票房字体加密,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!python主要应用领域有哪些1、云计算,典型应用OpenStack。2、WEB前端开发,众多大型网站均
2023-06-14

python爬虫IP被限制的解决方法

这篇文章主要介绍python爬虫IP被限制的解决方法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Python主要用来做什么Python主要应用于:1、Web开发;2、数据科学研究;3、网络爬虫;4、嵌入式应用开发;
2023-06-14

python爬虫时ip被封的解决方法

这篇文章给大家分享的是有关python爬虫时ip被封的解决方法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。python的数据类型有哪些?python的数据类型:1. 数字类型,包括int(整型)、long(长整
2023-06-15

Python爬虫的IP被限制的解决方法

小编给大家分享一下Python爬虫的IP被限制的解决方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1、宽带拨号换IP。如果没有路由器,可以在宽带连接中,直接把
2023-06-15

Python爬虫时如何解决封IP的问题

小编给大家分享一下Python爬虫时如何解决封IP的问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!python的五大特点是什么python的五大特点:1.简单
2023-06-15

python解决网站的反爬虫策略总结

本文详细介绍了网站的反爬虫策略,在这里把我写爬虫以来遇到的各种反爬虫策略和应对的方法总结一下。从功能上来讲,爬虫一般分为数据采集,处理,储存三个部分。这里我们只讨论数据采集部分。 一般网站从三个方面反爬虫:用户请求的Headers,用户行为
2022-06-04

Python中常见的网络爬虫问题及解决方案

Python中常见的网络爬虫问题及解决方案概述:随着互联网的发展,网络爬虫已经成为数据采集和信息分析的重要工具。而Python作为一种简单易用且功能强大的编程语言,被广泛应用于网络爬虫的开发。然而,在实际开发过程中,我们常会遇到一些问题。本
2023-10-22

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录