字体反爬之实习僧

炎热的暑假过后,就是新一轮的春招了,甚至很多公司都已经开始了提前批招聘。在正式进入职场之前,找一份实习来提升自己对工作,对岗位的熟悉程度也是非常有必要的。今天我们就来爬取一下实习僧的岗位招聘数据吧!

网页分析

我们进入实习僧官网,输入“算法”,即搜寻算法相关岗位,观察发现,该网站也采用了字体反爬,“实习生”的“生”字在源代码中显示为小方框。

我们注意到右边有展示出所用的字体形式:myFont。接着我们可以在网页源代码中搜索myFont,果然让我们找到了字体文件。

把这个url与实习僧官网进行拼接,我们便可以将实习僧的字体文件下载到本地。通过fontTools库将字体文件以xml的形式展示出来。该文件会以一定频率更新,我们再次抓取字体文件也以xml的形式展示。发现其name完全相同,通过FontCreator发现它们所表示的字体也完全相同,那么究竟是哪里不同呢?

仔细观察xml,我们发现它们的字体编码不同。而其uniname是字符对应的unicode编码,如网页源代码中的“机器学习实习&#xe73a”,对应于uni751F,对应“生”字。只要能将字体的编码在源代码中替换成对应字体,我们就可以解决实习僧的字体反爬问题。

构造字典

我们可以通过正则表达式提取xml中的字体的unicode,并将其通过encode('utf-8')进行编码,再通过decode('unicode_escape')解码出汉字。

把字体的编码当成key,真实的字体当成value,构造成替换字典。

具体构造字典代码如下:

def get_dict():   
    '''
    输入:无
    输出:字体文件对应的字体字典(包含字体编码和对应字体)以及字体编码
    '''
    r=requests.get('https://www.shixiseng.com/interns/iconfonts/file')
    with open ('new_font.woff','wb') as f:
        f.write(r.content)
    font1=TTFont('new_font.woff')
    font1.saveXML('new_font.xml')


    with open('new_font.xml') as f:
        xml=f.read()
    keys=re.findall('<map code="(0x.*?)" name="uni.*?"/>',xml)[:99]
    values=re.findall('<map code="0x.*?" name="uni(.*?)"/>',xml)[:99]
    for i in range(len(values)):
        if len(values[i])<4:
            values[i]=('\\u00'+values[i]).encode('utf-8').decode('unicode_escape')
        else:
            values[i]=('\\u'+values[i]).encode('utf-8').decode('unicode_escape')
    word_dict=dict(zip(keys, values))
    # print(word_dict)
    return word_dict,keys

 整体逻辑

上面我们分析了本次爬取的关键点:字体反爬。接下来我们来整理一下整个爬虫的逻辑。

首先是获取字体字典,接着将网页源代码中的编码替换成人们可读的字体形式,然后就是分析爬取页面,利用xpath或css或BeautifulSoup等对网页源代码进行解析,提取出想要的关键信息,最后将数据存入txt文档或者其他数据库之中。下图是部分爬取结果。

本文的全部代码等所需文件已全部上传至后台,回复“实习僧”即可获得。

                                                                        喜欢就点个赞吧❤

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值