Python—猫眼电影票房爬虫实战 轻松弄懂字体反爬!

article/2025/11/10 21:12:19

 

目标

1.爬取猫眼票房信息

2.将信息保存起来(MySQL、Redis、MongoDB或者Excel等等),我们保存的是Excel

爬取网址

https://piaofang.maoyan.com/?ver=normal&isid_key=2d9aacd2f26d4d0dba63

分析

1.打开chrome,输入网址我们看到的效果如下

2.我们要获取的信息如下图

3.右击检查打开开发者工具,选择左下角鼠标按钮,然后点击一个电影的标题

可以看到这个标签里面就是我们想要获取的电影标题信息,别急,我们在接着往下看,再次点击标题下面的7.86亿和实时票房,可以发现开发者工具里面显示的并不是我们看见的数字,这就是我们本次爬虫的重点字体反爬

字体反爬顾名思义,就是通过css加载本地的字体文件,在网页上展示特定的字体,我们想要获取信息,就必须要弄到这个字体文件,然后解析得到我们想要的数据

4.开发者工具上无法显示这个特殊的字体,这时候我们右击点查看源代码,就可以看见一串编码,这每个编码就表示一个对应的数字

5.想要破解字体,我们要先得到他的字体文件,在源代码页面Ctrl+F搜索font,可以看到这个就是加密的字体

通过分析这段代码可以看出这个是这个是通过base64进行加密的,文件后缀为woff

通过上面的分析可以得出结论:我们想要得到数据,打开开发者工具发现我们想要的数据进行了字体反爬,查看网页原代码分析找到了字体文件是通过base64加密的,即我们只要吧字体文件下载下来,然后进行base64解密,保存到本地,在通过字体文件解析我们爬下来的网页数据就能得到我们想要的数据了

看到这里,肯定很多小伙伴就会想,这字体反爬好简单啊,就分析出他的字体文件,然后下载下来进行解析就能得到我们的数据了,确实,简单的字体反爬分析到这里就已经结束了,但我只能说,你还是太年轻了,下面我们在接着往下分析

6.点击左上角重新请求这个网站,数据还是这些数据,这时候我们在右击查看源代码,找到一个有反爬字体的地方和font,和前一个网页源代码进行比较,可以发现同样的数据,但编码号变了,base64加密后的font也变了,这就是本次猫眼爬虫的另外一个难点,即每次重新请求都会有一套新的编码和字体文件

结论

  • 我们想要得到数据,就需要解决以下这些问题
    1.先解码数据
    2.需要字体文件
    3.每次请求字体文件会产生变化

前期准备

为了完成下面的代码,我们需要先做一些准备

  • 首先我们先将源代码页面的加密字体复制下来,放到py中生成基础的字体文件
# 使用bs64进行解码
import base64# 保存加密字体
font_s = "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"# base64解密
b = base64.b64decode(font_s)# 打开文件保存字体文件
with open('maoyan_pf.woff', 'wb') as f:f.write(b)
  • 使用TTFont模块读取字体文件,并转换成pycharm可以打开的xml格式
from fontTools.ttLib import TTFont# 建立字体文件对象
base_font = TTFont("maoyan_pf.woff")
# 转换成xml格式
base_font.saveXML("maoyan_pf.xml")
  • 打开字体xml文件就可以看见解密后保存的字体文件了,code对应的是每个字体的形状名,即name,而name对应的就是每个字体的形状,即坐标,对的,这个字体文件里的每个字都是通过坐标画出来的
  • 下面是一个字体对应的一部分坐标
  • 是不是根本看不明白?别急,下面我们可以借助一个软件High-Logic FontCreator来打开字体文件打开软件后,将刚刚保存的woff字体文件拖到软件中
  • 通过软件我们一眼就能看出每个编码对应的数字了,有了这个我们就能建立一个基础的字体映射字典,通过刚刚的字体对象里面的glyf可以取出所有name对应的字体形状,在参照软件上打开的字体文件信息,用数字当做基础映射字典的key,用取出来的形状当基础映射字典的value,这个基础映射字典只能看着软件手动组成
from fontTools.ttLib import TTFont# 建立字体文件对象
base_font = TTFont("maoyan_pf.woff")
# 转换成xml格式
base_font.saveXML("maoyan_pf.xml")
# 获取name和形状之间的关系
base_glyph = base_font["glyf"]# 组装出基础映射字典
base_num_glyph_map = {0: base_glyph["uniF1DD"],1: base_glyph["uniE09F"],2: base_glyph["uniEF13"],3: base_glyph["uniED29"],4: base_glyph["uniEE6F"],5: base_glyph["uniE853"],6: base_glyph["uniF44B"],7: base_glyph["uniEF72"],8: base_glyph["uniF814"],9: base_glyph["uniF466"],
}

