字体反爬之58同城求职简历数据抓取

一直想写一篇关于字体反爬的文章,但是由于时间问题一直拖到现在,字体反爬的网站有很多比如猫眼电影专业版、汽车之家、58同城、大众点评等,今天我就拿58同城试刀,当然58同城不止求职简历才有字体反爬,比如租房模块也有,大家有空可以自己去研究。

目标

抓取58同城深圳地区的简历信息,由于此次主要是为了破解字体反爬,而且简历信息只有姓名、性别、年龄、工作经验、学历才有字体反爬,所有我们只抓这几个信息,并且时间问题我们只抓取第一页


抓取目标

目标分析

首先用浏览器对页面进行抓包分析,找到信息所在的文件:

抓包

通过抓包发现信息就在当前页面,并没有JS加载渲染以及Ajax异步加载,既然找到了信息的地方,那我们先检查一下我们要抓取的信息:
Elements检查

一检查就傻眼了,发现我们要抓取的信息全部都乱码了,我们再查看一下网页源代码:
网页源代码

我们发现有一些字被编码了,这到底是怎么回事呢?其实这就是我们今天要讲的字体反爬,网站采用了自定义的字体文件,通过字体映射然后在浏览器上正常显示,但是爬虫抓取下来的数据要么就是乱码,要么就是变成其他字符,那么知道了字体反爬的原理,我们就要找到字体文件,字体文件在哪里呢?字体文件一般抓包的时候可以抓到或者定义到了页面里:
Font抓包的字体文件

网页源代码中的字体文件

可以看到两个地方都找到了字体文件,而且我们发现字体文件进行了base64编码,我们直接把字体文件下载下来,然后用百度的FontEditor工具来查看字体文件:
FontEditor查看字体文件

网页源代码中的编码

页面显示的内容

查看字体文件字体对应的编码然后把它们带入到网页源代码中的编码,你会发现居然还原了内容,看到这里你也许会说这还不简单,我把这些字和编码组成对应的映射集合,然后每次抓取的数据按照这个映射集合来替换不就是了,确实可以这样,但是如果你刷新页面后,你再看网页源代码中的编码和字体文件,你会发现字体文件对应的编码变了:
刷新后的字体文件

我们发现字体文件对应的编码变了,但是所有的字没有变,那我们该怎么办呢?这是就要用到Python里面的字体库Font­Tools了。

字体库Font­Tools介绍

Font­Tools 是一套以 ttx 为核心的工具集,用于处理与字体编辑有关的各种问题,程序用 Python 编写完成,代码开源,具有良好的跨平台性。Font­Tools 由以下 4 个程序组成:

  • ttx 可将字体文件与 xml 文件进行双向转换
  • pyft­merge 可将数个字体文件合并成为一个字体文件
  • pyft­sub­set 可产生一个由字体的指定字符组成的子集
  • pyftin­spect 可显示字体文件的二进制组成信息

Font­Tools 原本是托管在 Source­forge 上的项目,由于原项目长期停滞,Be­hdad 在 Github 上 fork 并继续进行开发。由于 Font­Tools 基于 Python 写成,在安装 Font­Tools 之前需要首先安装 Python。

字体库Font­Tools基本使用

  1. TTFont()用于打开本地字体文件
from fontTools.ttLib import TTFont
 
# 可以是.ttf类型的字体文件也可以是.woff类型的字体文件
# font=TTFont('58.ttf')
font=TTFont('58.woff')
  1. coordinates用于获取字体坐标
from fontTools.ttLib import TTFont
 
font=TTFont('58.woff')
# 获取编码为uniE0AC的字体的坐标
x_y = font['glyf']['uniE0AC'].coordinates
  1. saveXML()将ttf文件或woff文件转化成xml格式并保存到本地,主要是方便查看内部数据结构

from fontTools.ttLib import TTFont
 
font=TTFont('58.woff')   
font.saveXML('58.xml')

把字体文件转化成xml格式,以便打开查看里面的数据结构。打开xml文件可以看到类似html标签的结构:

