文章目录

  • 1、目标网站
  • 2、反爬虫机制
  • 3、解决
  • 4、上代码
  • 字体解密相关资源
  • 总结

目前已知的几个字体反爬的网站是猫眼,汽车之家,天眼查,起点中文网等等。

本文用到的第三方库:fontTools

安装

pip install fontTools

或者到这个地址下载:https://files.pythonhosted.org/packages/81/d5/d6b345845163f6563c86748e82b9c6077e7ee21ab0289ad8a27a23985f6f/fonttools-3.39.0-py2.py3-none-any.whl

下载完之后,pip install fonttools-3.39.0-py2.py3-none-any.whl

1、目标网站

url = “https://su.58.com/qztech/”

2、反爬虫机制

网页上看见的

后台源代码里面的

从上面可以看出,生这个字变成了乱码,请大家特别注意箭头所指的数字。

3、解决

1、确定反爬方法

在看了别人的解析文章之后,确定采取的是字体反爬机制,即网站定义了字体文件,然后进行相应的查找替换,在前端看起来,是没有任何差异的。其实从审查元素的也是可以看到的:

和大众点评的反爬差不多,都是通过css搞得。

2、寻找字体文件

以上面方框里的”customfont“为关键词搜了一下,发现就在源代码里面:

而且还有base64,直接进行解密,但是解密出来的其实是乱码,这个时候其实要做的很简单,把解密后的内容保存为.ttf格式即可。

  • ttf文件.ttf是字体文件格式。TTF(TrueTypeFont)是Apple公司和Microsoft公司共同推出的字体文件格式,随着windows的流行,已经变成最常用的一种字体文件表示方式。
  • @font-face是CSS3中的一个模块,主要是实现将自定义的Web字体嵌入到指定网页中去。

因为我们要对字体进行研究,所以必须将它打开,这里我是用的是FontCreator,打开以后是这个样子(其实很多字,在这里为了看的清楚,所以只截了下面的图):

很明显,每个字可以看到字形和字形编码。

观察现在箭头指的地方和前面箭头指的地方的数字是不是一样啊,没错,就是通过这种方法进行映射的。

所以我们现在的思路似乎就是在源代码里找到箭头指的数字,然后再来字体里找到后替换就行了。

恭喜你,如果你也是这么想的,那你就掉坑里了。

因为每次访问,字体字形是不变的,但字符的编码确是变化的。因此,我们需要根据每次访问,动态解析字体文件

字体1:

字体2:

所以想通过写死的方式也是行不通的。

这个时候我们就要对字体文件进行更深一步的研究了。

3、研究字体文件

刚刚的.ttf文件我们是看不到内部的东西的,所以这个时候我们要对字体文件进行转换格式,将其转换为xml格式,然后来查看:

具体操作如下:

from fontTools.ttLib import TTFontfont_1 = TTFont('58_font_1.ttf')
font_base.saveXML('font_1.xml')

xml的格式如下:


文件很长,我只截取了一部分。

仔细的观察一下,你会发现~这俩下面的x,y,on值都是一毛一样的。所以我们的思路就是以一个已知的字体文件为基本,然后将获取到的新的字体文件的每个文字对应的x,y,on值进行比较,如果相同,那么说明新的文字对就 可以在基础字体那里找到对应的文字,有点绕,下面举个小例子。

假设: “我” 在基本字体中的名为uni1,对应的x=1,y=1,n=1新的字体文件中,一个名为uni2对应的x,y, n分别于上面的相等,那么这个时候就可以确定uni2 对应的文字为”我”。

查资料的时候,发现在特殊情况下,有时候两个字体中的文字对应的x,y不相等,但是差距都是在某一个阈值之内,处理方法差不多,只不过上面是相等,这种情况下就是要比较一下。

其实,如果你用画图工具按照上面的x与y值把点给连起来,你会发现,就是汉字的字形~

所以,到此总结一下:

一、将某次请求获取到的字体文件保存到本地[基本字体];
二、用软件打开后,人工的找出每一个数字对应的编码[一定要保证顺序的正确,要不然会出事];
三、我们以后访问网页时,需要保存新字体文件;
四、用Fonttools库对基本字体与新字体进行处理,找到新的字体与基本字体之间的映射;
五、替换;

