之前做过爬取大众点评美团等电话号码遇到过字体反爬  ,故此处做个人记录

例如:58同城、起点中文网、大众点评等

加密思路

原理:关于字体加密,其实是将一种特定的字体库来代替浏览器本身的字体库显示的过程

以58字体库加密为例

58同城中,无论是简历中的字体加密,还是房产信息中的加密都是有迹可循的;正如我们所知,加密的字体数量一般都不会太大且会随访问请求而变化,也就是说 ,字体加密的字体库每次都是变化的,我们需要在爬去网页的同时拿取加密的字体库,进行解密,

基本流程:

1、请求页面
2、获取加密的字体库
3、解析字体库,获取字体间的映射关系
4、获取加密的字体,获取字体间映射关系,一一对应

字体加密一般是网页修改了默认的字符编码集,在网页上加载的他们自己定义的字体文件作为字体的样式,可以正确地显示数字,但是在源码上同样的二进制数由于未加载自定义的字体文件就由计算机默认编码成了乱码。
网站url:https://zz.58.com/pinpaigongyu/?utm_source=sem-baidu-pc&spm=105916146708.26420796287&PGTID=0d100000-0015-63fb-169b-74ddef51914e&ClickID=2

一般来说,通用的解决办法是找到字体文件,分析文件中的映射关系。一般来说,字体文件都是作为样式加在加密字体的部位。

在样式中,我基本上都看完了, 从名字上看只有这个fangchan-secret最可能是字体加密文件。

在源码中Ctrl+F搜索fangchan-secret 寻找字体加密文件

在58的源码中,字体文件是通过base64加密之后放在js里面了。把其中加密的部分取出,第一次是分析,在代码中可使用正则将其中的内容取出来。
58的字体加密文件每次网页刷新,其中的映射顺序会变,所以在不刷新的情况下,再复制一份
这里取第一条799 及其对应的乱码。

base64_str = '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'
price_code = '鸺齤齤'

首先进行base64解码,转化成为二进制形式,在方法中同时我也将字体文件写入了otf字体文件中。

def make_font_file(base64_string: str):bin_data = base64.decodebytes(base64_string.encode())with open('text.otf','wb') as f:f.write(bin_data)return bin_data

使用fontCreator打开字体文件可以直观的看到每一个数字对应的编码

将字节文件转化为xml格式

def convert_font_to_xml(bin_data):# 由于TTFont接收一个文件类型# BytesIO(bin_data) 把二进制数据当作文件来操作font = TTFont(BytesIO(bin_data))font.saveXML("text.xml")
bin_data = make_font_file(base64_str)
convert_font_to_xml(bin_data)
# 获取对应关系
font = TTFont(BytesIO(make_font_file(base64_str)))
uniList = font['cmap'].tables[0].ttFont.getGlyphOrder()
c = font['cmap'].tables[0].ttFont.tables['cmap'].tables[0].cmap
# c = font.getBestCmap()
print('cmap is:::::', c)

打印出来是这样子:cmap is::::: {38006: 'glyph00007', 38287: 'glyph00009', 39228: 'glyph00004', 39499: 'glyph00005', 40506: 'glyph00008', 40611: 'glyph00006', 40804: 'glyph00010', 40850: 'glyph00001', 40868: 'glyph00003', 40869: 'glyph00002'}
该字典的键就是网页上显示的乱码的unicode编码,值就是该乱码对应的真正数字。

其中glyph00007是资源,每一个glyph0000x对应一个数字 、58的字体文件比较偷懒,根据其后缀就知道对应的数字是对少
又字体的xml文件中,下图部分开始可知(我没截取完),glyph00000没有意义,glyph00001对应0,glyph00001对应1以此类推。

那么,我们根据网页抓取的乱码的unicode编码,获取其对对应的字源,即可获取所对应的数字。

def get_num(string):ret_list = []for char in string:decode_num = ord(char)num = c[decode_num]num = int(num[-2:])-1ret_list.append(num)return ret_list

如果通过浏览器看到的是类似鸺齤齤这样的乱码,使用爬虫获取的数据是类似 鸺龒龒 十六进制的数字,可直接截取后面四位转化为十进制数后在通过映射表查找。

以下是详细代码

import base64
from io import BytesIO
from fontTools.ttLib import TTFont
import requests
import re
from lxml import etreeurl = 'https://cd.58.com/wuhou/chuzu/b5j5'
res = requests.get(url)
bs64_str = re.findall("charset=utf-8;base64,(.*?)'\)", res.text)[0]def get_page_show_ret(string):font = TTFont(BytesIO(base64.decodebytes(bs64_str.encode())))c = font['cmap'].tables[0].ttFont.tables['cmap'].tables[0].cmapret_list = []for char in string:decode_num = ord(char)if decode_num in c:num = c[decode_num]num = int(num[-2:])-1ret_list.append(num)else:ret_list.append(char)ret_str_show = ''for num in ret_list:ret_str_show += str(num)return ret_str_showpage = etree.HTML(res.text)
li = page.xpath('.//ul[@class="listUl"]//li')[0:-1]
for each_li in li:title = each_li.xpath('.//div[@class="des"]/h2/a/text()')[0].strip()title = get_page_show_ret(title)price = each_li.xpath('.//div[@class="money"]/b/text()')[0]price = get_page_show_ret(price)print(title)print(price)print('='*20)

