可以发现对应的某些字体是以某种编码的形式存在的
对应的,在网页里面搜索不到ttf文件,但可以通过network发现@font-face这个东西于是找这个东西

发现是经过base64加密的,于是要用正则把这一段提取出来并进行base64的解密并下载,就可以得到字体对应的ttf文件。


令人费解的是,对于用TTFont加载了这个文件并打印对应的camp发现它的键和值都是在变的,这就变得没有规律可循的,之前做的起点中文网的字体反爬是在键值里面有一个是定值的,但是它肯定是有什么规律的,所有保存为xml进行观察,对ttf文件内部进行分析

打开通过文件下载好的两个xml文件进行比对


可以发现name是不同的,但是里面的参数是一样的,也就是说可以根据里面的参数去判断字体。所有先下载好一个ttf文件,把里面的对应字体写在一个列表里,在以同一个会话发送请求再下载一个新的ttf文件并解析,把两个ttf文件的on字段进行比对从而得出字体的映射关系

import requests
import re
from lxml import etree
from io import BytesIO
import base64
from fontTools.ttLib import TTFontheaders = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36',
}def get_ttf_file(web_orgin):# 从不经过解码的源代码中提取base64加密后的编码font_encoded_data = re.search('base64,(.*?)\)', web_orgin, re.S).group(1)font_decoded_data = base64.b64decode(font_encoded_data)# 保存反爬的字体文件到本地ttf_file_name = 'D://font_58_new.ttf'with open(ttf_file_name, 'wb') as fp:fp.write(font_decoded_data)# 因为这里的编码和字体都是在变化的,不可直接找到定值
# 解决的方法是:先下载好一个ttf文件作为对照,再在新请求的时候
# 新下载一个新的ttf文件,对比两个ttf文件内部每个编码对应的on字段的所有
# 0或1是否是匹配的
def parse_ttf():# 根据事先下载好的字体文件font_58对应顺序写出里面的字体font_list = [u'张', u'4', u'E', u'高', u'2', u'校', u'生', u'科',u'黄', u'3', u'以', u'技', u'0', u'验', u'1', u'本', u'女',u'陈', u'5', u'大', u'专', u'届', u'M', u'无', u'硕', u'士',u'6', u'男', u'B', u'经', u'中', u'杨', u'吴', u'王', u'李',u'下', u'9', u'8', u'博', u'周', u'赵', u'刘', u'7', u'应', u'A']font_base = TTFont('D://font_58.ttf')# 这个文件是先前下载好的,并对应上面这个列表的顺序# font_base.saveXML('D://font_base.xml')font_base_order = font_base.getGlyphOrder()[1:]print(font_base_order)new_font = TTFont('D://font_58_new.ttf')new_font.saveXML('D://new_font.xml')new_font_order = new_font.getGlyphOrder()[1:]print(new_font_order)base_flag_list = list()for i in font_base_order:flags = font_base['glyf'][i].flags# 返回一个字符对应的on字段的0和1组成的列表base_flag_list.append(list(flags))# 二维列表,每一行是对应一个字体的所有on字段的信息new_flag_list = list()for i in new_font_order:flags = new_font['glyf'][i].flags# 返回一个字符对应的on字段的0和1组成的列表new_flag_list.append(list(flags))memory_dict = dict()# 双重循环对每一行进行进行比较,并对里面的对位元素进行一一比对for index1,x in enumerate(base_flag_list):for index2,y in enumerate(new_flag_list):if compare(x,y):# 如果找到相对应的key = new_font_order[index2]# key为对应的编码key = '&#x' + key.replace('uni','').lower() + ';'memory_dict[key] = font_list[index1]# 让其对应于font_58文件写好的字符return memory_dictdef compare(list1,list2):len1 = len(list1)len2 = len(list2)if len1 != len2:return Falsefor i in range(len1):if list1[i] != list2[i]:return Falsereturn Truedef use_parse_result(memory_dict,web_orgin):print(memory_dict)# selector = etree.HTML(web_orgin)# dd_list = selector.xpath("//dl[@class='top-resume']")# for dd in dd_list:#     name = dd.xpath("dd[@class='w70 stonefont resumeName']/text()")[0]#     # sex = dd.xpath("dd[@class='w48 stonefont']/text()")#     # age = dd.xpath("dd[@class='w70 stonefont']/text()")#     # year = dd.xpath("dd[@class='w80 stonefont']/text()")names = re.findall('</dt>.*?<dd.*?stonefont resumeName">(.*?)</dd>',web_orgin,re.S)print(names)for name in names:print(name,end=' ')for key in memory_dict.keys():if key in name:name = name.replace(key,memory_dict[key])print(name)if __name__ == '__main__':url = 'https://gz.58.com/qztech/'session = requests.session()# 维持会话response = session.get(url, headers=headers)web_orgin = response.textweb_data = response.content.decode()get_ttf_file(web_data)mdict = parse_ttf()use_parse_result(mdict,web_orgin)

