python3爬虫解决css字体反爬(猫眼案例代码实战)

python爬虫反反爬,你几乎可以横扫大部分 css 字体加密的网站

原标题:python爬虫反反爬,你几乎可以横扫大部分 css 字体加密的网站

你已经知道了对方是

如何自定义字体加密的了

python3爬虫解决css字体反爬(猫眼案例代码实战)

你要想去反反爬

你就要先站在对方的角度去思考问题

有句话这么说来着

“知己知彼,才能那啥”

python3爬虫解决css字体反爬(猫眼案例代码实战)

那么对于像猫眼电影、大众点评等等

那样的 css 自定义字体加密

应该怎么破呢?

接下来就是

学习 python 的正确姿势

python3爬虫解决css字体反爬(猫眼案例代码实战)

有人说了

不就是把字体通过 unicode 编码吗?

python3爬虫解决css字体反爬(猫眼案例代码实战)

那就简单了啊

把每个字的编码找到

然后使用字典把编码和对应的字对应起来

抓取分析的时候

直接替换不就得了

python3爬虫解决css字体反爬(猫眼案例代码实战)

有道理是有道理

但是

如果我每次返回给你的编码都不一样呢?

你说死不死

python3爬虫解决css字体反爬(猫眼案例代码实战)

好了好了,先别哭得那么舒服

我们来看看天猫电影票房榜单的页面

https://maoyan.com/board/1

python3爬虫解决css字体反爬(猫眼案例代码实战)

python3爬虫解决css字体反爬(猫眼案例代码实战)

正如你所看到的那样

这里也使用了字体加密

通过源代码我们可以看到

font-face这里制定了字体文件路径

python3爬虫解决css字体反爬(猫眼案例代码实战)

还是熟悉的配方

熟悉的味道~

python3爬虫解决css字体反爬(猫眼案例代码实战)

不过小老弟

还是不要开心太早

刷新几次你就会发现

(盯着下图 2 秒钟)

python3爬虫解决css字体反爬(猫眼案例代码实战)

看到没有

字体文件一直在变

woc!

玩呢?

python3爬虫解决css字体反爬(猫眼案例代码实战)

python3爬虫解决css字体反爬(猫眼案例代码实战)

我们先把字体文件下载下来

# 把整个页面搞下来

url = 'https://maoyan.com/board/1'

html = download_html(url).decode('utf-8')

用正则把字体文件名拿一下

font_file_name = re.findall(r'//vfile.meituan.net/colorstone/(w+.woff)', html)[0]

拿到了文件名之后就构建一下url

然后把字体文件下载下来

url = 'http://vfile.meituan.net/colorstone/' + font_file_name

font_file = download_html(url)

接着把字体文件写到本地文件中

with open('fonts/' + font_file, 'wb') as f:

f.write(new_file)

使用 fontTools 来获取字体

如果你之前没安装的话要安装才能用

接着我们把字体文件保存为 xml

font = TTFont('fonts/' + font_file)

font.saveXML('./'+font_file+'.xml')

python3爬虫解决css字体反爬(猫眼案例代码实战)

快打开打开看看

python3爬虫解决css字体反爬(猫眼案例代码实战)

哇,这些玩意

有点眼熟啊

这不就是加密的 unicode 码么

左边的 id 难道就是对应的数字?

python3爬虫解决css字体反爬(猫眼案例代码实战)

恩没那么简单

就能找到聊得来的伴

尤其是在看过了那么多背叛

总是....

python3爬虫解决css字体反爬(猫眼案例代码实战)

不好意思

走错片场了

回到我们刚刚的 xml 文件

往下拉一下

可以看到这个

python3爬虫解决css字体反爬(猫眼案例代码实战)

这里每一个编码都对应一个 TTGlyph 对象

从各种 x y 坐标可以猜测

它应该是用来绘制一个字的

我们把任意一个对象复制一下

然后用 matplotlib 根据坐标画个图试试看

import matplotlib.pyplot as plt

import re

str = """"

<contour>

<pt x="130" y="201" on="1"/>

<pt x="145" y="126" on="0"/>

<pt x="216" y="60" on="0"/>

<pt x="270" y="60" on="1"/>

<pt x="332" y="60" on="0"/>

<pt x="417" y="146" on="0"/>

.....此处省略一点代码

</contour>

"""

