大学实习或刚大学毕业的时候肯定对工作很着急,相信不少的同学都在实习僧这个平台找到了一份适合的工作,身为爬虫爱好者肯定要研究一下这个网站呀,看看有没有啥反爬,我最开始发现的就是字体反爬,那么咱就说说实习僧的字体反爬吧。
-
首先 确定要爬取的页面(就是岗位详细信息)不需要登陆就能查看
-
查看源码 看一下数据有没有被加密(就是有没有字体反爬)
-
查找字体加密文件(无非就是两种 1,一长串base64加密后的字符串,2,字体文件地址)本网站属于第一种
-
用正则 获取字体文件数据写入到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)