反反爬技术,破解猫眼网加密数字

本文详细介绍了如何破解猫眼电影页面中使用自定义字体加密的数字,通过查找字体源、字体解析及内容替换,实现票房数据的爬取。主要步骤包括下载字体文件、转换字体格式、比对字形数据以获取真实数字,并提供了使用Python进行内容替换的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、背景

 字体反爬应用还是很普遍。这两天有朋友咨询如何实现猫眼票房数据的爬取,这里其实与上面的文章核心思想是一致的,但是操作更复杂一些,本文做一个更详细的破解实践。

有对字体反爬还比较陌生的,请参考前文。

二、查找字体源

 猫眼电影是美团旗下的一家集媒体内容、在线购票、用户互动社交、电影衍生品销售等服务的一站式电影互联网平台。2015年6月,猫眼电影覆盖影院超过4000家,这些影院的票房贡献占比超过90%。目前,猫眼占网络购票70%的市场份额,每三张电影票就有一张出自猫眼电影,是影迷下载量较多、使用率较高的电影应用软件。同时,猫眼电影为合作影院和电影制片发行方提供覆盖海量电影消费者的精准营销方案,助力影片票房。

我们使用Chrome浏览页面,并查看源码,发现售票中涉及数字的,在页面显示正常,在源码中显示一段span包裹的不可见文本。

 

上面其实就是自定义字体搞的鬼。根据网页源码中,

 

<span class="stonefont">.</span>

使用了自定义的stonefont字体,我们在网页中查找stonefont,很快有了发现,这就是标准的@font-face定义方法。且每次访问,字体文件访问地址都会随机变化。

 

 我们访问其中woff文件的地址,可将woff字体文件下载到本地。前文中fonttools并不能直接解析woff字体,我们需要将woff字体转换成otf字体。百度可以直接转换字体 ,地址:http://fontstore.baidu.com/static/editor/index.html

 

三、字体解析

 otf就是我们常用的字体文件,可以使用系统自带的字体查看器查看,但是难以看到更多有效的信息,我们使用一个专用工具Font Creator查看。

 

可以看到,这个字体里有12个字(含一个空白字),每个字显示其字形和其字形编码。这里比之前字体解析更复杂的是,这里不仅字体编码每次都会变,字体顺序每次也会变,很难直接通过编码和顺序获取实际的数字。

 

因此,我们需要预先下载一个字体文件,人工识别其对应数值和字体,然后针对每次获取的新的字体文件,通过比对字体字形数据,得到其真实的数字值。

下面是使用fontTools.ttLib获取的单个字符的字形数据。

    <TTGlyph name="uniE183" xMin="0" yMin="-12" xMax="516" yMax="706">
      <contour>
        <pt x="134" y="195" on="1"/>
        <pt x="144" y="126" on="0"/>
        <pt x="217" y="60" on="0"/>
        <pt x="271" y="60" on="1"/>
        
### 使用Python编写爬虫抓取猫眼电影数据 #### 准备工作 为了成功抓取猫眼电影站的数据,需先安装必要的库。主要依赖于`requests`用于发起HTTP请求以及`BeautifulSoup`来进行HTML解析。这两个工具能帮助高效地定位并抽取所需的信息[^2]。 ```bash pip install requests beautifulsoup4 ``` #### 发送请求与获取页面源码 利用`requests.get()`函数向目标URL发出GET请求,并设置合适的User-Agent模拟浏览器行为以绕过简单的反爬机制。接着将返回的结果赋给变量response以便后续处理。 ```python import requests url = 'https://maoyan.com/board/4' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)' } response = requests.get(url, headers=headers) html_content = response.text print(html_content[:500]) # 打印前500字符查看是否正常获取到页内容 ``` #### 解析HTML文档结构 采用`BeautifulSoup`对象加载上述获得的HTML字符串,指定lxml作为解析器提高效率。之后依据观察到的目标元素特征构建CSS选择器表达式,从而精准锁定待提取项的位置。 ```python from bs4 import BeautifulSoup soup = BeautifulSoup(html_content, 'lxml') movie_items = soup.select('.board-wrapper dd') # 获取所有dd标签下的电影条目 for item in movie_items: title = item.find('a').get_text(strip=True) # 提取电影名字 actors = item.select_one('.star').get_text(strip=True).replace('主演:', '') # 清洗演员名单中的固定文字 release_time = item.select_one('.releasetime').get_text().split(':')[1] # 取得上映日期部分 print(f'电影名:{title}, 主演:{actors}, 上映时间:{release_time}') ``` #### 处理动态加载的内容和字体加密问题 对于某些由JavaScript异步渲染出来的信息或是经过特殊编码的文字(如数字),可能无法直接从静态HTML中读取出来。这时就需要额外考虑Selenium自动化测试框架配合WebDriver驱动浏览器执行脚本,或者是研究具体的加解密算法逻辑来破解自定义字体文件等问题[^5]。 #### 数据持久化存储 最后一步就是把收集好的资料按照一定格式保存下来供以后分析使用。可以选择CSV、JSON等形式之一,这里给出一个简单例子: ```python import json data_list = [] for index, item in enumerate(movie_items): data_dict = {} data_dict['rank'] = str(index + 1) data_dict['name'] = item.find('a').get_text(strip=True) data_dict['actor'] = item.select_one('.star').get_text(strip=True).replace('主演:', '') data_dict['time'] = item.select_one('.releasetime').get_text().split(':')[1] data_list.append(data_dict) with open('./movies.json', mode='w+', encoding='utf8') as f: json.dump(data_list, fp=f, ensure_ascii=False, indent=4) ```
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值