4、上代码

# coding=utf-8
import requests,base64,re,time
import  lxml.html as H
from fontTools.ttLib import TTFontdef get_data(url):headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36',}session = requests.session()con = session.get(url, headers=headers)doc = H.document_fromstring(con.content)html=bytes.decode(con.content)font_data_origin = re.search(r'base64,(.*?)\)', html, re.S).group(1)font_data_after_decode = base64.b64decode(font_data_origin)new_font_name = "font_new.ttf"with open(new_font_name, 'wb') as f:f.write(font_data_after_decode)map_data = tff_parse(new_font_name)names = doc.xpath('//span[@class="infocardName fl stonefont resumeName"]/text()')# 有的时候会找不到,可以多执行几次;if names:for name in names:print('name in page source', name)for j in map_data.keys():name = name.replace(j, map_data[j])print('name actual', name)def tff_parse(font_parse_name):# 我这里的字体的顺序,如果你的不同,一定要修改font_dict = [u'博', u'经', u'硕', u'届', u'大', u'刘', u'8', u'1', u'士', u'E', u'2', u'6', u'张',u'M', u'验', u'5', u'本', u'赵', u'陈', u'吴', u'李', u'生', u'4', u'校', u'以', u'应', u'黄',u'技', u'无', u'女', u'A', u'周', u'中', u'3', u'王', u'7', u'0', u'9', u'科', u'高', u'男',u'杨', u'专', u'下', u'B']font_base = TTFont('font_base.ttf')font_base_order = font_base.getGlyphOrder()[1:]# font_base.saveXML('font_base.xml')  调试用font_parse = TTFont(font_parse_name)# font_parse.saveXML('font_parse_2.xml')调试用font_parse_order = font_parse.getGlyphOrder()[1:]f_base_flag = []for i in font_base_order:flags = font_base['glyf'][i].flagsf_base_flag.append(list(flags))f_flag = []for i in font_parse_order:flags = font_parse['glyf'][i].flagsf_flag.append(list(flags))result_dict = {}for a, i in enumerate(f_base_flag):for b, j in enumerate(f_flag):if comp(i, j):key = font_parse_order[b].replace('uni', '')key = eval(r'u"\u' + str(key) + '"').lower()result_dict[key] = font_dict[a]return result_dictdef comp(L1, L2):if len(L1) != len(L2):return 0for i in range(len(L2)):if L1[i] == L2[i]:passelse:return 0return 1if __name__ == '__main__':url = "https://su.58.com/qztech/"get_data(url)

github地址:https://github.com/xiaosimao/wx_code

看一下成果

字体解密相关资源

一是查看字体的软件 FontCreator,支持 window 。

链接:https://pan.baidu.com/s/1tUznnSB3siI2rVY9Whv88A 密码:ygz9

二是打开字体的网站,适合 mac 系统的朋友使用。

先通过 cloudconvert 把字体文件转化为 svg 后再用 fontello 打开查看

http://fontello.com/
https://cloudconvert.com/ttf-to-svg

如果嫌弃上面转换太过麻烦可以用百度字体打开。

http://fontstore.baidu.com/static/editor/index.html

推荐使用 FontCreator 以及百度字体。

打开后显示的样子与下图类似。

总结

其实这个流程最大的问题就是我们人工录入的基本字体的字典数据有可能是会发生变化的,这就导致我们后面还要手动去改。

来源:https://cuiqingcai.com/6431.html
https://mp.weixin.qq.com/s/is1ScEk4cl5r8_uuEz5Jmw

