在爬取网站时,部分网站是设置了字体反爬的,即我们肉眼看到的数据(譬如:1234)和网页源码上显示的数据(譬如:鑶鸺龤)并不一致。

这个,其实是因为网页采用了 CSS3 的 @font-face模块自定义字体文件导致的。

@font-face是 CSS3 中的一个模块,作用是把自定义的 Web 字体嵌入到网页中。

@font-face 语法规则:

@font-face {

font-family: ;

src: [][, []]*;

[font-weight: ];

[font-style:

}

值说明:

YourWebFontName: 自定义的字体名称

source: 自定义的字体的存放路径,可以是相对路径也可以是绝路径

format:自定义的字体的格式,包含 truetype,opentype,truetype-aat,embedded-opentype,svg等

font-weight:定义字体是否为粗体

font-style:定义字体样式,如斜体

下面,本文以 58同城 作为例子讲解。

步骤用浏览器打开 https://cd.58.com/chuzu/ ,随机点击一个房源,在其详情页查看价格处网页元素

此时,我们发现网页元素与网页展示数据并不一致。

2. 在网页空白处我们右键查看网页源码,找寻该数据

此时,我们发现这些貌似乱码的数据其实对应的是一个个编码。

3. 在 HTML 中搜索 font-face

找到的这一段字符串为 ttf 字体文件经 base64 编码后的内容。

4. 将 charset=utf-8;base64, 后那段字符串复制,并解码后保存至本地 ttf 文件,最后使用 FontCreator 打开

import base64

font_face='xxxx'

b=base64.b64decode(font_face)

with open('58.ttf','wb') as f:

f.write(b)复制 base64 加密字符串解码后保存至本地 ttf 文件FontCreator 打开

此时,我们发现

鸺 对应 9

齤 对应 8

龤 对应 0

正好组成页面上的价格。

那么,解决字体反爬的思路便是:获取自定义字体与正常字体的映射,如 鸺 对应 9

将页面的自定义字体替换回正常字体

倘若字体映射是静态的,那么我们可以提前写死;若字体映射是动态的我们便需要请求一次页面,便获取一次映射关系(58便是动态的)

动态映射的话,我们先看下 ttf 文件的内容好了,看下每次是哪里变化。对此,ttf 无法查看其内部内容,我们选择将其转换为 xml 文件查看。

from fontTools.ttLib import TTFont

font = TTFont('58.ttf')

font.saveXML('58.xml')

5. 打开转换后的 xml 文件,寻找映射关系

标签,可以看到 id 和 name

标签,可以看到编码和 name 的对应关系,可以看出(重点)

glyph00006 对应 5

glyph00003 对应 2

glyph00005 对应 4

以此类推

标签,可以看到用于描述字体形状的坐标点(此处不关注,字体形状无变化)

6. 通过 fontTools 库获取字体映射关系

from fontTools.ttLib import TTFont

font = TTFont('58.ttf')

bestcmap = font['cmap'].getBestCmap()

print(bestcmap)

此时,我们可以看出 bestcmap 这个字典的 key 刚才 16 进制编码的 int 形式。

当我们使用这个字典映射关系时,需将其转换回 16 进制。

import re

newmap = dict()

for key in bestcmap.keys():

value = int(re.findall('\d+',bestcmap[key])[0]) - 1

key = hex(key)

newmap[key] = value

print(newmap)

7. 便捷地获取内存中的二进制流,不必每次都创建一个 ttf 文件

import io

fio=io.BytesIO(base64.b64decode(font_face))

font = TTFont(fio)

bestcmap = font['cmap'].getBestCmap()

newmap = dict()

for key in bestcmap.keys():

value = int(re.findall('\d+',bestcmap[key])[0]) - 1

key = hex(key)

newmap[key] = value

print(newmap)

原创文章,转载请保留或注明出处!

pythonttf字体下载_python 58 字体反爬相关推荐

  1. 汽车之家字体加密破解(CSS样式反爬)

    废话不说多,直接切入主题. 能来到这里的应该都已经发现汽车之家论坛以及一些频道的网页源码是这种: 刚看到这里的时候,想到刚学爬虫时所听说的CSS样式反爬,没错,就是这个.破解方法就是破解其字体文件即可 ...

  2. python中文字体下载_python+freetype+opencv 图片中文(汉字)显示 详细图文教程和项目完整源代码...

    效果展示 开发环境配置 python+freetype配置 项目完整文档下载(源代码+字体+图片) 完整字体下载 包括:times new roman,中山行书百年纪念版,calibri,Christ ...

  3. android9默认字体下载,iFont爱字体 v5.5.9 Android特别版-实用的手机换字体软件

    iFont爱字体 v5.5.9 Android特别版-实用的手机换字体软件 书法字体2015.09.28iFont iFont(爱字体)是安卓平台最强大.最专业的字体软件,精彩字体,随你所换!iFon ...

  4. python中文字体下载_python docx 中文字体设置的操作方法

    最近用到了docx生成word文档,docx本身用起来很方便,自带的各种样式都很好看,美中不足的就是对中文的支持不够好.在未设置中文字体的时候,生成的文档虽然可以显示中文,但是笔画大小不一,很难看. ...

  5. python中文字体下载_Python在Matplotlib图中显示中文字体的操作方法

    1. 说明 本篇主要针对在Ubuntu系统中,matplotlib显示不了中文的问题,尤其是在无法安装系统字体的情况下,解决Python绘图时中文显示的问题. 2. 在系统中安装字体 $ fc-lis ...

  6. python中文字体下载_python中matlabplot和seaborn中文字体显示的一种解决方案

    经过测试,该方法有效,分享一波,不多说了,直接上干货: 主要经过四步,比较永久的一种方法,适合需要经常显示中文标题 第一步:安装黑体SimHei.ttf 在这个百度云盘中下载: 链接:https:// ...

  7. python 爬视频下载_Python爬虫进阶之爬取某视频并下载的实现

    这篇文章我们来讲一下在网站建设中,Python爬虫进阶之爬取某视频并下载的实现.本文对大家进行网站开发设计工作或者学习都有一定帮助,下面让我们进入正文. 这几天在家闲得无聊,意外的挖掘到了一个资源网站 ...

  8. python修改字体无效_python修改字体的方法

    python修改字体的方法 发布时间:2020-09-23 09:55:51 来源:亿速云 阅读:95 作者:小新 这篇文章主要介绍python修改字体的方法,文中介绍的非常详细,具有一定的参考价值, ...

  9. python爬虫热点代理_Python爬虫实战——反爬策略之代理IP【无忧代理】

    一般情况下,我并不建议使用自己的IP来爬取网站,而是会使用代理IP. 原因很简单:爬虫一般都有很高的访问频率,当服务器监测到某个IP以过高的访问频率在进行访问,它便会认为这个IP是一只"爬虫 ...

  10. 爬虫学习笔记(二十)—— 字体反爬

    文章目录 一.什么是字体反爬 二.编码原理 2.1.ASCII编码对照表 2.2.Unicode编号 2.3.UTF-8编码方式 2.4.字符矢量图 三.案例:58同城反爬字体 3.1.代码实现 一. ...

最新文章

  1. python——no module named XX
  2. Redis两种客户端:lettuce和Jedis的区别
  3. 386个Linux发行版本中 你用过Ubuntu吗?
  4. 外贸客户如何跟进?外贸客户类型及跟进策略
  5. 全国 下拉框 选项值:35个省级行政区
  6. 新手入门:Spring的一些学习方法及意见
  7. gbq可以算出土建量吗_广联达土建算量软件必备操作指南
  8. 小学身高体重测试软件,学生测量身高体重秤,小学体检秤
  9. word回车后间距太大_word 里字体变大后再回车,两行间距太大怎么办
  10. Burp Proxy
  11. rgb sw 线主板接口在哪_华硕ROG STRIX LC 360 RGB一体式水冷:与ROG主板更配
  12. android原生坐标系,经纬度查寻地图位置,坐标系在线互转
  13. 智能配音软件哪款比较好?这几个工具值得一试
  14. 如何让DIV中的内容左边的靠左对齐,右边的靠右对齐?
  15. WLAN与WiFi各是什么意思有什么区别
  16. 我在linux主机用arm-linux-gcc编译后,复制到开发板根目录运行,出现/bin/sh: ./hello not found
  17. 抖音素材哪里收集_抖音素材哪里收集 这个视频下载网站帮你处理好了
  18. Conflux 网络(Hydra)2.0.3 版本升级公告
  19. python技术培训机构排名
  20. Polymorphism in C(用C实现多态)

热门文章

  1. 安装WINCC6.0的步骤
  2. C语言使用scanf_s函数输入的正确姿势
  3. 爬取豆瓣top250电影练习
  4. WickedEngine 开源游戏引擎
  5. 三节点潮流计算matlab,电力系统分析大作业matlab三机九节点潮流计算报告.doc
  6. spark sql之日期函数
  7. 如何把Eclipse改成中文版
  8. 模组管理器功能模块热插拔流程
  9. masm32环境配置
  10. matlab安装vlfeat-0.9.18出错