在做过汽车之家论坛的字体反爬过后,信心稍微增长点,那么索性找点字体文件反爬的网址,猫眼便是一个不错的网址,那么便开始搞起来。

目标网址

https://piaofang.maoyan.com/?ver=normal


很明显和汽车之家的论坛是字体的加密,那么按照之前的步骤走:
第一步:找到字体文件,下载下来。
第二步:通过Font Creator工具读取下载好的字体文件。
第三步:按顺序拿到各个字符的unicode编码,并写出对应的文字列表。
第四步:将顺序unicode编码写成对应的unicode的类型。
第五步:替换掉文章中对应的unicode的类型的文字。
按照上边的简单的步骤一顿乱搞,发现最后更本就不对,这点作者是深有体会,不禁想这是为什么?想了好久也没有想太明白,那么只有去网上找资源,还好关于猫眼的爬虫不少,作者这里参考了他们的思路,这里列出参考的大神博客:

https://blog.csdn.net/xing851483876/article/details/82928607【作者:Mars_DD】
https://www.jianshu.com/u/10b8bef7b005【作者:董小贱】大家也可以参考他们的,这里作者发现他们也都写汽车之家的爬虫了,肯定比作者写的好。

那么思路是有了,自己还是要实践实践,毕竟只有实践才能更好的掌握,那么就简单分享以下这里作者的实践的思路。

分析

为什么猫眼不同于汽车之家呢?这里最重要的一点是,猫眼这里的字体是多个字体文件,每次访问会给你返回不同的字体的文件,这也就是为什么对不上字体的原因。那么作者便索性访问两次下载两套字体进行对比,如下图:

可以发现两次虽然是同一个文字但是字符编码发生了变化,完全和第一个不一样了,这个时候怎么解决呢?不禁考虑虽然对应的字符编码是改变的,那么同一个字体的结构会发生变化吗?(当然这是后话,以后自己可以往这个方向考虑),事实可以通过查看两个个字体文件内部数据结构,方法如下:

from fontTools.ttLib import TTFontfont = TTFont('online_base64.ttf')  # 打开本地字体文件online_base64.ttf
font.saveXML('online_base64.xml')  # 将ttf文件转化成xml格式并保存到本地,主要是方便我们查看内部数据结构

打开online_base64.xml文件可以看到类似html标签的结构.这里我们用到的标签是<GlyphOrder…>和<glyf…>如下图:

那么看一下<GlyphOrder…>标签,内包含着所有编码信息,注意前两个是不是0-9的编码,需要去除。如下图

在看一下<glyf…>标签 内包含着每一个字符对象,同样第一个和最后一个不是0-9的字符,需要祛除。在这里自己有点小理解:可以打开另外一个字体的结构,发现对象的结构是不变的,变化的只是对应的字符编码。

点开对象,里面的信息如下,是一些坐标点的信息,如下图:

通过上边我们大致可以考虑:猫眼电影,虽然字符的编码是变化的,但是对象是不变的。那么我们可以通过第一次下载一个字体文件origin.ttf,并把对应编码的字体写出来,那么当第二次从网上重新下载一个字体文件online_base64.ttf 的时候,可以对比对象信息,如果对象是一样的,那么就把第一次编码对应的文字赋值给第二次的编码,这样即可,不知道说的明白不明白。你可以参考上边两位大神的,他们应该讲的更清楚。那么思路有了,代码如下,莫嫌弃low:

