Python爬虫篇之文本混淆解析(字体反爬)

前言

相信很多同学在练习Python爬虫项目时遇到过文本混淆,也就是字体反爬。具体情况就是在网页上显示的是正常的数字、单位等信息,但是通过网页解析出来后是一堆乱码,比如某影视网站(相关票房信息被混淆处理了)

字体反爬 是一种具有难度的反爬虫技术,它是通过在网站中使用特殊字体来替换文本内容,使得爬虫无法正确解析其中的内容。字体反爬的原理是将网站中的文本内容转换为特殊的字体格式,然后通过CSS样式来控制字体的显示方式。这种技术的难点在于,爬虫无法直接解析这些特殊格式的字体,导致无法获取其中的文本信息。

字体反爬可以有效地防止爬虫对网站进行爬取,从而保护网站的数据和内容不受到恶意爬取的侵害。大多数影视、房地产、招聘等类型平台习惯采用此技术。

文本混淆简介

简单而言就是利用前端技术干扰,页面可以正常展示,而使用爬虫下载后无法提取正常的数据。

在 CSS3之前,Web 开发者必须使用用户计算机上已有的字体。目前的技术开发者可以使用@font-face 为网页指定字体,开发者可将心仪的字体文件放在 Web 服务器上,并在CSS 样式中使用它。用户使用浏览器访问 Web应用时,对应的字体会被浏览器下载到用户的计算机上。

注:使用自动化selenium也无法获取正常的数据

某习字体反爬

网页分析

打开网站可以发现,薪酬的字体是乱码

页面处理

1、在页面源代码中搜索font-face关键字,可以发现字体文件在网页源代码中

2、在网络抓包里面进行筛选,可以发现这里面有对应的字体文件加载地址,由后端返回

3、对于字体文件,可以直接使用工具进行解析

工具在线地址:http://font.qqe2.com/

使用方式:

  • 下载字体文件到本地目录
  • 访问在线工具网站,点击左上角打开,找到本地目录字体文件即可

字体分析

1、正常在网页里面展示的薪酬是:200-250/天,而下载后的页面元素

2、解析的字体文件

3、woff文件转化成xml文件进行分析,通过分析原来是unicode码


逆向结果


关键代码

class GetZhaoPin():

		...

    def get_font_data(self,ttf):
        font_dict = {}
        # font = TTFont("file.woff")
        font = TTFont(ttf)
        cmap = font.get("cmap").getBestCmap()
        for k, v in cmap.items():
            if v[3:]:
                content = "\\u00" + v[3:] if len(v[3:]) == 2 else "\\u" + v[3:]
                real_content = content.encode('utf-8').decode('unicode_escape')
                k_hex = hex(k)
                # 网页返回的字体是以&#x开头  ,换成以这个开头,下面代码就是直接替换
                real_k = k_hex.replace("0x", "&#x")
                font_dict[real_k] = real_content
        return font_dict
    ...

    def main(self):
        # 第1步:获取html,且存为html文件以便后面研究使用
        ret = self.get_html()
        # 第2步:下载html配套的ttf文件
        self.get_font(ret)
        # 第3步:提取ttf中摄影的数据
        font_dict = self.get_font_data('file.woff')
        # 第4步:对下载(HTML内容)进行替换
        html = self.put_html(font_dict)
        # 第5步:使用xpath提取想要的数据
        data = self.get_data(html)
        print(data)


字体解析模块使用

模块安装

pip install fontTools

字体读取

from fontTools.ttLib import TTFont
# 加载字体文件:
font = TTFont('file.woff')
# 转为xml文件:
font.saveXML('file.xml')

节点读取

from fontTools.ttLib import TTFont
# 加载字体文件:
font = TTFont('file.woff')
kv = font.keys()
print(kv)

字体文件不仅包含字形数据和点信息,还包括字符到字形映射、字体标题、命名和水平指标等,这些信息存在对应的表中:

作用

cmap

字符到字形映射

glyf

字形数据

head

字体标题

hhea

水平标题

hmtx

水平指标

loca

索引到位置

maxp

最大限度的

name

命名

post

后记

获取请求到的字体code和name的对应关系

code_name_map = font_aa.getBestCmap()

获取字体坐标信息

font_aa = TTFont('file.woff')
# 获取请求到的字体形状
glyf = font_aa['glyf']
#font['glyf'][字体编码].coordinates
font_aa['glyf']['uni4E94'].coordinates


总结

字体反爬技术可以让爬虫无法直接解析网页中的文本内容,进而影响爬虫的正常爬取。这对于开发者来说是一种有效的防御手段,可以保护网站的数据和内容不受到未经授权的恶意抓取。但是,在应对字体反爬技术时,爬虫也可以通过下列方式解决:

1、获取字体文件:当爬虫发现网页中的文本内容被替换成了特殊字体时,可以下载相应的字体文件,并使用专门的工具将该字体文件映射到本地字体文件中,进而能够正确解析该字体格式。

2、破解字体映射:有些字体反爬技术会采用自定义的映射表来替换文本内容,爬虫可以通过破解该映射表,获取相应的真实文本内容,进而绕过字体反爬的限制。

3、转换字符编码:如果字体文件被加密或加入了特殊处理,爬虫可以通过转换字符编码的方式,解析字体反爬中使用的特殊字符,从而获取相应的网页内容。

综上所述,尽管字体反爬技术可以对爬虫造成一定的防御,但是爬虫仍可以通过一些技术手段来解决这个问题,因此开发者需要根据具体情况来选择不同的对策手段。

声明:本文章所有演示内容仅供学习交流使用,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系作者立即删除!

原文链接:,转发请注明来源!