代码

  • 准备完成之后,下面我们开始创建项目,开始编写爬虫,这次我们使用requests模块来进行数据爬取
    1.导入requests模块,创建类,将前面准备的基础映射字典、请求url和请求体放到__init__初始化函数,定义run方法作为开启爬虫的函数,在run方法中请求url,打印获取到的HTML
import requestsclass MYSpider(object):"""爬取猫眼即将上映页面"""def __init__(self):# 请求urlself.url = "https://piaofang.maoyan.com/?ver=normal&isid_key=2d9aacd2f26d4d0dba63"# 请求头self.headers = {"User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1",}# 建立字体文件对象base_font = TTFont("maoyan_pf.woff")# 获取name和形状之间的关系base_glyph = base_font["glyf"]# 组装出基础映射字典self.base_num_glyph_map = {0: base_glyph["uniF1DD"],1: base_glyph["uniE09F"],2: base_glyph["uniEF13"],3: base_glyph["uniED29"],4: base_glyph["uniEE6F"],5: base_glyph["uniE853"],6: base_glyph["uniF44B"],7: base_glyph["uniEF72"],8: base_glyph["uniF814"],9: base_glyph["uniF466"],}def run(self):"""开始爬取"""# 发送请求response = requests.get(url=self.url, headers=self.headers)# 打印获取的HTMLprint(response.text)if __name__ == '__main__':my = MYSpider()  # 创建爬虫对象my.run()  # 运行爬虫

运行之后可以发现确实是我们想要的数据

2.下面开始提取加密字体文件,进行base64解密

  • 观察源代码里面的加密字体是从base64, 开始到  结束的这一段就是加密字体
  • 将获取到的HTML转换成lxml对象进行xpath提取这段加密字体,并调用方法进行解密
def run(self):"""开始爬取"""# 发送请求response = requests.get(url=self.url, headers=self.headers)# print(response.text)# 转换成lxml对象进行xpath提取html = etree.HTML(response.text)# 获取字体加密# 提取style标签里面的内容encryption_font = html.xpath("//style[@id='js-nuwa']/text()")[0].split()[0]# 使用正则提取想要的加密字体encryption_font = re.search(r";base64,(.+)\)$", encryption_font).group(1)# 调用方法对字体进行解密self.decryption_font(encryption_font)
  • 定义新方法decryption_font将获取到的新加密字体进行base64解密,并保存到新字体文件中
def decryption_font(self, encryption_font):"""字体解密保存"""# 使用bs64进行解码b = base64.b64decode(encryption_font)# 打开文件保存字体文件with open('maoyan_pf_new.woff', 'wb') as f:f.write(b)
  • 定义新方法font_map对新字体进行映射,这里用到了一个 knn 算法(K近邻)的思想,因为每次请求得到的都是新的字体,所以本次请求的字体与上次请求的字体坐标会有微差,但不管怎么变,这个字肯定不可能变成别的字,所以我们只有得到本次请求的字体坐标与基础的映射字典里的字体坐标进行对比就能,然后取出最接近的值,那么肯定就是我们想要的值了