破解字体加密解决思路相关推荐

  1. 58字体加密解决思路

    加密思路 关于字体加密,其实是将一种特定的字体库来代替浏览器本身的字体库显示的过程 58字体库加密方式 58同城中,无论是简历中的字体加密,还是房产信息中的加密都是有迹可循的:正如我们所知,加密的字体 ...

  2. python 破解字体加密实战

    破解字体加密,以58同城网站为例. 字体加密是爬取网页的过程中比较麻烦的问题. 字体加密一般是网页修改了默认的字符编码集,在网页上加载的他们自己定义的字体文件作为字体的样式,可以正确地显示数字,但是在 ...

  3. python爬虫破解字体加密案例

    python爬虫破解字体加密案例 本次案例以爬取起小点小说为例 案例目的: 通过爬取起小点小说月票榜的名称和月票数,介绍如何破解字体加密的反爬,将加密的数据转化成明文数据. 程序功能: 输入要爬取的页 ...

  4. 最新版的破解字体加密方法!学会了就没有你不能爬的网站!

    前言 最近看到一些博主在讲解加密字体的破解方式,大体的解决方式是分析网页源代码,通过请求查看自定义字体,然后经过数据抓取完成需求. 这个方法确实很不错,但是对于我这种不太会爬虫的小白来说就与一些超纲了 ...

  5. Python爬取58同城租房数据,破解字体加密

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 以下文章来源于CSDN,作者:TRHX • 鲍勃 刚接触Python的新手.小白,可以复制下面的链 ...

  6. 破解字体加密,以58同城网站为例。

    字体加密是爬取网页的过程中比较麻烦的问题. 字体加密一般是网页修改了默认的字符编码集,在网页上加载的他们自己定义的字体文件作为字体的样式,可以正确地显示数字,但是在源码上同样的二进制数由于未加载自定义 ...

  7. python爬虫实践-02-大众点评评论爬取-破解CSS字体加密

    本文以页面https://www.dianping.com/shop/jh631305VtnDuXpl/review_all为例,对大众点评的CSS+SVG字体加密的反爬机制进行破解,解析得到评论信息 ...

  8. 爬虫之常见的反爬手段和解决思路

    1 服务器反爬的原因 爬虫占总PV(PV是指页面的访问次数,每打开或刷新一次页面,就算做一个pv)比例较高,这样浪费钱(尤其是三月份爬虫). 三月份爬虫是个什么概念呢?每年的三月份我们会迎接一次爬虫高 ...

  9. Python 常见的反爬手段和解决思路

    学习目标: 1.了解 服务器反爬的原因: 2.了解 服务器常反什么样的爬虫: 3.了解 反爬虫领域常见的一些概念: 4.了解 反爬的三个方向: 5.了解 常见基于身份识别进行反爬: 6.了解 常见基于 ...

最新文章

  1. 图的深度搜索c语言,求图的深度优先搜索!该怎么处理
  2. SQL语句删除重复记录
  3. 【JavaEE企业应用实战学习记录】struts配置文件详细解析
  4. authenticate总是返回None
  5. hdu1018--Big Number
  6. 算法----字符串拷贝
  7. aop springboot 传入参数_springboot用aop做参数校验
  8. 微软office2004 抢新体验版
  9. python中的numpy标准正态分布_Numpy创建正态分布和均匀分布
  10. 英语常用的62个英语句型,必备
  11. webpack4.x的学习
  12. Vue SPA工作原理
  13. 人眼视觉系统(Human Visual System)
  14. 最新PanDownload卢本伟修改版,直达60M/s
  15. yolov5代码及原理详解
  16. 物联网操作系统应该怎么选?
  17. 关于女神SQLite的疑惑(2)
  18. MacOS下载并配置gradle
  19. 网站安全测试与检测中 发现的OA系统中的SQL注入漏洞
  20. 江苏职称计算机考试汇总,江苏省职称计算机考试.doc

热门文章

  1. 以太坊2.0究竟何时落地?V神这样说……
  2. 只要100行代码,实现文本编辑器中的草稿箱功能
  3. Vue+uniapp桃源婚恋交友APP 安卓小程序 nodejs java python
  4. 谷歌卫星地图导出MBTile离线包及应用教程
  5. 7.1. 布朗运动-定义和构造(Durrett)答案
  6. python数据包分析_用python编写脚本分析网络数据包
  7. 龙族幻想服务器维修到几点,【龙族幻想】4月1日维护公告
  8. Luogu4711「化学」相对分子质量
  9. python argparse命令行参数解析
  10. Andorid Studio 制作欢乐写数字(Timer启动+帧动画,Android开发面经分享