字体反爬应该是比较常见的反爬手段了,常见于招聘网站平台,相信很多不少人都遇到过,特征比较明显,而且限制难度愈发增加,比如随机替换字体库。

字体反爬最关键的是确定字体库(前提),找到映射关系(关键),然后直接替换即可!

在学习实践lideSky字体反爬(第三题好像放弃了)的过程中找到一个替代的练手网站,闪职网,字体反爬比较简单,适合本渣渣这种新手练习学习使用。

字体反爬,Python爬虫练习网站闪职网字体反爬练手解析!_爬虫

练手网站:http://shanzhi.spbeen.com/

感谢作者提供练手网站平台!

特征:关键数字信息网页前端显示和网页源码显示不一致,网页源码显示一定规律的乱码特征

字体反爬,Python爬虫练习网站闪职网字体反爬练手解析!_开发语言_02

需要说明的是该网站还有无限断点调试反爬,直接在该处永不断点解决!

字体反爬,Python爬虫练习网站闪职网字体反爬练手解析!_映射关系_03

字体反爬,Python爬虫练习网站闪职网字体反爬练手解析!_开发语言_04

为什么说这个字体反爬网站比较简单适合练手:

1.字体文件比较明显,就在网页开头的样式表中,而且字体文件单一,没有字体库,会随着网页刷新更换字体文件;

字体反爬,Python爬虫练习网站闪职网字体反爬练手解析!_公众号_05

2.字体文件中字体映射关系一目了然,打开即可看到相应的映射关系,一目了然。

字体反爬,Python爬虫练习网站闪职网字体反爬练手解析!_开发语言_06

这里简单说下,字体文件打开及分享工具:

  1. 在线字体编辑器 :https://font.qqe2.com/
  2. 字体编辑软件 :FontCreator
  3. 如果需要通过python去读取识别字体文件里面的内容 :pip install fontTools ‐i  https://pypi.tuna.tsinghua.edu.cn/simple

最后在简单分享一个几个代码片段:

字体获取:

import requests
from fontTools.ttLib import TTFont


def get_ttf():
    url="http://shanzhi.spbeen.com/static/fonts/szec.ttf"
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36"
    }
    response = requests.get(url=url, headers=headers, timeout=6)
    with open("szec.ttf",'wb') as f:
        f.write(response.content)

    print("保存字体文件成功!")

def get_xml():
    font = TTFont('szec.ttf')
    font.saveXML('szec.xml')

字体映射:

#映射
number_map = {
    "9F92":0,
    "9EA3":1,
    "993C":2,
    "958F":3,
    "9FA4":4,
    "9476":5,
    "9A4B":6,
    "9F64":7,
    "9FA5":8,
    "9E3A":9
}

月薪转换:

#转换月薪
def get_people_salarys(salarys):
    people_salarys=[]
    for salary in salarys:
        salary=salary.split(";")
        salary=salary[:-1]
        nums=""
        for key in salary:
            key=key[-4:]
            key = key.upper()
            num=number_map[key]
            print(key,num)
            nums=f'{nums}{num}'
        print(nums)
        people_salarys.append(f'{nums}¥/月')

    print(people_salarys)
    return people_salarys

招聘人数转换:

#转换招聘人数
def get_people_numbers(peoples):
    people_numbers=[]
    for people in peoples:
        key=re.findall(r' 招聘&#x(.+?);人',people)[0]
        key =key.upper()
        people_number=number_map[key]
        print(key,people_number)
        people_numbers.append(f'招聘{people_number}人')
    print(people_numbers)

    return people_numbers

以上仅供参考!

完整代码获取 

请关注本渣渣公众号

字体反爬,Python爬虫练习网站闪职网字体反爬练手解析!_python_07