网页字体转换——实习僧
需求说明
爬取实习僧网站岗位信息时,遇到网页自定义字体反爬,与猫眼字体反爬类似。
解决思路
通过requests库获取网页字体信息,然后通过百度在线字体解析,解析出字体内容。通过字体的编码和实际字体对象进行编码对应,最后通过编码与数字对应关系,返回具体的数字。
涉及到的库
requests
fontTools
re
base64
实现步骤
1、获取网页字体信息
图片内容为网页中自定义字体代码,由于后面还有很多字符,此处只截取一部分
def get_fonts(url):html = requests.get(url).text # 获取网页代码try: #使用正则获取字体信息pattern1 = 'base64.*==' #字体末尾有时为'=='fonts = re.findall(pattern1, html)[0]except:pattern2 = 'base64.*=' # 字体末尾有时为'='fonts = re.findall(pattern2, html)[0]fonts_after = re.split(r"base64,", fonts)[1] # 去除获取到的字符串前面的'base64,' if fonts_after:base_font = base64.b64decode(fonts_after) # 使用base64库对字体信息进行解析with open("new.woff", 'wb') as f:f.write(base_font)font_ttf = TTFont("new.woff") # 使用TTFont对字体文件进行解析font_ttf.saveXML('font.xml') # 将字体信息保存为xml文件,方便后面读取和转换内容
2、查看字体编码
使用百度在线字体查看解析字体
百度字体查看
解析后的字体如下:
因为实习僧页面中的反爬字体为数字部分,所以 此处只考虑数字字体部分。
3、实现字体转换
构建字体编码对应关系
font_list = {'uni30': '0', 'uni31': '1', 'uni32': '2', 'uni33': '3', 'uni34': '4','uni35': '5', 'uni36': '6', 'uni37': '7', 'uni38': '8', 'uni39': '9'
}
对象字体内容(上图为xml文件内编码与对象对应关系, 下图为获取到的对象编码)
通过上图可以发现,当获取到的内容部分去除’\u’后再加上’0x’即为所求编码
for j in range(0, len(unicdestr)):hexstr += (hex(ord(unicdestr[j])).zfill(4)) # 将Unicode转换为十六进制表示
字体编码与数字转换
with open('font.xml', 'r', encoding='utf-8') as f: # 打开font.xml文件content = f.read()
def return_number(code):pattern1 = '<map code="'+code+'".*/>'cmap = re.findall(pattern1, content)[0] # 使用正则获取所有形势如'<map code="your code" name="对应的数字编码"/>'pattern2 = 'uni.*\d'name = re.findall(pattern2, cmap) # 获取namenumber = font_list[name[0]] # 使用name获取对应的数字return number # 返回获取到的数字
整体代码
import re
# 打开xml字体文件
with open('text1.xml', 'r', encoding='utf-8') as f:file = f.read()
# 创建字体映射表
font_list = {'uni30': '0', 'uni31': '1', 'uni32': '2', 'uni33': '3', 'uni34': '4','uni35': '5', 'uni36': '6', 'uni37': '7', 'uni38': '8', 'uni39': '9'}# # 将获取到的字符转换为对应的数字
def get_number(uni_codes):for i in range(0, len(uni_codes)): # 逐个读取需要转换的Unicode字符unicdestr = uni_codes[i]if unicdestr == '-': # 字符为'-'则直接返回uni_codes[i] = unicdestrelif unicdestr == '/': # 字符为'/'则直接返回uni_codes[i] = unicdestrelse:hexstr = ""for j in range(0, len(unicdestr)):hexstr += (hex(ord(unicdestr[j])).zfill(4)) # 将Unicode转换为十六进制表示pattern1 = '<map code="' + hexstr + '".*/>' # 从xml文件中获取到对应的行cmap = re.findall(pattern1, file)if len(cmap): # 如果cmap不为空则直接name = re.findall('uni\d{2}', cmap[0]) # 获取到name部分的uni码number = font_list[name[0]] # 返回对应的数字uni_codes[i] = number # 将数字回填至列表中else:breakreturn uni_codes # 返回列表def fons_number(work: list): # 获取需要转换的Unicode字符并返回转换好的数字部分job_money, job_time, job_week = 999, 999, 999 # 有部分为空值,在此设置异常值标识pattern1 = '[^天周个月实习]' # 设置从列表中剔除的字符for i in range(0, len(work)):code = work[i]if len(code) == 0: # 如果为空则跳过breakuni_codes = re.findall(pattern1, code) # 获取需要转换的字符codes = get_number(uni_codes) # 执行数字转换函数并返回数字if i == 0: # 在job[0]末尾添加天codes.append('天')job_money = "".join(codes) # 将列表转换为字符串elif i == 1: # 在job[1] 中的1位置添加天codes.insert(1, '天')codes.append('周') # 在末尾添加周job_week = "".join(codes) # 将列表转换为字符串else:codes.insert(0, '实习') # 在job[2]开头插入实习codes.append('个月') # 在末尾插入个月job_time = "".join(codes) # 将列表转换字符串return job_money, job_week, job_time # 返回转换好的内容
Unicode码转十六进制: https://blog.csdn.net/xqf1528399071/article/details/52604304
字体反爬: https://blog.csdn.net/xing851483876/article/details/82928607
网页字体转换——实习僧相关推荐
- python爬取实习僧招聘信息字体反爬
参考博客:http://www.cnblogs.com/eastonliu/p/9925652.html 实习僧招聘的网站采用了字体反爬,在页面上显示正常,查看源码关键信息乱码,如下图所示: 查看网页 ...
- 实习僧网站字体反爬破解思路及步骤分享
需要用到的第三方包 fontTools 崔庆才博客:今天,我终于弄懂了字体反爬是个啥玩意! 哔哩哔哩视频:python零基础一节课带你玩转字体反爬 测试网站选取了实习僧:实习僧 TTF(TrueTyp ...
- 【python实现网络爬虫(4)】实习僧网站信息爬取(字体反爬虫破解)
实习僧网站 实习僧网址,地址为北京,在搜索框输入"python",如下 实战解析 步骤一.建立for循环爬取前20页的内容 首先.查看翻页URL的信息,找规律 第一页:https: ...
- 对网页进行简繁字体转换的简单方法
对网页进行简繁字体转换的方法一般有两种:一是使用<简繁通>这样的专业软件,另外一种是制作两套版本的网页.显然,这两种方法都较为麻烦,而且专业软件一般不能用于免费的空间.笔者在这里给大家提供 ...
- html在电脑上转换字体怎么变了,电脑网页字体怎么变换大小
电脑网页字体变大有时候会让人产生不舒服的感觉,有时候就想网页字体变换一下大小,下面是学习啦小编整理的电脑网页字体变换大小的方法,供您参考. 电脑网页字体变换大小的方法一 首先,建议如果是私人电脑的情况 ...
- python爬虫爬取实习僧岗位信息并存入excel数据表中
欢迎访问我的个人网站http://liubofeng.com 网页分析 博主在本博客中爬取的是数据分析岗位. 进入网站首页https://www.shixiseng.com/搜索数据分析,F12审查元 ...
- 爬虫实战:链家租房数据爬取,实习僧网站数据爬取
前面已经进行了爬虫基础部分的学习,于是自己也尝试爬了一些网站数据,用的策略都是比较简单,可能有些因素没有考虑到,但是也爬取到了一定的数据,下面介绍两个爬过的案例. 爬虫实战 链家网站爬取 实习僧网站爬 ...
- 将爬取的实习僧网站数据传入HDFS
一.引言: 作为一名大三的学生,找实习对于我们而言是迫在眉睫的.实习作为迈入工作的第一步,它的重要性不言而喻,一份好的实习很大程度上决定了我们以后的职业规划. 那么,一份好的实习应该考量哪些因素呢? ...
- 使用 Cufon 渲染网页字体
2019独角兽企业重金招聘Python工程师标准>>> 这是一篇关于 Cufon 技术的小文章.什么是 Cufon 呢?简单的说,Cufon 是一个用来替代 sIFR 框架,实现在网 ...
最新文章
- cad批量选择相同块_CAD如何批量重命名图块或样式
- SLAM-ch2-cmake中使用库
- oracle 数据库运维技术,Oracle数据库智能运维标准化工艺研究-orastar-DIY数据库运维工具-第1期 导论篇...
- 经典C语言程序100例之十五
- 文件上传速度查询方法
- 基于分位数回归的动态CoVaR计算 案例与代码
- Mysql之慢查询日志详解
- php和nginx如何,php和nginx如何交互
- 【Demo 0015】坐标系
- Ajax 读取.ashx 返回404
- 《网络安全原理与实践》一1.12 复习题
- finally语句与return语句相关问题
- oled屏幕(IIC接口+1306驱动)+raspberrypi pico 显示基于RT-Thread
- thinkpad开机后无法进入系统怎么办?
- leopard 全部搞定状态截图
- 走楼梯1步一阶,一步两阶
- html加载完成 产生动作,页面加载功能设计总结
- 记一次定位解决SpringBoot中内嵌Tomcat的Bug问题
- 美团四年,字节三年这七年测试之路希望能让正在迷茫的你少走弯路
- 14-网关实战:网关层整合 Swagger 聚合API文档