python-爬虫-字体加密

news2024/10/3 2:26:37

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

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

抛出问题

在这里插入图片描述

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

在这里插入图片描述

  • F12 又是这样就比较麻烦,不能直接获取.
  • 用requests库也是获取不到正常想要的 源码的,因为字体加密了.

在这里插入图片描述

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

解决步骤

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

获取到真正的源码

为什么用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 = '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'

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>
  1. 读取ttf文件,(再生成xml文件,第一次寻找映射关系是需要做的)
  2. font.getBestCmap() 获取映射关系表
  3. 我们观察 xml文件的cmap段进行研究 ,可以看到我们明确需要的结果
  4. 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}
  5. 和从页面上那些来的结果 进行 逐个匹配调整就行了.

注意的点

  • webdriver拿下来的页面源码有可能有点问题,所以我用了 soup_text = bs4.BeautifulSoup(driver.page_source, 'lxml').text 的方法来处理源代码 (import bs4)
  • 其他的就是一些小细节上的问题了.基本的思路就是这样的.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/380150.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

开发一个会员管理系统

背景 由于现在公司内客户量剧增&#xff0c; 简单的靠电话及笔记本记录&#xff0c;来维护客户有些困难&#xff0c;但又不想去花钱购买那些专业版的会员管理系统&#xff0c;只能自己动手撸一个相对简易的会员系统来使用了。 开发语言及使用技术 后端&#xff1a;java、mys…

滑动窗口(同向)同向双指针 leetcode713 3 1004 1234

同向双指针的理解 双指针从同一侧开始走一般是right进行无脑遍历&#xff0c;left控制边界&#xff08;导致模板化&#xff09;深刻理解题目概念以及**&#xff08;right - left 1&#xff09;** 的含义多思考画图 模板 class Solution { public:int numSubarrayProductLess…

NLP中一些工具列举

文章目录StanfordcoreNLPStanzaTankitspaCySuPar总结StanfordcoreNLP 这个老早就出来了&#xff0c;用java写的&#xff0c;但是已经有很多比他效果好的了。 Stanza 2020ACL发表的&#xff0c;看名字就知道和上一个是同一家的。 用已经切好词的句子进行依存分析。 这个功能…

百度“文心一言”携手酷开科技,实现AI智能领域新突破!

进入21世纪&#xff0c;AI人工智能一直都是讨论度非常高的话题之一&#xff0c;各行各业的领导者都开始在智能领域进行了初步探索&#xff0c;这也证明了AI人工智能在未来一定会在很大程度上影响我们的生活、工作。 近日&#xff0c;深圳市酷开网络科技股份有限公司成为百度文…

Kuangbin 线性DP 最大和加强加强版

呃呃&#xff0c;一道题写了我一下午4546. 最大和加强加强版 - AcWing题库题意&#xff1a;思路&#xff1a;首先这道题没有明显的阶段&#xff0c;因此状态设计不能按照阶段去设计我们按照题目给的量去设计状态&#xff1a;设dp[i][j]为考虑前i个数分为j组的最大可能和如果这样…

百度前端二面vue面试题指南

Vue 组件间通信有哪几种方式&#xff1f; ​ Vue 组件间通信是面试常考的知识点之一&#xff0c;这题有点类似于开放题&#xff0c;你回答出越多方法当然越加分&#xff0c;表明你对 Vue 掌握的越熟练。Vue 组件间通信只要指以下 3 类通信&#xff1a;父子组件通信、隔代组件通…

5个好用的视频素材网站

推荐五个高质量视频素材网站&#xff0c;免费、可商用&#xff0c;赶紧收藏起来&#xff01; 1、菜鸟图库 视频素材下载_mp4视频大全 - 菜鸟图库 网站素材非常丰富&#xff0c;有平面、UI、电商、办公、视频、音频等相关素材&#xff0c;视频素材质量很高&#xff0c;全部都是…

Java——异常

目录 什么是异常 异常处理主要的5个关键字 异常的体系结构 异常语法 异常的分类 异常的处理流程 异常的处理 防御式编程 异常的抛出 throw的注意事项 异常的捕获 异常声明throws try-catch捕获处理 finally 自定义异常类 throw和throws区别 什么是异常 程序在运行时出现错…

什么情况下Java程序会产生死锁?如何定位、修复?

第18讲 | 什么情况下Java程序会产生死锁&#xff1f;如何定位、修复&#xff1f; 今天&#xff0c;我会介绍一些日常开发中类似线程死锁等问题的排查经验&#xff0c;并选择一两个我自己修复过或者诊断过的核心类库死锁问题作为例子&#xff0c;希望不仅能在面试时&#xff0c;…

