前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >字体反爬之实习僧

字体反爬之实习僧

作者头像
老肥码码码
发布2020-01-17 11:31:46
1.2K1
发布2020-01-17 11:31:46
举报

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

网页分析

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

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

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

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

构造字典

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

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

具体构造字典代码如下:

代码语言:javascript
复制
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文档或者其他数据库之中。下图是部分爬取结果。

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

喜欢就点个赞吧❤

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-07-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 算法与数据之美 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档