上一篇我介绍了破解58同城的字体反爬

https://blog.csdn.net/BigBoy_Coder/article/details/103239672

中间遗漏了几个细节,在这边文章我做一下补充:

遗漏点一:

并不是所有的字体文件格式都是.ttf格式的文件,这里我们要针对原网页的,进行判断

怎么判断呢?

比如:https://su.58.com/qztech/ 右键查看源码,

我们发现,文件的字体格式是woff形式的,所以这里我们把文件写成.woff格式就好了

那我们在进入https://sz.58.com/chuzu/这个页面。我们查看源码

我们发现,文件的字体格式是ttf形式的,所以这里我们把文件写成.ttf格式就好了

遗漏点二:

上一篇文章我们是在cmap,获取字符编码的,但并不是所有的都是这样,猫眼是把编码对象在glyf

所以我们还是要灵活的去分析xml文件,

遗漏点三:

当我们看到字体文件,每个字可以看到字形和字形编码。

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

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

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

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

好了说完这两个遗漏点之后,进入到今天的主要内容,手动构建字体映射表:

由于 操作详细步骤在上篇文章,都详细做了介绍,在这篇文章只做分析过程

网页地址:https://su.58.com/qztech/

步骤(1):打开网页把字体文件保存下载,并且转换成xml格式

FontCreator打开58.woff文件:

重复步骤一:

打开58_2.woff文件:

对比两个文件,我们发现

   

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

到这里我们想通过写死字体哪种方式是不行了:

分析一下两个字体文件的对应的xml文件,搜索 “”,对应的编码:

xml的格式如下:

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

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

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

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

分析到这我么就可一构建字体映射表编写代码,爬取相关信息了

# coding=utf-8
import requests
import re
import time
import  lxml.html as H
import base64
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)font_data_origin = re.search(r'base64,(.*?)\)', con.text, re.S).group(1)font_data_after_decode = base64.b64decode(font_data_origin)new_font_name = "font_new.woff"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)

反扒日系更新,以下两篇文章,推荐看一看

https://www.freebuf.com/articles/web/206966.html

https://www.jianshu.com/p/4d28dd440cdd

python 破解字体反爬 (二)相关推荐

  1. python 破解字体反爬 (一)

    爬取一些网站的信息时,偶尔会碰到这样一种情况:网页浏览显示是正常的,用python爬取下来是乱码,F12用开发者模式查看网页源代码也是乱码.这种一般是网站设置了字体反爬 这里我们以58同城为例: 点击 ...

  2. python爬取b站搜索结果_Python爬虫实例:爬取猫眼电影——破解字体反爬,Python爬虫实例:爬取B站《工作细胞》短评——异步加载信息的爬取,Python爬虫实例:爬取豆瓣Top250...

    字体反爬 字体反爬也就是自定义字体反爬,通过调用自定义的字体文件来渲染网页中的文字,而网页中的文字不再是文字,而是相应的字体编码,通过复制或者简单的采集是无法采集到编码后的文字内容的. 现在貌似不少网 ...

  3. 如何破解字体反爬机制

    这几天爬取58租房信息的时候意外发现了它是一个字体反爬的网站,所谓的字体反爬就是网站将一些关键字替换为网站自己的字体,这样在网页上字体会正常显示,但是当爬取下来的时候,经过字体加密的字符都是乱码的,根 ...

  4. Python爬虫实例:爬取猫眼电影——破解字体反爬

    字体反爬 字体反爬也就是自定义字体反爬,通过调用自定义的字体文件来渲染网页中的文字,而网页中的文字不再是文字,而是相应的字体编码,通过复制或者简单的采集是无法采集到编码后的文字内容的. 现在貌似不少网 ...

  5. 用余弦相似度破解字体反爬

    加密原理分析 **字体反爬,即利用自定义的字体文件,改变字符编码到字形之间的映射.**使得浏览器上看似正常的页面,用爬虫获取的数据却是乱码或乱序的. 1. 网页分析 以猫眼的电影详情页为例,网页上显示 ...

  6. python ttfont_58 字体反爬攻略 python3

    1.下载安装包 pip install fontTools 2.下载查看工具FontCreator 百度后一路傻瓜式安装即可 3.反爬虫机制 网页上看见的 后台源代码里面的 从上面可以看出,生这个字变 ...

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

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

  8. Python爬虫入门教程 63-100 Python字体反爬之一,没办法,这个必须写,反爬第3篇...

    背景交代 在反爬圈子的一个大类,涉及的网站其实蛮多的,目前比较常被爬虫coder欺负的网站,猫眼影视,汽车之家,大众点评,58同城,天眼查......还是蛮多的,技术高手千千万,总有五花八门的反爬技术 ...

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

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

最新文章

  1. webpack4配置详解
  2. 如何在Mac OSX Yosemite中将Ruby版本2.0.0更新到最新版本?
  3. VTK:参数对象用法实战
  4. 【GIF动画+完整可运行源代码】C++实现 选择排序——十大经典排序算法之二
  5. 加快网站访问速度--jquery.js
  6. oracle 10g 报错:ORA-00257: archiver error. Connect internal only, until freed
  7. plc用c语言编写程序,plc编程和c语言编程的联系
  8. HTML中的img标签无法显示图片的解决方案
  9. [DataAnalysis]机器学习数据类型和数据质量
  10. 联想微型计算机u盘启动,联想ThinkCentre一体机如何设置U盘启动_联想ThinkCentre电脑怎样从USB启动...
  11. 中科大网上财务报销填写流程
  12. 两个质数互质是_两个数互质是什么意思 如何判断
  13. java创建工厂方法_Java设计模式(八) 之创建型模式(工厂方法模式)
  14. laravel-admin Model does not exists添加模型报错
  15. 计算机游戏比赛,计算机学习系统问世 机器会学习游戏比赛
  16. 每个人都逃脱不了「认知三原色」
  17. mc服务器常用指令_掌控MC服务器 我的世界服务器指令大全
  18. 10004---简析TCP的三次握手与四次分手
  19. 零基础入门MySQL,让你对,MySQL有一定的了解
  20. 【开源教程11】疯壳·开源蓝牙心率防水运动手环-整机功能代码讲解

热门文章

  1. 线程概念和多线程模型【操作系统学习笔记】
  2. 天马10.1寸液晶屏TM101JDHG40-TM101JDHG40产品规格资料
  3. https证书价格多少?会影响价格的因素
  4. 【forum.php】
  5. healthOne 卫生材料无法计费或医嘱检索不到
  6. 单片机重要部分-PWM
  7. 一个硕士生导师到底可以带多少学生?
  8. 纽约一女子推婴儿车坠地铁楼梯身亡 引各界热议
  9. BootStrap中引用glyphicon图标无法显示的解决方式
  10. AIGC功能在线制作思维导图?