实习僧字体反爬

大学实习或刚大学毕业的时候肯定对工作很着急,相信不少的同学都在实习僧这个平台找到了一份适合的工作,身为爬虫爱好者肯定要研究一下这个网站呀,看看有没有啥反爬,我最开始发现的就是字体反爬,那么咱就说说实习僧的字体反爬吧。

  1. 首先 确定要爬取的页面(就是岗位详细信息)不需要登陆就能查看
    在这里插入图片描述

  2. 查看源码 看一下数据有没有被加密(就是有没有字体反爬)
    在这里插入图片描述

  3. 查找字体加密文件(无非就是两种 1,一长串base64加密后的字符串,2,字体文件地址)本网站属于第一种
    在这里插入图片描述

  4. 用正则 获取字体文件数据写入到woff文件中,并转化为xml文件,让我们查看
    在这里插入图片描述

经过多次请求发现每个字体文件里面的文字和顺序都是不变的,变得只是对应的name(就是每个字的标识,看字体文件就知道了,都有一个name属性),我们只需要每次请求吧name的顺序给找出来和文字对应,就可以了
5. 获取正确排序的name
一般的字体文件我们都是用 getGlyphOrder() 或者getBestCmap() 来获取name,然而这个网站还有一个坑就是你获取出来的name并不是按照你所看到的文字顺序(上一步的文字)排列的。name还有一个id属性
在这里插入图片描述
经过我的观察正确的顺序就是根据id来的,用正则吧正确的name取出来就行了。和文字形成对应关系
6. 跟据cmap里面的对应关系和上一步得出的name和文字的关系,得出网页源码的特殊字符和文字的对应关系
代码如下(代码没有优化,是和我的思路一样一步一步往下走的)创作不易 喜欢的同学点下一键三连吧

import requests
from lxml import etree
import base64
import re
from fontTools.ttLib import TTFont
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36"
}
url = 'https://www.shixiseng.com/intern/inn_fcoow5bdpkdh'

ret = requests.get(url=url,headers=headers).text
with open('shixiseng.html','w',encoding='utf8') as f:
    f.write(ret)

with open('shixiseng.html','r',encoding='utf8') as f:
    ret = f.read()
ba64 = re.findall('base64,(.*?)"\)}',ret)[0]
b= base64.b64decode(ba64)
with open('2.woff','wb') as f:
    f.write(b)
font =TTFont('2.woff')
font.saveXML('2.xml')

str= '0123456789一师X会四计财场DHLPT聘招工d周|端p年hx设程二五天tCG前KO网SWcgkosw广市月个BF告NRVZ作bfjnrvz三互生人政AJEI件M行QUYaeim软qU银y联'
font_dict={}
with open('2.xml') as f:
    xml = f.read()
temp1 = re.findall(r'<GlyphID id="(\d+)" name="(.*?)"/>',xml)
temp2 = list(set(re.findall(r'<map code="(.*?)" name="(.*?)"/>',xml)))
print(temp1)
print(temp2)
for x,y in temp1[2:]:
    for e,t in temp2:
        if y==t:
            font_dict['&#x'+e[2:]]=str[int(x)-2]
print(font_dict)

with open('shixiseng.html','r',encoding='utf8') as f:
    ret = f.read()
for i in font_dict:
    ret = ret.replace(i,font_dict[i])
print(ret)



评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱笑的光头强

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值