XML结构

而对我们有用的是<GlyphOrder>标签对象glyf标签对象
<GlyphOrder>标签对象

点开标签内部,<GlyphOrder...>内包含着所有编码信息,注意前两个是不是0-9的编码,需要去除。
glyf标签对象

<glyf...> 内包含着每一个字符对象<TTGlyph>,同样第一个和最后一个不是0-9的字符,需要去除。点开<TTGlyph>对象,里面的信息如下,是一些坐标点的信息,可以想到这些点应该是描绘字体形状的,而且我们发现不同的字体文件虽然编码不一样,但是只要它们对应的文字一样,所以我们可以在<TTGlyph>对象里找出坐标规律,这就是我们破解字体反爬的关键所在。

破解思路

先在本地保存一份字体文件58.woff,并通过FontEditor工具确认编码和数字的对应关系,保存到字典中。然后重新访问网页的时候,把网页中新的字体文件也下载保存到本地58tc.woff。先获取58tc.woff中的<GlyphID...>里的编码name的值(uni编码),再通过uni的对象获取其对应的TTGlyph对象的坐标,然后取前2个计算差值,与58.woff中的每一个TTGlyph对象的坐标差值相减注逐一判断是否等于0,再根据TTGlyph对象对应的编码,在字典中找到对应的数字。

import requests
from lxml import etree
import re
import base64
from fontTools.ttLib import TTFont

url = "https://sz.58.com/searchjob/"


headers = {
    'user-agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
                  "Chrome/73.0.3683.86 Safari/537.36",
    }

response = requests.get(url, headers=headers)
html = etree.HTML(response.text)
font_face = html.xpath('//head/style[1]/text()')[0].strip()
# 提前字体文件
base64_code = re.findall(r"base64,(.*?)\)",font_face)
if len(base64_code)!=0:
    base64_code = base64_code[0]
woff = base64.b64decode(base64_code)
# base64 写入字体文件58tc.woff中,一定要wb方式写入,每次运行代码会覆盖文件
with open("58tc.woff","wb") as f:
    f.write(woff)

# 打开下载保存好的新字体文件58tc.woff
font = TTFont('58tc.woff')
# 打开本地保存的基本字体文件58.woff
base_font = TTFont("58.woff")

# getGlyphNames()[1:-1]和getGlyphOrder()[2:]结果是一样的
# uni_list = font.getGlyphNames()[1:-1]
uni_list = font.getGlyphOrder()[2:]

# 定义一个临时存储新字体文件映射关系的字典temp
temp = {}
# 把本地字体文件的映射关系用base_uni和base_value两个列表映射保存
base_uni = [
            'uniE0AC', 'uniE0D6', 'uniE189', 'uniE19A', 'uniE1BC', 'uniE441', 'uniE47A', 'uniE4BE', 'uniE4F1',
            'uniE587', 'uniE5B0', 'uniE5CE', 'uniE615', 'uniE632', 'uniE701', 'uniE87F', 'uniEAC1', 'uniEAF9',
            'uniEB60', 'uniEB96', 'uniEBB0', 'uniEC03', 'uniEF5F', 'uniEF8B', 'uniF037', 'uniF076', 'uniF0A0',
            'uniF13A', 'uniF14D', 'uniF1DB', 'uniF264', 'uniF2D1', 'uniF31A', 'uniF386', 'uniF406', 'uniF46B',
            'uniF49A', 'uniF4DB', 'uniF5F0', 'uniF607', 'uniF62A', 'uniF6E6', 'uniF772', 'uniF787', 'uniF7B9'
]
base_value =[
             '7', '下', '王', '周', '专', '0', '女', '博', '杨', '李', '校', '技', '届', '8', '男', '科', '中',
             '赵', '生', 'M', '9', '以', '经', '6', '陈', 'A', '验', '黄', 'B', '5', '士', '1', '张', '硕', '4',
             '高', '无', '大', '吴', 'E', '应', '3', '2', '本', '刘'
]
# 循环对比
for i in range(len(base_uni)):
    # 编码字体坐标转化成了列表,列表里是一个个元组,元组里放的是(x,y)坐标
    new_glyph = list(font['glyf'][uni_list[i]].coordinates)
    # 用前两个坐标作为取差值
    new_glyph_difference = [abs(k[0] - k[1]) for k in new_glyph[:2]]
    for j in range(len(base_uni)):
        base_glyph = list(base_font['glyf'][base_uni[j]].coordinates)
        base_glyph_difference = [abs(n[0] - n[1]) for n in base_glyph[:2]]
        # 比较两个差值是否为0
        if int(abs(sum(new_glyph_difference) / len(new_glyph_difference)-sum(base_glyph_difference) / len(base_glyph_difference))) == 0:
            # 把编码去掉uni三个字符然后转换成全小写,再拼接成网页源代码一样的编码格式,最后把映射关系存储到temp字典中
            temp["&#x" + uni_list[i][3:].lower() + ';'] = base_value[j]

