大众碰到点评的一个字体反爬,落地技术也是绝了&听说学Python字体反爬的人,都打开过这篇博客,自如字体反爬,图片字体反爬

1,248 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第28天,点击查看活动详情

⛳️ 大众 实战场景 点评

本次要用来学习的站点也是比较大众的站点,这个站点中碰到了【套娃】字体加密。

大众碰到点评的一个字体反爬,落地技术也是绝了 打开开发者工具刷新站点,可以得到如下字体文件请求,打开开发者工具碰到无限 debugger,取消掉即可。

大众碰到点评的一个字体反爬,落地技术也是绝了 文字所在标签添加的样式如下所示。 大众碰到点评的一个字体反爬,落地技术也是绝了 然后顺着这个思路进行下去,得到了 4 层字体套娃。 大众碰到点评的一个字体反爬,落地技术也是绝了 而该 CSS 文件,在页面中竟然每次刷新也发生变化。 大众碰到点评的一个字体反爬,落地技术也是绝了

⛳️ 大众 实战场景 点评

编写页面获取代码,得到【图文混排 CSS】文件。

import requests
from lxml import etree
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.54 Safari/537.36",
    "HOST": "www.dianping.com"
}

res = requests.get('http://www.dianping.com/shijiazhuang/ch10',headers=headers)
tree = etree.HTML(res.text)
print(tree.xpath('//link/@href')[8])

得到 CSS 文件之后,在截取其中的字体文件。

这里不在过多解析,查阅一下字体文件每次刷新,是否发生编码变化。

第一次获取的字体文件,随意选择一份

多次测试之后,发现 CSS 文件和字体文件并未切换名称和修改顺序。

获取字体文件编码,与浏览器字符对应关系 大众碰到点评的一个字体反爬,落地技术也是绝了 大众碰到点评的一个字体反爬,落地技术也是绝了 检索源码得到如下内容:

  • :对应 7;
  • :对应 5。

大众碰到点评的一个字体反爬,落地技术也是绝了 再次回到字体文件中找到 7 和 5 对应的编码。

大众碰到点评的一个字体反爬,落地技术也是绝了 本案例结束~ 🤪🤪🤪🤪

⛳️ 自如 实战场景

我们又碰到了一个字体反爬的站点,自如。该站点的字体反爬不是用字体文件实现的,而是基于图片+CSS,具体如下图所示。 听说学Python字体反爬的人,都打开过这篇博客,自如字体反爬,图片字体反爬 这里运用 CSS 背景偏移技术实现数字的展示。

字体图片如下所示。 听说学Python字体反爬的人,都打开过这篇博客,自如字体反爬,图片字体反爬 图片宽度和高度的比例是 300*28,其中 300 像素被等比例放置了 10 个数字,即每 30 个像素一个数字,实测间隔是 21.4 个像素。

后续可以参考该值做区分。

下面还需要确定一下每次刷新,图片是否发生变化。

刷新了一下,发生了变化  ̄ □  ̄||

但是原理是一样的,就是获取图片之后,然后解析对应的图片,通过 OCR 技术,识别文字。

⛳️ 自如 实战编码

获取源码,解析图片地址。

import requests
from lxml import etree
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.54 Safari/537.36"
}

res = requests.get('https://www.ziroom.com/z/',headers=headers)
tree = etree.HTML(res.text)
img_style = tree.xpath("//span[@class='num']/@style")[0]
# 不用正则,直接截取字符串
print(len('background-image: url(//'))
print(len(');background-position: -42.8px'))
# 不用正则,直接截取字符串
img_src = img_style[24:len(img_style)-30]

然后通过 OCR 软件识别相关信息,然后进行提取。

# 下载图片文件,通过 OCR 识别出数字

import ddddocr
ocr = ddddocr.DdddOcr()

res = requests.get('https://'+img_src,headers=headers)
# print(res.content)
# with open('./images/num_img1.png','wb') as f:
#     f.write(res.content)
res = ocr.classification(res.content)
print(res)

测试中识别的数字为 5471380629,然后将其拆解即可。

测试发现截取图片地址的时候,有时候会出现图片地址错误,建议大家依旧使用正则表达式获取。

最后就是坐标与数字的对应关系了

  • -21.4:第一个数字
  • -42.8:第二个数字
  • -64.2:第三个数字

其余的都参考这个原理即可。

📢📢📢📢📢📢 💗 你正在阅读 【梦想橡皮擦】 的博客 👍 阅读完毕,可以点点小手赞一下 🌻 发现错误,直接评论区中指正吧 📆 橡皮擦的第 670 篇原创博客