x = [int(i) for i in re.findall(r'<pt x="(.*?)" y=', str)]

y = [int(i) for i in re.findall(r'y="(.*?)" on=', str)]

print(x)

print(y)

plt.plot(x, y)

plt.show()

运行一波

python3爬虫解决css字体反爬(猫眼案例代码实战)

哈哈

妈的,uniEA78 就是 3 !

那么其它的编码也是这个道理了

还记得 python爬虫20 | 小帅b教你如何识别图片验证码 吗?

我们把那十个编码都画一遍

然后识别成数字

再封装成字典不就好了?

python3爬虫解决css字体反爬(猫眼案例代码实战)

好像这样做效率不高耶

有没有别的什么办法呢

我们再请求一下猫眼的字体文件

这次返回的文件又不同了

python3爬虫解决css字体反爬(猫眼案例代码实战)

打开你会发现

返回的编码都不一样了

python3爬虫解决css字体反爬(猫眼案例代码实战)

python3爬虫解决css字体反爬(猫眼案例代码实战)

咋整捏

还记得我们刚刚绘制的 3 么?

python3爬虫解决css字体反爬(猫眼案例代码实战)

我们来搜一下新下载的文件

是不是绘制 3 的坐标也是一样的呢

python3爬虫解决css字体反爬(猫眼案例代码实战)

嘿嘿

仔细看下上面两张图里面的坐标

居然一模一样

也就是说

虽然编码的名称不同

但是

它们对象里面对应的内容是一样

对不对?

灵感来了

就是这里了

从这里下手

python3爬虫解决css字体反爬(猫眼案例代码实战)

我们在第一次请求字体文件的时候

把编码对应的数字先给找出来

然后记下来

那么以后再请求到不同的字体文件的时候

虽然得到的编码不同

但是我们可以根据对象对应的内容进行判断

从而就可以得出

新的编码和旧的编码指向同一个内容

那么这两个编码对应的数字就是一样的

python3爬虫解决css字体反爬(猫眼案例代码实战)

代码走起~

第一次请求获取一个字体文件

python3爬虫解决css字体反爬(猫眼案例代码实战)

打开 xml 获取到 unicode 编码

接着你可以通过绘制图的方式

或者通过 fontCreator 软件打开字体文件

或者通过字符去比对每个 unicode 代表的数字

python3爬虫解决css字体反爬(猫眼案例代码实战)

然后

你就可以得到相应的数字

把它写到字典里面去

python3爬虫解决css字体反爬(猫眼案例代码实战)

因为每次请求得到的字体编码都不同

所以上面这个就要作为我们的判断依据

当我们再请求的时候

如果得到的是和我们一开始请求

得到的字体文件一样的话

那就直接返回我们刚刚的字典

python3爬虫解决css字体反爬(猫眼案例代码实战)

不相同的话

我们就要把新的字体文件下载下来

然后对每个编码的对象跟旧的字体文件的每个编码的对象比较

如果对象是相同的话

就把旧的编码所对应的数字赋给新的编码

因为网页上显示的是 这样开头的

所以我们也要跟着换一下

python3爬虫解决css字体反爬(猫眼案例代码实战)

这时候运行

就会得到新的编码和对应的数字了

python3爬虫解决css字体反爬(猫眼案例代码实战)

爽啊

有了这个之后

我想爬取具体数据对你来说不在话下了吧

这里就随便获取一个电影的实时票房来举例

python3爬虫解决css字体反爬(猫眼案例代码实战)

简单粗暴的使用下正则

python3爬虫解决css字体反爬(猫眼案例代码实战)

爬取到编码的时候我们转化一下

就是当编码和字典列表里面的编码有相同的

就替换成数字

python3爬虫解决css字体反爬(猫眼案例代码实战)

运行之后

python3爬虫解决css字体反爬(猫眼案例代码实战)

看下网页

python3爬虫解决css字体反爬(猫眼案例代码实战)

没毛病

再爬取下总票房试试

python3爬虫解决css字体反爬(猫眼案例代码实战)

ok

依然没毛病

python3爬虫解决css字体反爬(猫眼案例代码实战)