因为每次请求获取的网页的源代码会不同,所有有时可以成功有时不行,记住解析网页时要维持同一个会话。不然字体的加密编码就不对应了

结果

参考文章:https://mp.weixin.qq.com/s?__biz=MzI2MDA0MjM1NQ==&mid=2651626624&idx=1&sn=3cff561e6080c380838cfe4c0b91f1c6&chksm=f197879cc6e00e8a94cf4b55ee47af615a906b73fbfc4a52f0161ca99f4891e1be8410990afb&mpshare=1&scene=23&srcid=#rd

58同城招聘字体反爬相关推荐

  1. 58同城 房产字体 反爬

    58同城 房产字体 反爬 获取HTML url = "https://sz.58.com/zufang/"UA = {"referer": "http ...

  2. 58同城数字字体反爬

    1.什么是字体反爬 字体反爬也就是自定义字体反爬,通过调用自定义的ttf文件来渲染网页中的文字,而网页中的文字不再是文字,而是相应的字体编码,通过复制或者简单的采集是无法采集到编码后的文字内容 比如5 ...

  3. 爬取58同城,解决反爬字体加密解析问题

    [导语]我们在爬取数据中,会遇到字体乱码的下,其实是字体加密,本篇文章主要解决字体解密这种反爬方式. 1.在浏览器打开58同城网址进入北京租房 2.点击检查,找到房租价格对应位置,发现源码中价格部分是 ...

  4. python爬虫爬取58网站数据_Python爬虫,爬取58租房数据 字体反爬

    Python爬虫,爬取58租房数据 这俩天项目主管给了个爬虫任务,要爬取58同城上福州区域的租房房源信息.因为58的前端页面做了base64字体加密所以爬取比较费力,前前后后花了俩天才搞完. 项目演示 ...

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

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

  6. 20200113Python爬虫---猫眼字体反爬

    在做过58同城的字体反爬过后,信心稍微增长点,那么索性找点字体文件反爬的网址,猫眼是客户要求的网址,那么便开始搞起来. 目标网址 猫眼经典电影 2020大陆影片_电影_经典片-猫眼电影 很明显和汽车之 ...

  7. python 破解字体反爬 (二)

    上一篇我介绍了破解58同城的字体反爬 https://blog.csdn.net/BigBoy_Coder/article/details/103239672 中间遗漏了几个细节,在这边文章我做一下补 ...

  8. 破解58同城字体反爬

    1. 前言 最近接了一个私活,破解58同城的css反爬.(被鸽了)现在决定把它开源出来,以便大家参考学习. 2. 主题 首先,打开页面,了解到这部分信息是有字体加密的.如下图: 这部分信息包含 性别 ...

  9. python爬取实习僧招聘信息字体反爬

    参考博客:http://www.cnblogs.com/eastonliu/p/9925652.html 实习僧招聘的网站采用了字体反爬,在页面上显示正常,查看源码关键信息乱码,如下图所示: 查看网页 ...

最新文章

  1. tap/tun设备 veth设备
  2. 红黑树二叉查找树二叉排序树的理解
  3. vue 数据(data)赋值问题
  4. 数据结构(严蔚敏)之一——顺序表之c语言实现
  5. mysql直接执行文件格式_Windows 环境下执行 .sql 格式文件方式
  6. 大名鼎鼎的电影胶片滤镜--DxO FilmPack 5 mac
  7. 【葫芦娃团队】无人转会申请
  8. 数据--第44课 - 最小连通网
  9. 广州天河租房随笔记录
  10. Verilog HDL 出租车计费器实现
  11. 飚王硬盘盒怎么样_四款USB 3.0硬盘盒完全拆解_DIY攒机-中关村在线
  12. 秘术 | 我刚出生的时候,喝了几天狼奶,我把这头狼当妈,我以为我一辈子见不到她,直到有一个女人过来找我……
  13. OpenCV resize 改变图片大小,4种方式原理对比
  14. check the manual that corresponds to your MySQL server version for the right
  15. npm --save和--save-dev区别
  16. smb.php如何使用,win10smb1协议怎么开
  17. myeclipse17创建Web、Maven项目
  18. twrp双清勾选哪两个_免费读书app,我只留了这两个。
  19. c语言中用了continue头文件,c语言中continue用法是什么?
  20. 使用Laravel View Composers在视图之间共享数据

热门文章

  1. java实现登陆ssm框架_SSM框架搭建web服务器实现登录功能(Spring+SpringMVC+Mybatis)
  2. 利用Hibernate子查询(in) 得到部分字段(实体类的构造函数)
  3. 配置将java转换为python环境
  4. 【无标题】lead与lag函数
  5. HackMyvm靶机系列(3)-visions
  6. proxmox ve 中文社区_proxmox VE 国内镜像
  7. PINN解偏微分方程实例1
  8. 基于Vue的蔬菜购买APP
  9. 苹果iPhone6为何挽救不了富士康?
  10. “永动企鹅”寻找新动力——腾讯:自己与自己的战争.