Python编程基础:python爬虫反反爬,你几乎可以横扫大部分 css 字体加密的网站

你已经知道了对方是

如何自定义字体加密的了

 

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

 

 

你要想去反反爬

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

有句话这么说来着

“知己知彼,才能那啥”

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

 

 

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

那样的 css 自定义字体加密

应该怎么破呢?

接下来就是

学习 python 的正确姿势

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

 

有人说了

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

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

 

那就简单了啊

把每个字的编码找到

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

抓取分析的时候

直接替换不就得了

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

 

有道理是有道理

但是

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

你说死不死

 

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

 

 

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

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

https://maoyan.com/board/1

 

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

 

 

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

 

 

正如你所看到的那样

这里也使用了字体加密

通过源代码我们可以看到

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

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

 

 

还是熟悉的配方

熟悉的味道~

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

 

 

不过小老弟

还是不要开心太早

刷新几次你就会发现

(盯着下图 2 秒钟)

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

 

看到没有

字体文件一直在变

woc!

玩呢?

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

 

python爬虫反反爬,你几乎可以横扫大部分 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')

 

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

 

快打开打开看看

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

 

哇,这些玩意

有点眼熟啊

这不就是加密的 unicode 码么

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

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

 

 

恩没那么简单

就能找到聊得来的伴

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

总是....

 

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

 

 

不好意思

走错片场了

回到我们刚刚的 xml 文件

往下拉一下

可以看到这个

 

python爬虫反反爬,你几乎可以横扫大部分 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()

运行一波

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

 

 

哈哈

妈的,uniEA78 就是 3 !

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

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

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

然后识别成数字

再封装成字典不就好了?

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

 

 

好像这样做效率不高耶

有没有别的什么办法呢

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

这次返回的文件又不同了

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

 

 

打开你会发现

返回的编码都不一样了

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

 

 

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

 

 

咋整捏

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

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

 

 

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

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

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

 

嘿嘿

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

居然一模一样

也就是说

虽然编码的名称不同

但是

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

对不对?

灵感来了

就是这里了

从这里下手

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

 

 

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

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

然后记下来

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

虽然得到的编码不同

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

从而就可以得出

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

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

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

 

 

代码走起~

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

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

 

 

打开 xml 获取到 unicode 编码

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

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

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

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

 

 

然后

你就可以得到相应的数字

把它写到字典里面去

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

 

 

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

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

当我们再请求的时候

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

得到的字体文件一样的话

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

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

 

 

不相同的话

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

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

如果对象是相同的话

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

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

所以我们也要跟着换一下

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

 

 

这时候运行

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

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

 

 

爽啊

有了这个之后

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

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

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

 

 

简单粗暴的使用下正则

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

 

 

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

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

就替换成数字

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

 

 

运行之后

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

 

 

看下网页

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

 

 

没毛病

再爬取下总票房试试

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

 

 

ok

依然没毛病

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

猜你喜欢

转载自www.cnblogs.com/cherry-tang/p/11089958.html