import re
import base64
import chardet
import requests
from scrapy import Selector
from fontTools.ttLib import TTFonturl = 'https://piaofang.maoyan.com/?ver=normal'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36','Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
}
response = requests.get(url=url, headers=headers).content  # 得到字节
charset = chardet.detect(response).get('encoding')  # 得到编码格式
response = response.decode(charset, "ignore")  # 解码得到字符串# 第一次获取的字体,以及对应编码位置,需要手动写一次。
origin_fonts = TTFont('origin.ttf')
origin_obj_list1 = origin_fonts.getGlyphNames()[1:-1]  # 获取所有字符的对象,去除第一个和最后一个,之前的图已经解释清楚为什么去掉最后一个和第一个。
origin_uni_list1 = origin_fonts.getGlyphOrder()[2:]  # 获取所有编码,去除前2个。
origin_dict = {'uniF855': '1', 'uniF755': '8', 'uniF617': '9', 'uniE4CA': '4', 'uniE912': '6', 'uniF514': '3','uniE3A5': '7', 'uniF594': '5', 'uniF16A': '0', 'uniF09C': '2'}  # 写出第一次字体文件的编码和对应字体。# 获取字体文件的base64编码
online_ttf_base64 = re.findall(r"base64,(.*)\) format", response)[0]
online_base64_info = base64.b64decode(online_ttf_base64)
with open('online_base64.ttf', 'wb')as f:f.write(online_base64_info)
online_base64_fonts = TTFont('online_base64.ttf')  # 网上动态下载的字体文件。
online_obj_list2 = online_base64_fonts.getGlyphNames()[1:-1]  # 同上。
online_uni_list2 = online_base64_fonts.getGlyphOrder()[2:]for uni2 in online_uni_list2:obj2 = online_base64_fonts['glyf'][uni2]  # 获取编码uni2在online_base64.ttf中对应的对象for uni1 in origin_uni_list1:obj1 = origin_fonts['glyf'][uni1]  # 获取编码uni1在origin.ttf 中对应的对象。if obj1 == obj2:  # 如果对象一等于对象二dd = "&#x" + uni2[3:].lower() + ';'  # 把编码uni2替换成Unicode编码格式。if dd in response:  # 如果编码uni2的Unicode编码格式在response中,那么替换成origin_dict[uni1]的字体。response = response.replace(dd, origin_dict[uni1])
response_info = Selector(text=response)
all_info = response_info.xpath('//ul[@class="canTouch"]')  # 获取所有的信息
print('电影名字' + '\t' + '实时票房(万元)' + '\t' + '票房占比' + '\t' + '排片占比' + '\t' + '上座率')
for each_info in all_info:movie_name = each_info.xpath('li[1]/b/text()').extract_first()  # 电影名字ticket_number = each_info.xpath('li[2]/b/i[@class="cs"]/text()').extract_first()  # 实时票房(万元)ticket_rate = each_info.xpath('li[3]/i[@class="cs"]/text()').extract_first()  # 票房占比film_rate = each_info.xpath('li[4]/i[@class="cs"]/text()').extract_first()  # 排片占比upper_seat_rate = each_info.xpath('li[5]/span/i[@class="cs"]/text()').extract_first()  # 上座率print(movie_name + '\t' + ticket_number + '\t' + ticket_rate + '\t' + film_rate + '\t' + upper_seat_rate)

结果如下:

那么对比网站信息如下图:

可以看到抓取正确了,猫眼代码和思路在上边,如果你路过看到了,有迷惑的地方,可以一起讨论共同进步,当然如果你有更好的网站或者难以破解的,咱们可以一起研究研究,共同进步。