NOC2021年测试卷1

一、单项选择题(共15题,每题3分,共45分) 1.下列应用不能体现人工智能技术的是()。 A、使用语音输入法输入文字B、使用OCR软件从图像中识别汉字C、某软件支持在线中英文互译D、某网站自动统计歌曲下载次数2.点击绿旗执行图中的脚本,若角色的坐标为 (25, 20) ,则说出的内…

元数据管理实践数据血缘

元数据管理实践&数据血缘 什么是元数据&#xff1f;元数据MetaData狭义的解释是用来描述数据的数据&#xff0c;广义的来看&#xff0c;除了业务逻辑直接读写处理的那些业务数据&#xff0c;所有其它用来维持整个系统运转所需的信息&#xff0f;数据都可以叫作元数据。比如…

微服务一 实用篇 - 2. SpringCloud02

《微服务一 实用篇 - 2. SpringCloud02》 提示: 本材料只做个人学习参考,不作为系统的学习流程,请注意识别!!! 《微服务一 实用篇 - 2. SpringCloud02》《微服务一 实用篇 - 2. SpringCloud02》1.Nacos配置管理1.1.统一配置管理1.1.1.在nacos中添加配置文件1.1.2.从微服务拉取…

GaN/氮化镓65W(1A2C)PD快充电源方案

近期美阔电子推出了一款全新的氮化镓65W&#xff08;1A2C&#xff09;PD快充充电器方案&#xff0c;该方案采用同系列控制单晶片&#xff1a;QR一次侧控制IC驱动MTCD-mode GaN FET(MGZ31N65-650V)、二次侧同步整流控制IC及PD3.0协议IC)可达到最佳匹配。 GaN/氮化镓作为第三代半…

IDEA中开发Android完整示例及APK的生成(包含用户名密码输入获取等操作)

先看看运行演示程序效果&#xff1a; 输入内容并点击确定按钮效果如下图, &#xff08;已测试传到真机中安装运行效果一模一样兼容基本所有安卓版本&#xff1a;&#xff09; 实现步骤如下&#xff1a; 1,先安装AndroidSDK 点击File->new project->Android 这个因为我…

TSBS 是什么?为什么时序数据库 TDengine 会选择它作为性能对比测试平台?

TSBS 是一个时序数据处理&#xff08;数据库&#xff09;系统的性能基准测试平台&#xff0c;提供了 IoT、DevOps 两个典型应用场景&#xff0c;它由 Timescale 开源并负责维护。作为一个性能基准测试平台&#xff0c;TSBS 具有便捷、易用、扩展灵活等特点&#xff0c;涵盖了时…

MySQL卸载教程(详细)

系列文章 C#项目–业务单据号生成器&#xff08;定义规则、自动编号、流水号&#xff09; 本文链接&#xff1a;https://blog.csdn.net/youcheng_ge/article/details/129129787 C#项目–开始日期结束日期范围计算&#xff08;上周、本周、明年、前年等&#xff09; 本文链接&…

taobao.open.account.update( Open Account数据更新 )

&#xffe5;开放平台免费API不需用户授权 Open Account数据更新 公共参数 请求地址: HTTP地址 http://gw.api.taobao.com/router/rest 公共请求参数: 公共响应参数: 响应参数 点击获取key和secret 请求示例 TaobaoClient client new DefaultTaobaoClient(url, appkey, sec…

2022 年江西省职业院校技能大赛高职组“信息安全管理与评估”赛项样题

2022 年江西省职业院校技能大赛高职组 “信息安全管理与评估”赛项样题 一、 赛项信息 第一场比赛&#xff1a; 竞赛阶段 任务阶 段 竞赛任务 竞赛时 间 分值 第一阶段 任务 1 网络平台搭建 90 平台搭建与安全 任务 2 网络安全设备配置与防护 210 设备配置防护…

【调试方法】基于vs环境下的实用调试技巧

前言&#xff1a; 对万千程序猿来说&#xff0c;在这个世界上如果有比写程序更痛苦的事情&#xff0c;那一定是亲手找出自己编写的程序中的bug&#xff08;漏洞&#xff09;。作为新手在我们日常写代码中&#xff0c;经常会出现报错的情况&#xff08;好的程序员只是比我们见过…

4.排序算法之一:冒泡排序

排序算法稳定性假定在待排序的记录序列中&#xff0c;存在多个具有相同的关键字的记录&#xff0c;若经过排序&#xff0c;这些记录的相对次序保持不变&#xff0c;即在原序列中&#xff0c;r[i]r[j]&#xff0c;且r[i]在r[j]之前&#xff0c;而在排序后的序列中&#xff0c;r[…