最近开始了解抖音视频下载时,发现现在的抖音也像大众点评一样开始使用字体反扒了。
本章内容:

目标网站:某douyin视频下载
反爬机制:js逆向爬虫,字体反扒
技术难度:★★★★★☆
爬取目标:构建模拟请求signature,下载视频
源代码:https://github.com/FioraLove/Net-Spider/tree/develop/抖音/抖音最新版

1.如何确定是否已使用font反扒

      打开chrome调试工具

  1. 先F12点中那个小箭头,然后点击目标数据,这时关于它的css就会显示出来在右边,像下面这样

从上图中看到 ‘📵📵’就是将真实的数据进行加密反爬了,Ctrl+U 参看网页源代码,可以看到这些图标的‘📵📵’的网页真实为  , 这类的

1
2
3
4
5
<i class="icon iconfont follow-num"> &#xe611; </i>
<i class="icon iconfont follow-num"> &#xe610; </i>
<i class="icon iconfont follow-num"> &#xe611; </i>.
<i class="icon iconfont follow-num"> &#xe60c; </i>w </span>
<span class="text">粉丝</span>

2.多版字体确认加密字体

在开发者工具中选择Network筛选font后刷新网页就能找到这个加密字体了

如何浏览ttf格式文件的字体内容呢?

将下载好的字体文件.ttf,.woff统一转换为 .ttf 格式。

然后选择打开,打开下载好的字体文件:

看到没,在开发者工具哪里看得到,一个数字,其实是有三个编码对应的

3.确认加密字体内容

  • pip install fontTools :使用fontTool打开ttf文件转化成xml文件
1
2
3
4
# -*- coding:utf-8 -*-
from fontTools.ttLib import TTFont
font_1 = TTFont('./douyin.ttf')
font_1.saveXML('font_1.xml')

截取xml文件中的字体加密保存内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<cmap>
<tableVersion version="0"/>
<cmap_format_4 platformID="0" platEncID="3" language="0">
<map code="0x78" name="x"/><!-- LATIN SMALL LETTER X -->
<map code="0xe602" name="num_"/><!-- ???? -->
<map code="0xe603" name="num_1"/><!-- ???? -->
<map code="0xe604" name="num_2"/><!-- ???? -->
<map code="0xe605" name="num_3"/><!-- ???? -->
<map code="0xe606" name="num_4"/><!-- ???? -->
<map code="0xe607" name="num_5"/><!-- ???? -->
<map code="0xe608" name="num_6"/><!-- ???? -->
<map code="0xe609" name="num_7"/><!-- ???? -->
<map code="0xe60a" name="num_8"/><!-- ???? -->
<map code="0xe60b" name="num_9"/><!-- ???? -->
<map code="0xe60c" name="num_4"/><!-- ???? -->
<map code="0xe60d" name="num_1"/><!-- ???? -->
<map code="0xe60e" name="num_"/><!-- ???? -->
<map code="0xe60f" name="num_5"/><!-- ???? -->
<map code="0xe610" name="num_3"/><!-- ???? -->
<map code="0xe611" name="num_2"/><!-- ???? -->
<map code="0xe612" name="num_6"/><!-- ???? -->
<map code="0xe613" name="num_8"/><!-- ???? -->
<map code="0xe614" name="num_9"/><!-- ???? -->
<map code="0xe615" name="num_7"/><!-- ???? -->
<map code="0xe616" name="num_1"/><!-- ???? -->
<map code="0xe617" name="num_3"/><!-- ???? -->
<map code="0xe618" name="num_"/><!-- ???? -->
<map code="0xe619" name="num_4"/><!-- ???? -->
<map code="0xe61a" name="num_2"/><!-- ???? -->
<map code="0xe61b" name="num_5"/><!-- ???? -->
<map code="0xe61c" name="num_8"/><!-- ???? -->
<map code="0xe61d" name="num_9"/><!-- ???? -->
<map code="0xe61e" name="num_7"/><!-- ???? -->
<map code="0xe61f" name="num_6"/><!-- ???? -->
</cmap_format_4>
</cmap>

从xml这里就可以看到对应之前的每一个字符有三个编码,&#xe611; ,&#xe60c; 这类的

整理数据:

1
2
3
4
5
6
7
8
9
10
11
# 源码:https://s3.pstatp.com/ies/resource/falcon/douyin_falcon/static/font/iconfont_9eb9a50.woff
font_dict = { " &#xe603; ": "0", " &#xe60d; ": "0", " &#xe616; ": "0",
" &#xe602; ": "1", " &#xe60e; ": "1", " &#xe618; ": "1",
" &#xe605; ": "2", " &#xe610; ": "2", " &#xe617; ": "2",
" &#xe604; ": "3", " &#xe611; ": "3", " &#xe61a; ": "3",
" &#xe606; ": "4", " &#xe60c; ": "4", " &#xe619; ": "4",
" &#xe607; ": "5", " &#xe60f; ": "5", " &#xe61b; ": "5",
" &#xe608; ": "6", " &#xe612; ": "6", " &#xe61f; ": "6",
" &#xe60a; ": "7", " &#xe613; ": "7", " &#xe61c; ": "7",
" &#xe60b; ": "8", " &#xe614; ": "8", " &#xe61d; ": "8",
" &#xe609; ": "9", " &#xe615; ": "9", " &#xe61e; ": "9"}

最后将网页源代码中的加密字体替换成相应的font_dict字典的值

参考文章


 评论

联系我 | Contact with me

Copyright © 2019-2020 谁知你知我,我知你知深。此恨经年深,比情度日久

博客内容遵循 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 协议