Python爬虫---猫眼字体反爬相关推荐

  1. Python爬虫:字体反爬处理(猫眼+汽车之家)-2018.10

    环境:Windows7 +Python3.6+Pycharm2017 目标:猫眼电影票房.汽车之家字体反爬的处理 -全部文章: 京东爬虫 .链家爬虫.美团爬虫.微信公众号爬虫.字体反爬.Django笔 ...

  2. 20200113Python爬虫---猫眼字体反爬

    在做过58同城的字体反爬过后,信心稍微增长点,那么索性找点字体文件反爬的网址,猫眼是客户要求的网址,那么便开始搞起来. 目标网址 猫眼经典电影 2020大陆影片_电影_经典片-猫眼电影 很明显和汽车之 ...

  3. python爬虫之字体反爬虫

    原因 今天下午在抓取一个网页时,发现的网页字体反爬,这种情况一句话总结:即网页文本里的数字与网页上显示的字体不一致.为什么会出现这样的情况呢?原因是开发者在网页文本里引入了改变字体的文件. 然后可以看 ...

  4. 爬虫进阶-- 字体反爬终极解析

    爬取一些网站的信息时,偶尔会碰到这样一种情况:网页浏览显示是正常的,用python爬取下来是乱码,F12用开发者模式查看网页源代码也是乱码.这种一般是网站设置了字体反爬 什么是字体反爬? 字体反爬虫: ...

  5. 十三、学习分布式爬虫之字体反爬

    字体反爬 字体反爬原理 网页开发者自己创造一种字体,因为在字体中每个文字都有其代号,那么以后在网页中不会直接显示这个文字的最终的效果,而是显示他的代号,因此即使获取到了网页中的文本内容,也只是获取到文 ...

  6. 爬虫woff字体反爬破解

    好久没写爬虫了,最近发现很多网站都出现了woff字体反爬.百度找了一下,发现都要钱,只好默默说一声fuck 那么,只好自己破解了.好的,那么开始. 如果你在抓去某个网站时候,抓下来的文字读不通,打开n ...

  7. python 爬虫之字体反反爬

    爬虫常用来从某些网站抓取数据, 包括文字,图片等都可能作为爬取目标.通常情况下, 文字数据有更高的价值, 更容易进行后续分析, 所以有些网站就将关键数据以图片, 或者自定义字体形式来展示, 这样一来, ...

  8. Python爬虫六:字体反爬处理(猫眼+汽车之家)-2018.10

    环境:Windows7 +Python3.6+Pycharm2017 目标:猫眼电影票房.汽车之家字体反爬的处理 ---全部文章: 京东爬虫 .链家爬虫.美团爬虫.微信公众号爬虫.字体反爬.Djang ...

  9. python爬虫: 使用knn算法破解猫眼动态字体反爬

    猫眼字体反爬 动态变化的字形使用阈值判断误差率较大,甚至看到有的老哥使用ocr去搞-,大概两个月前,第一次看到有大佬使用knn算法搞字体反爬(源码地址),听说效果不错,一直没有时间去尝试,不仅仅是没有 ...

最新文章

  1. django源码分析 LazySetting对象
  2. Oracle PL/SQL 程序设计读书笔记 - 第14章 DML和事务管理
  3. Visual C#3.0新特性概览
  4. Vue2.0通过二级路由实现页面切换
  5. Java基础教程:面向对象编程[2]
  6. 30年前的中专相当于现在什么学历?比现在一本厉害吗?
  7. pgsql 9.4修改数据库只读
  8. 【SpringBoot】整合jdbc
  9. html倾斜变形,深入理解CSS变形transform(2d)_html/css_WEB-ITnose
  10. 海量数据解决方案,知多少?
  11. OLED 12864屏幕指南
  12. Mac数据库可视化工具,workbench完全替代Navicat和PowerDesigner,Oracle官方免费可视化工具workbench!!
  13. 2022年,消费品牌如何把握新的商业脉络?
  14. Spark大数据开发技术简介
  15. HDU4889 Scary Path Finding Algorithm
  16. Python基本数据类型之数字
  17. hazy的面试小笔记之计网(持续更新)
  18. Python金融分析
  19. python程序编译错误_Python编译错误集锦
  20. Python鼠标连续点击事件

热门文章

  1. 03 PF-Net: Point Fractal Network for 3D Point Cloud Completion
  2. 日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯的一个
  3. 2.4 javascript2
  4. Vue项目中使用百度地图+mapv
  5. 知识付费APP开发基本功能解析
  6. 中软融鑫 java笔试题_中软国际java笔试题
  7. 项目部署到服务器上500报错
  8. 2023年中国ICT企业数字化转型的7大业务场景
  9. 如何在linux系统安装igh,Linux下IGH Ethercat Master安装
  10. Doodle Icons - 一组免费商用的涂鸦风格图标库,可爱轻快又独特