def font_map(self):"""对字体生成新的映射"""# 生成当前字体文件的对象font = TTFont('maoyan_pf_new.woff')font.saveXML('maoyan_pf_new.xml')  # 将ttf文件生成xml文件并保存到本地# 获取当前字体的code和name映射code_name_cmap2 = font.getBestCmap()# 获取当前字体的字形name_glyph_map = font['glyf']# 遍历当前字体的code和namefor code, name in code_name_cmap2.items():# 判断是否是无用的数据if name == "x":continue# 通过name取出当前字体的所有字形坐标current_glyph = name_glyph_map[name]num_diff = dict()# 遍历基础字形字典,取出对应的映射数字和坐标for num, glyph in self.base_num_glyph_map.items():# 定义一个变量用来记录当前所有坐标的最小差值diff = 0# 遍历当前字形字典,取出所有坐标for coor1 in current_glyph.coordinates:# 定义一个列表用来保存当前最小差值的所有差值coor_diff_list = list()for coor2 in glyph.coordinates:coor_diff_list.append(abs(coor1[0] - coor2[0]) + abs(coor1[1] - coor2[1]))diff += min(coor_diff_list)# 组成当前字体的映射字典num_diff[num] = diff# 取出对应的映射num = min(num_diff, key=num_diff.get)# code = str(hex(code)).replace("0", "&#", 1) + ";"# 将默认映射替换成想要的样式code = str(hex(code)).replace("0x", r"\u", 1)# print(code, num)# 将新字体的映射组成字典保存self.new_num_glyph_map[code] = num
  • 获取详情信息,定义新方法get_info获取想要的信息,组成字典,保存到列表中
 def run(self):"""开始爬取"""# 发送请求response = requests.get(url=self.url, headers=self.headers)# print(response.text)# 转换成lxml对象进行xpath提取html = etree.HTML(response.text)# 获取字体加密# 提取style标签里面的内容encryption_font = html.xpath("//style[@id='js-nuwa']/text()")[0].split()[0]# 使用正则提取想要的加密字体encryption_font = re.search(r";base64,(.+)\)$", encryption_font).group(1)# 调用方法对字体进行解密self.decryption_font(encryption_font)# 对新字体进行映射self.font_map()# 获取详情ul_list = html.xpath("*//div[@class='content strip']/ul")# print(ul_list)# 调用方法self.get_info(ul_list)def get_info(self, ul_list):"""获取详情信息"""for ul in ul_list:# print(ul)# 定义字典保存当前信息info_dict = dict()temp = ul.xpath(".//li[@class='c1']//text()")# print(temp)info_dict["片名"] = temp[1]info_dict["上映首日"] = temp[4]info_dict["实时票房(万元)"] = ul.xpath(".//li[@class='c2 ']/b/i/text()")[0]info_dict["票房占比"] = ul.xpath(".//li[@class='c3 ']/i/text()")[0]info_dict["排片占比"] = ul.xpath(".//li[@class='c4 ']/i/text()")[0]info_dict["上座率"] = ul.xpath(".//li[@class='c5 ']//i/text()")[0]# print(info_dict)# 调用方法进行解密info_dict = self.decryption_info(info_dict)# 保存进列表self.info_list.append(info_dict)# print(self.info_list)
  • 定义新方法save_excel将数据保存到Execl,就大功告成了
    def save_excel(self):"""将数据保存到Excel"""# 创建一个workbook 设置编码workbook = xlwt.Workbook(encoding='utf-8')# 创建一个worksheetworksheet = workbook.add_sheet("Arknights")# 写入excel# 参数对应 行, 列, 值for i, content in enumerate(self.info_list):for x, info in enumerate(content.values()):worksheet.write(i, x, label=info)  # 将数据存入excel# 保存workbook.save('猫眼票房.xls')
  • 爬取到的Excel

到这里我们本次的猫眼爬虫就结束了,如果对你有帮助,不妨点个赞~

完整项目代码获取加群哦:1136192749

此文转载网络  如有侵权,联系删除


http://chatgpt.dhexx.cn/article/9WyvC7bY.shtml

相关文章

基于Python猫眼票房TOP100电影数据抓取

基于Python猫眼票房TOP100电影数据抓取 使用requests库抓取数据BeatifulSoup解析URL,将数据存入csv文件处理数据,生成图表 本次爬取数据使用Python语言在jupyter notebook上爬取的,并使用数据生成了一些图表。 使用requests库抓取数据 本段…

基于猫眼票房数据的可视化分析

案例背景:由于最近《哪吒之魔童降世》的火爆,最新票房已经超过49亿,使我对国内票房的整体走势有了很大兴趣,究竟49亿的票房数据,在国内是处于一个什么水平?除了票房数据,又有哪些特征因素可以用…

ardruino控制继电器_Arduino 各种模块篇-继电器

现在按照既定想法,把所有的arduino模块依次尝试一边。 链接到我的arduino Uno 与arduino mega 2560 上 mega 2560有更多的io口,而且cache也很大。所以应该更有效果。幸好可以有arduino IDE 现在比较稳定的版本官方提供的是1.0.3的。 而我用的是ubuntu库里…

【继电器模块教程基于Arduino】

