需求说明

爬取实习僧网站岗位信息时,遇到网页自定义字体反爬,与猫眼字体反爬类似。


解决思路

通过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

网页字体转换——实习僧相关推荐

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

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

  2. 实习僧网站字体反爬破解思路及步骤分享

    需要用到的第三方包 fontTools 崔庆才博客:今天,我终于弄懂了字体反爬是个啥玩意! 哔哩哔哩视频:python零基础一节课带你玩转字体反爬 测试网站选取了实习僧:实习僧 TTF(TrueTyp ...

  3. 【python实现网络爬虫(4)】实习僧网站信息爬取(字体反爬虫破解)

    实习僧网站 实习僧网址,地址为北京,在搜索框输入"python",如下 实战解析 步骤一.建立for循环爬取前20页的内容 首先.查看翻页URL的信息,找规律 第一页:https: ...

  4. 对网页进行简繁字体转换的简单方法

    对网页进行简繁字体转换的方法一般有两种:一是使用<简繁通>这样的专业软件,另外一种是制作两套版本的网页.显然,这两种方法都较为麻烦,而且专业软件一般不能用于免费的空间.笔者在这里给大家提供 ...

  5. html在电脑上转换字体怎么变了,电脑网页字体怎么变换大小

    电脑网页字体变大有时候会让人产生不舒服的感觉,有时候就想网页字体变换一下大小,下面是学习啦小编整理的电脑网页字体变换大小的方法,供您参考. 电脑网页字体变换大小的方法一 首先,建议如果是私人电脑的情况 ...

  6. python爬虫爬取实习僧岗位信息并存入excel数据表中

    欢迎访问我的个人网站http://liubofeng.com 网页分析 博主在本博客中爬取的是数据分析岗位. 进入网站首页https://www.shixiseng.com/搜索数据分析,F12审查元 ...

  7. 爬虫实战:链家租房数据爬取,实习僧网站数据爬取

    前面已经进行了爬虫基础部分的学习,于是自己也尝试爬了一些网站数据,用的策略都是比较简单,可能有些因素没有考虑到,但是也爬取到了一定的数据,下面介绍两个爬过的案例. 爬虫实战 链家网站爬取 实习僧网站爬 ...

  8. 将爬取的实习僧网站数据传入HDFS

     一.引言: 作为一名大三的学生,找实习对于我们而言是迫在眉睫的.实习作为迈入工作的第一步,它的重要性不言而喻,一份好的实习很大程度上决定了我们以后的职业规划. 那么,一份好的实习应该考量哪些因素呢? ...

  9. 使用 Cufon 渲染网页字体

    2019独角兽企业重金招聘Python工程师标准>>> 这是一篇关于 Cufon 技术的小文章.什么是 Cufon 呢?简单的说,Cufon 是一个用来替代 sIFR 框架,实现在网 ...

最新文章

  1. cad批量选择相同块_CAD如何批量重命名图块或样式
  2. SLAM-ch2-cmake中使用库
  3. oracle 数据库运维技术,Oracle数据库智能运维标准化工艺研究-orastar-DIY数据库运维工具-第1期 导论篇...
  4. 经典C语言程序100例之十五
  5. 文件上传速度查询方法
  6. 基于分位数回归的动态CoVaR计算 案例与代码
  7. Mysql之慢查询日志详解
  8. php和nginx如何,php和nginx如何交互
  9. 【Demo 0015】坐标系
  10. Ajax 读取.ashx 返回404
  11. 《网络安全原理与实践》一1.12 复习题
  12. finally语句与return语句相关问题
  13. oled屏幕(IIC接口+1306驱动)+raspberrypi pico 显示基于RT-Thread
  14. thinkpad开机后无法进入系统怎么办?
  15. leopard 全部搞定状态截图
  16. 走楼梯1步一阶,一步两阶
  17. html加载完成 产生动作,页面加载功能设计总结
  18. 记一次定位解决SpringBoot中内嵌Tomcat的Bug问题
  19. 美团四年,字节三年这七年测试之路希望能让正在迷茫的你少走弯路
  20. 14-网关实战:网关层整合 Swagger 聚合API文档

热门文章

  1. 解压rar/zip工具类
  2. Excel 中统计全表所有人名各出现了多少次
  3. elasticsearch简单使用和ELK的集成
  4. Word2Vec对新闻进行分类
  5. Intellij IDEA 添加项目依赖
  6. 微信小程序微商城(九):微信授权并实现个人中心页面页面
  7. 【10-11】PR调色+多机位剪辑
  8. 如何设计百万人抽奖系统
  9. laravel短信包 easy-sms
  10. 这个Python游戏库,打开就能玩一天!