前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >抖音字体反爬,爬虫字体反爬策略——每周一个爬虫小教程系列

抖音字体反爬,爬虫字体反爬策略——每周一个爬虫小教程系列

作者头像
SingYi
发布2022-07-14 15:03:26
6330
发布2022-07-14 15:03:26
举报
文章被收录于专栏:Lan小站Lan小站

在B站上看到一个关于抖音字体反爬的视频,看完之后,精神抖擞,不禁感觉,我又行了,于是在模拟器上下载了一个抖音,打开了我尘封已久的抖音号。

image.png
image.png

可以看见显示的数字是正常的,但是查看源码就是错误的。

image.png
image.png
image.png
image.png

既然是字体反爬,那就得去找下字体,双击下载

image.png
image.png

然后用在线字体编辑器打开看一下。

image.png
image.png

我们看到这个数字1的Unicode是$E602,是不是和源代码中的差不多呢。

image.png
image.png
image.png
image.png

在教程里面说到对于字体反爬,需要用模块将字体转为xml,相当于字典,然后就这样替换吧。

将字体文件转换为xml文件需要用到的模块是fonttoole,这里需要自行安装一下。

image.png
image.png
代码语言:javascript
复制
from fontTools.ttLib import TTFont

font = TTFont('iconfont_9eb9a50.woff')
font.saveXML('DouYinFont.xml')

转换完成之后的XML文件。

image.png
image.png

我们来搜索一下我们之前的数字1,他的Unicode就是E602,然后可以发现这里和之前在线字体网站上的结果是一样的

image.png
image.png
image.png
image.png

然后我们来将XML文件提取出来,并输出一下(XML提取我目前也不会,所以是跟着教程写的,后期再去了解一下吧)

代码语言:javascript
复制
a = font['cmap'].getBestCmap()
print(a)
image.png
image.png

这个时候发现似乎这些都变成了数字,而不是之前的$E602这样子的,是因为进制转换了,由原始的16进制,转成了10进制。

image.png
image.png

然后我们需要将这个字典中的十进制数字转成这种16进制,然后还得把0x替换为&#x

然后用代码实现就是酱紫的,大概就是提取出cmap这个节点的信息,然后遍历这个字典,然后重新转换成16进制然后变成字符串,在替换一下。

代码语言:javascript
复制
a = font['cmap'].getBestCmap()
b = {}
for key, value in a.items():
    b[str(hex(key)).replace('0x', '&#x')] = value
print(b)

然后就是用代码将num_这些转换为数字,参照这张字体在线编辑器的即可

image.png
image.png
代码语言:javascript
复制
c = {
    'num_': '1',
    'num_1': '0',
    'num_2': '3',
    'num_3': '2',
    'num_4': '4',
    'num_5': '5',
    'num_6': '6',
    'num_7': '9',
    'num_8': '7',
    'num_9': '8',
}

然后改进一下之前的代码:

代码语言:javascript
复制
for key, value in a.items():
    b[str(hex(key)).replace('0x', '&#x')] = c[value]
print(b)
image.png
image.png

然后为了和网页源码里面一样()所以还需要做一些修改,在后面加一个分号和空格。

代码语言:javascript
复制
for key, value in a.items():
    b[str(hex(key)).replace('0x', '&#x')+'; '] = c[value]
print(b)
image.png
image.png

然后就是请求源码,然后替换了。

代码语言:javascript
复制
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36',
}
url = 'https://www.iesdouyin.com/share/user/91723415754'
res = requests.get(url=url, headers=headers).text
for key, value in b.items():
    if key in res:
        res = res.replace(key, value+' ')
print(res)
image.png
image.png
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

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

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