继电器模块教程基于Arduino 前言介绍继电器模块继电器引出线示例:使用继电器模块和 PIR 运动传感器控制灯![在这里插入图片描述](https://img-blog.csdnimg.cn/760e865a1e6b49d4a8f3e9fe1a0a6f74.png)前言 本文介绍如何使用继电器模块通过 Arduino 控制电源电压。我们对继电器…

8路USB继电器模块 windows Linux使用

模块采用USB及串口与外界通信,方便模块与PC机、单片机连接。模块正常的工作电压为5V,并为ICSE014A(8路继电器)模块配置5V电源接口。具体参数见下表: ICSE012A ICSE013A ICSE014A 单位 备注 CC 4 2 8 模块路数 I 400 250 700 …

ardruino控制继电器_arduino控制继电器

一、arduino控制继电器 典型的继电器结构原理图如下: 继电器有一个输入回路,一般接低压电源,有一个输出回路,一般接高压电源。 输入回路中有一个电磁铁线圈,当输入回路有电流通过,电磁铁产生磁力,吸力使输出回路的触点接通,则输出回路导电(通)。 当输入回路无电流通过,…

Arduino笔记实验(初级阶段)—继电器模块

Arduino笔记实验(初级阶段)—继电器模块 文章目录 Arduino笔记实验(初级阶段)—继电器模块前言一、电路图二、继电器模块实验代码实验效果展示 三、继电器模块实验总结 前言 自学笔记,没有历史知识铺垫(省略百度部分),博主基于C代码编程,函数…

继电器模块典型电路图

当控制端电压为0时,Q1基极电压为(12-0.711.3V),改变R1的大小便可改 变基极电流,当基极电流足够大时,三极管饱合。 为了验证以上的分析,我们搭了一个电路,R1取4.7K,此时基极电流为2.4…

固态继电器和电磁继电器模块

固态继电器和电磁继电器模块 固态继电器的特点直流固态继电器和交流固态继电器电磁继电器的特点直流固态继电器模块、交流固态继电器模块和电磁继电器模块测试比较固态继电器与电磁继电器的比较 原文链接:https://www.yourcee.com/newsinfo/2924340.html 交流固态继…

【继电器模块的电路设计和分析】

一.电路图 二.电路原理分析 1.功能 此继电器电路模块可以通过把左下角LED1的阴级与控制器引脚相连(如图中与单片机P0.8引脚相连),从而可以通过控制引脚的高低电平来驱动继电器的开合。 2.驱动逻辑 当P0.8脚为低电平时,光耦PC817输…

常用继电器模块的PCB设计与实物分享

今天分享一下自己做的一块继电器模块,因为之前有用到继电器模块的原理图,索性自己画了一下,原理图如图所示: 一、原理图: 继电器模块还是比较简单的,就是通过三极管的开关作用来使电路导通,从而…

4入4出Modbus RTU继电器模块说明书

产品特点 DC7-30V; 继电器输出触点隔离; 通信波特率:2400,4800,9600,19200,38400(可以通过软件修改,默认9600); 通信协议:支持标准modbus RTU协议; 可以设置0-255个…

51单片机驱动继电器模块点灯

51单片机驱动继电器模块点灯 继电器的简介继电器模块引脚定义继电器模块的工作原理继电器模块使用接线图51单片机控制继电器模块点灯总结 原文链接:https://www.yourcee.com/newsinfo/2925664.html 继电器的简介 继电器(英文名称:relay&…

STM32f1之简单控制继电器模块(附源码)

目录 前言 一、继电器的使用(重要!!!) 二、写个代码检验 三、源码--百度云 前言 第一个粉丝会是谁呢?期待ing 相信很多志同道合的小伙伴们已经找到了学习STM32的好途经(灵光一闪刷到我的博客…

【树莓派C语言开发】实验04:继电器模块

文章目录 前言1.实验器材2.实验原理2.1继电器模块2.2继电器工作 3.电路图和接线图3.1电路图3.2接线图 4.代码示例4.1部分函数解释4.1.1pinMode4.1.2digitalWrite 4.2Geany编译器运行代码4.3Linux-gcc编译器 结语 前言 学习树莓派的时候经常要查找前辈们留下的资料 但我发现&am…

Ardunio开发实例-使用继电器模块控制家用灯泡

使用继电器模块控制家用灯泡 继电器(英文名称:relay)是一种电控制器件,是当输入量(激励量)的变化达到规定要求时,在电气输出电路中使被控量发生预定的阶跃变化的一种电器。它具有控制系统(又称输入回路)和被控制系统(又称输出回路)之间的互动关系。通常应用于自动化…

Arduino开发之如何连接继电器模块?

文章目录 0.引言1.继电器模块和交流同步电机说明2.编写代码 0.引言 继电器的作用是扩大控制范围:例如,多触点继电器控制信号达到某一定值时,可以按触点组的不同形式,同时换接、开断、接通多路电路。可以放大控制效果,例…

【STM32-扩展模块】继电器模块Relay

前言: 继电器模块工作电压5V,吸合电流约70mA每路,带继电器状态指示灯;I/O信号输入直接与单片机IO口或数字电路连接,输入高电平继电器吸合,输入低电平继电器释放; 全贴片元件,最合理驱…

Arduino笔记-继电器模块的使用

这里以一个小实验为例,当串口输入a时亮灯: 当输入b的时候,灭灯,这里主要是使用了继电器 后台打印如下: 这里说下继电器的理论: ab之间是线圈,只要在ab两端上加上一定的电压,线圈中就…

21、ZigBee 开发教程之基础篇—继电器模块

文章目录 1、实验目的2、实验设备3、实验相关电路图4、实验相关寄存器5、源码分析6、实验现象1、实验目的 1)通过实验掌握 CC2530 芯片 GPIO 的配置方法 2)掌握 HC-SR501 人体红外传感器的使用 2、实验设备 硬件:1、PC机一台;2、ZigBee(CC2530)(底板、核心板、仿真器、…