# 构造正则表达式用|匹配左右任意一个表达式,替换编码
re_rule = '(' + '|'.join(temp.keys()) + ')'
# 把所有的编码替换成文字
response_data = re.sub(re_rule, lambda x: temp[x.group()], response.text)
data = etree.HTML(response_data)
personal_information = data .xpath('//div[@id="infolist"]/ul/li//dl[@class="infocardMessage clearfix"]')
for info in personal_information:
    # 姓名
    name = info.xpath('./dd//span[@class="infocardName fl stonefont resumeName"]/text()')[0]
    # 性别
    gender = info.xpath('./dd//div[@ class="infocardBasic fl"]/div/em[1]/text()')[0]
    # 年龄
    age = info.xpath('./dd//div[@ class="infocardBasic fl"]/div/em[2]/text()')[0]
    工作经验

    work_experiences = info.xpath('./dd//div[@ class="infocardBasic fl"]/div/em[3]/text()')
    if work_experiences == []:
        work_experience = ""
    else:
        work_experience = info.xpath('./dd//div[@ class="infocardBasic fl"]/div/em[3]/text()')[0]
    # 学历
    educations = info.xpath('./dd//div[@ class="infocardBasic fl"]/div/em[4]/text()')
    if educations == []:
        education = ""
    else:
        education = info.xpath('./dd//div[@ class="infocardBasic fl"]/div/em[4]/text()')[0]
    print(name, gender, age, work_experience, education)

结果

运行结果

下面是58.woff文件的下载地址,直接复制这个地址到浏览器下载,下载好放到项目目录同级下并改名为58.woff

58.woff文件:data:application/font-woff;charset=utf-8;base64,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

总结

  • 字体反爬的关键在于字体文件转换成xml文件,虽然编码变了但是中间的规律就是我们破解的依据
  • 如果字体和编码都会发生变化的字体反爬,那么这种方式就不适合,只能使用OCR来识别文字与编码
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,658评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,482评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,213评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,395评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,487评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,523评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,525评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,300评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,753评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,048评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,223评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,905评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,541评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,168评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,417评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,094评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,088评论 2 352

推荐阅读更多精彩内容

  • 一、字体反爬的概述 目前字体反爬的网站是猫眼,汽车之家,天眼查,起点中文网,58同城等等。还有:https://w...
    梦捷者阅读 825评论 0 1
  • 最近兴致上来,就想更换了那Blog标题字体(汉字的);网上搜索了一番,发现蘇新詩柳繁體这款甚合我心;然后就着手搞将...
    晚晴幽草阅读 2,377评论 1 8
  • 我用眼睛看,虽然看不到心灵的恶与善。但懂得蓝天下有这刹那的风景作伴。所以,我不会放弃属于自己的那份态度。让一切浑浊...
    不俗小七阅读 507评论 14 31
  • 看过年会之后,感受最大的是自己的激情都去哪儿了?
    TechLeap阅读 248评论 0 0