[585]爬虫|字体反爬相关推荐

  1. 16.网络爬虫—字体反爬(实战演示)

    网络爬虫-字体反爬 一·字体反爬原理 二·字体反爬模块Fonttools TTF文件 三·FontCreator 14.0.0.2790 FontCreatorPortable下载与安装 四·实战演示 ...

  2. Python爬虫-字体反爬-猫眼国内票房榜

    偶然间知道到了字体反爬这个东西, 所以决定了解一下. 目标: https://maoyan.com/board/1 问题:类似下图中的票房数字无法获取, 直接复制粘贴的话会显示 □ 等无法识别的字符, ...

  3. 爬虫 字体反爬分析(1) 人人车 -- 含源码

    严重声明:本文仅用于学习交流,不得用于商业用途,同时希望大家遵循robots协议,维护网络和谐. 本猿最近在逛一些网站的时间.在打开浏览器的f12查看人家前端代码咋写的时候,经常会发现就是页面上显示的 ...

  4. python爬虫反爬策略_抖音字体反爬,爬虫字体反爬策略——每周一个爬虫小教程系列...

    在B站上看到一个关于抖音字体反爬的视频,看完之后,精神抖擞,不禁感觉,我又行了,于是在模拟器上下载了一个抖音,打开了我尘封已久的抖音号. 可以看见显示的数字是正常的,但是查看源码就是错误的. 既然是字 ...

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

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

  6. 前端电子表数字字体_爬虫:如何优雅应对字体反爬

    目录 THE BEGIN 一 什么是字体反爬 二 如何解密 1.人工解密 2.工具解密 三 建立映射关系 四 解密 THE BEGIN 网页数据爬取可以简单分为三步:抓取页面,分析页面,存储数据.其中 ...

  7. python爬虫笔记五:汽车之家贴吧信息(字体反爬-动态映射)

    学习网址: https://jia666666.blog.csdn.net/article/details/108974149 ----------------------------------- ...

  8. 连个字体反爬都搞不定?你还说你会爬虫?看完这篇就会了。

    随着互联网的发展,Python的崛起,很多网站经常被外面的爬虫程序骚扰,有什么方法可以阻止爬虫吗? 阻止爬虫也就称之为反爬虫,反爬虫涉及到的技术比较综合,说简单也简单,说复杂也复杂,看具体要做到哪种保 ...

  9. 十三、学习分布式爬虫之字体反爬

    字体反爬 字体反爬原理 网页开发者自己创造一种字体,因为在字体中每个文字都有其代号,那么以后在网页中不会直接显示这个文字的最终的效果,而是显示他的代号,因此即使获取到了网页中的文本内容,也只是获取到文 ...

最新文章

  1. python中range和xrange的异同
  2. mysql ——读写分离
  3. Mybatis逆向生成报错:文档根元素 “project“ 必须匹配 DOCTYPE 根 “null“。
  4. java反射 获取局部变量_Java反射:如何获取变量的名称?
  5. 这可能是大型复杂项目下数据流的最佳实践
  6. 【鲲鹏来了】鲲鹏迁移过程案例分享
  7. 苏州科技学院计算机组成原理考试,苏州科技学院计算机组成原理复习提纲.doc...
  8. jdk下载安装并配置环境
  9. java 邮件发送乱码_java邮件发送乱码解决方法
  10. 用汇编语言实现c语言程序例题,C语言详细例题大全
  11. MATLAB实现高斯-克吕格投影反算
  12. 如何使用monitor(DDMS)抓取traceview文件
  13. C语言男性标准体重,男性的标准体重是多少又如何计算?
  14. 计算机组成原理GLK,计算机组成原理课件第一讲.ppt
  15. umi hooks里的mutate使用方法
  16. iOS知识点汇总复习
  17. 马化腾,直接把360做特了!
  18. java新手学习感想
  19. 设置计算机访问权限密码忘了怎么办,电脑上设置的密码忘记了怎么办
  20. 单元测试报connection is allready closed导致dailybuild中断的解决方案——类加载机制的应用...

热门文章

  1. 三维电磁仿真ANSYSAnsoftMaxwellv16中文汉化版含英文
  2. 机器学习——动手从决策树实现随机森林
  3. Vue 复习考试练习
  4. CNCF X 阿里巴巴云原生技术公开课
  5. c语言调用swf,Transform SWF
  6. 移动端HTML5<video> 浏览器劫持视频播放 视频激活播放后强制全屏 视频无法被其他元素覆盖
  7. idea 设置方法显示参数提示
  8. 怪异报错:Wrong number of type arguments
  9. pymongo 使用教程
  10. 香港服务器可以做网站吗?