《封号码罗》python爬虫之抖音分享页破解字体反爬虫进阶实战(六)

无敌免责声明:本文主要用于学习技术,切不可用于非法盈利目的,不可用于商业,不可攻击该服务器
先放出结果镇楼:

{
   'nickname': 'Dear-迪丽热巴', '抖音ID': '274110380', 'work': '演员', 'signature': '先定一个能达到的小目标,比方说来句签名', '关注数量': '0', 'fans': '5130.4w', 'zan': '17058.8w'}
list index out of range
{
   'nickname': '莉哥o3o', '抖音ID': 'kelly0711', 'work': '', 'signature': '无小号 承蒙厚爱 倍感珍惜????Babe们来围脖找我吧ฅ՞•ﻌ•՞ฅ:莉哥OvO', '关注数量': '26', 'fans': '3037.3w', 'zan': '26917.9w'}
{
   'nickname': '娄艺潇', '抖音ID': '142152200', 'work': '抖音音乐人', 'signature': '会跳舞的歌手里体育最好的演员。', '关注数量': '43', 'fans': '2114.4w', 'zan': '10023.6w'}

第一步:分析网页结构,确定抓取数据

在这里插入图片描述
页面的内容不多,主要获取昵称、抖音ID、工作、个性签名、关注数、粉丝数、获赞数等
观察页面,可以发现,显示数字的地方在Element里面显示的都是小方框,根据上一节的内容,不难判断是遇到了字体反爬虫,于是我们到Network里面查看网页的源代码
在这里插入图片描述
Network里面,我们可以看到网页源码,数字被抖音ID: kelly<i class="icon iconfont ">&#xe60d;</i>代替了,例如&#xe60d;所代表的就是数字0,这就是字体反爬虫的一个手段之一

第二步:查看字体文件,构建自定义字典列表映射

注意:我这里所说的映射,不是下图所显示的数据
在这里插入图片描述
这种字典是治标不治本,我们要通过算法,让代码去实现映射,而不是单单的人为自定义字典影视
手动下载字体文件,可能你还并不清楚如何下载,选中字体文件,如下,然后右键,选择Open in new tab,之后文件就会自动下载,在浏览器左下角会有提示,然后我们把下载好的字体,放在项目目录里面
在这里插入图片描述

# 打开字体文件
xml_path = os.path.dirname(__file__)
font = TTFont(xml_path + "/font/iconfont_9eb9a50.woff")
# 另存为XML文件,方便查看,只保存一次就注释下面的这一行命令
font.saveXML(r"D:\gcw\learn_crawler\APP_data\spider_douyin\font\douyin.xml")

分析xml字体文件

# 查看douyin.xml文件,,字符到字形映射表<cmap>的内容,<map>标签中的code代表字符,name代表字形名称
# <map code="0xe602" name="num_"/><!-- ???? --> 代表的是1
# 分析发现,每一个数字都有不同的三个映射关系,如数字1
# <map code="0xe603" name="num_1"/><!-- ???? --> 代表的是0
# <map code="0xe60d" name="num_1"/><!-- ???? -->
# <map code="0xe616" name="num_1"/><!-- ???? -->

按照code的值和网页源码进行对比分析

# 经过分析,code和name的映射对应值如下:
"""
<map code="0xe602" name="num_"/><!-- ???? -->  1
<map code="0xe603" name="num_1"/><!-- ???? --> 0
<map code="0xe604" name="num_2"/><!-- ???? --> 3
<map code="0xe605" name="num_3"/><!-- ???? --> 2
<map code="0xe606" name="num_4"/><!-- ???? --> 4
<map code="0xe607" name="num_5"/><!-- ???? --> 5
<map code="0xe608" name="num_6"/><!-- ???? --> 6
<map code="0xe609" name="num_7"/><!-- ???? --> 9
<map code="0xe60a" name="num_8"/><!-- ???? --> 7
<map code="0xe60b" name="num_9"/><!-- ???? --> 8
......
"""

有一点必须要知道,就是code虽然有三种情况对应同一个数字,但是name的值是一个对应一个数字,那我们要做的就是,根据code去找到name,然后根据name确定对应的数字值,并且字形数据是唯一的,字形数据保存在表<glyf>中,且每个字形都是独立的

# 根据xml的原始数据,手动给出映射数据
# 读取字体文件
tree = ET.ElementTree(file=xml_path + "/font/douyin.xml")
# tree = ET.ElementTree(file="D:/gcw/learn_crawler/APP_data/spider_douyin" + "/font/douyin.xml")
# 定义两个空白字典,用于存储映射数据,然后遍历
s = {
   "name": "", "value": "", "hex": ""}    # 没有使用该字典,仅用来设计字典结构
ys = {
   "name": ""}
# 遍历XML的TTGlyph这个标签,用的是iter这个方法
for elem in tree.iter(tag="TTGlyph"):
    if len(elem.attrib["name"]) >= 4 and len(elem.attrib["name"]) < 6:
        ys["name"] = elem.attrib["name"]
        # print(ys)
# 注意:为了更好的观测数据,我用打印出来的ys数据,填充到来下面的这个字典,value值是通过网页对比获得
base_font = {
   
    "font": [{
   'name': 'num_', "value": "1", "hex": ""},
             {
   'name': 'num_1', "value": "0", "hex": ""},
             {
   'name': 'num_2', "value": "3", "hex": ""},
             {
   'name': 'num_3', "value": "2", "hex": ""},
             {
   'name': 'num_4', "value": "4", "hex": ""},
             {
   'name': 'num_5', "value": "5", "hex": ""},
             {
   'name': 'num_6', "value": "6", "hex": ""},
             {
   'name': 'num_7', "
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值