【Python3爬虫】猫眼电影爬虫(破解字符集反爬)
一、页面分析
首先打开猫眼电影,然后点击一个正在热播的电影(比如:毒液)。打开开发者工具,点击左上角的箭头,然后用鼠标点击网页上的票价,可以看到源码中显示的不是数字,而是某些根本看不懂的字符,这是因为使用了font-face定义字符集,并通过unicode去映射展示,所以我们在网页上看到的是数字,但是在源码中看到的却是别的字符。


碰到这些根本看不懂的字符怎么办呢?不慌,右键选择查看网页源代码,然后找到相应的位置(如下图)。那么是不是“”映射出来就是28呢?

通过查看源码,可以找到如下内容, 而当我们访问这里面的链接的时候,就可以下载相应的字体文件,关于font-face可以点击这里查看了解:

当我下载好字体文件后,满心欢喜的双击想要点开的时候,却发现无法打开(T_T)。查阅资料之后知道了一个叫做FontCreator的软件,用这个软件可以打开我们下载的字体文件,没有安装这个软件的可以进入官网https://www.high-logic.com/下载安装,如果下载得很慢的可以用百度云下载(链接:https://pan.baidu.com/s/1ImxwPhKdzZo2g4bIjiGCZw ,提取码:m0yf )。下载好之后打开软件,看到如下界面,选择Use Evaluation Version,这个软件我们可以免费使用三十天。

打开软件后,再打开我们下载的字体文件,可以看到数字2和8分别对应的是uniE83B和uniE375,和前面看到的编码是一致的。

那么我们下载好字符集之后,只要将其中的字符编码和数字对应的信息提取出来,再把网页源码中的字符编码替换掉,就能得到我们想要的数据了。这里要用到一个三方库fontTools,利用fontTools可以获取每一个字符对象,这个对象你可以简单的理解为保存着这个字符的形状信息,而且编码可以作为这个对象的id,具有一一对应的关系。不过这里还有一个问题,就是网页每次使用的字符集是随机变化的,我们也就无法使用一个固定的字符集去做到反爬。
解决思路如下:先保存一个字体文件(比如base.woff),然后解析其数字和编码的对应关系,然后爬取的时候把新的字体文件下载下来(比如online.woff),网页中的一个数字的编码(比如ABCD),我们先通过编码ABCD找到这个字符在online.woff中的对象,并且把它和base.woff中的对象逐个对比,直到找到相同的对象,然后获取这个对象在base.woff中的编码,再通过编码确认是哪个数字。
二、主要代码
解析下载的字体文件,由于字体文件中有多余的字符,需要舍弃掉。
# 解析字体库
def parse_ttf(font_name):
"""
:param font_name: 字体文件名
:return: 字符-数字字典
"""
base_nums = ['', '', '', '', '', '', '', '', '', '']
base_fonts = ['uniEB84', 'uniF8CA', 'uniEB66', 'uniE9DB', 'uniE03C',
'uniF778', 'uniE590', 'uniED12', 'uniEA5E', 'uniE172']
font1 = TTFont('base.woff') # 本地保存的字体文件
font2 = TTFont(font_name) # 网上下载的字体文件 uni_list = font2.getGlyphNames()[1:-1] # 去掉头尾的多余字符
temp = {}
# 解析字体库
for i in range(10):
uni2 = font2['glyf'][uni_list[i]]
for j in range(10):
uni1 = font1['glyf'][base_fonts[j]]
if uni2 == uni1:
temp["&#x" + uni_list[i][3:].lower() + ";"] = base_nums[j]
return temp
解析网页源码,把其中的编码替换成数字,这里选择把网页源码保存下来,这样的话编码就不会改变,也就能正确的解析。
# 解析网页得到数字信息
def get_nums(font_dict):
"""
:param font_dict: 字符-数字字典
:return: 由评分、评分人数、票房和票价组成的列表
"""
num_list = []
with open('html', 'r', encoding='utf-8') as f:
for line in f.readlines():
lst = re.findall('(&#x.*?)<', line)
if lst:
num = lst[0]
for i in font_dict.keys():
if i in num:
num = num.replace(i, font_dict[i])
num_list.append(num)
return num_list
三、运行结果

完整代码已上传到GitHub!
【Python3爬虫】猫眼电影爬虫(破解字符集反爬)的更多相关文章
- Python爬虫实例:爬取猫眼电影——破解字体反爬
字体反爬 字体反爬也就是自定义字体反爬,通过调用自定义的字体文件来渲染网页中的文字,而网页中的文字不再是文字,而是相应的字体编码,通过复制或者简单的采集是无法采集到编码后的文字内容的. 现在貌似不少网 ...
- Python之爬虫-猫眼电影
Python之爬虫-猫眼电影 #!/usr/bin/env python # coding: utf-8 import json import requests import re import ti ...
- Python爬虫入门教程 63-100 Python字体反爬之一,没办法,这个必须写,反爬第3篇
背景交代 在反爬圈子的一个大类,涉及的网站其实蛮多的,目前比较常被爬虫coder欺负的网站,猫眼影视,汽车之家,大众点评,58同城,天眼查......还是蛮多的,技术高手千千万,总有五花八门的反爬技术 ...
- python爬虫的一个常见简单js反爬
python爬虫的一个常见简单js反爬 我们在写爬虫是遇到最多的应该就是js反爬了,今天分享一个比较常见的js反爬,这个我已经在多个网站上见到过了. 我把js反爬分为参数由js加密生成和js生成coo ...
- 【Python3爬虫】大众点评爬虫(破解CSS反爬)
本次爬虫的爬取目标是大众点评上的一些店铺的店铺名称.推荐菜和评分信息. 一.页面分析 进入大众点评,然后选择美食(http://www.dianping.com/wuhan/ch10),可以看到一页有 ...
- 《C# 爬虫 破境之道》:第二境 爬虫应用 — 第六节:反爬策略研究
之前的章节也略有提及反爬策略,本节,我们就来系统的对反爬.反反爬的种种,做一个了结. 从防盗链说起: 自从论坛兴起的时候,网上就有很多人会在论坛里发布一些很棒的文章,与当下流行的“点赞”“分享”一样, ...
- python 爬虫 汽车之家车辆参数反爬
水平有限,仅供参考. 如图所示,汽车之家的车辆详情里的数据做了反爬对策,数据被CSS伪类替换. 观察 Sources 发现数据就在当前页面. 发现若干条进行CSS替换的js 继续深入此JS 知道了数据 ...
- 我去!爬虫遇到JS逆向AES加密反爬,哭了
今天准备爬取网页时,遇到『JS逆向AES加密』反爬.比如这样的: 在发送请求获取数据时,需要用到参数params和encSecKey,但是这两个参数经过JS逆向AES加密而来. 既然遇到了这个情况,那 ...
- python3爬虫爬取猫眼电影TOP100(含详细爬取思路)
待爬取的网页地址为https://maoyan.com/board/4,本次以requests.BeautifulSoup css selector为路线进行爬取,最终目的是把影片排名.图片.名称.演 ...
随机推荐
- git 的常用命令(未完待补充)
一.初始化 git git init 这样会默认创建 master 分支 二.查看当前状态 git status 查看 git 的默认状态 三.创建一个文件,并把它添加到 git 仓库,使用 git ...
- Unity 图形处理(切分与拉伸)
素材的导入设置 1.导入的图片要设置为 Sprite 才能作为UI使用 2.如果需要进行切分,Sprite Mode 选择 Multiple 进行切分和拉伸设置 1.点击进入精灵编辑视图 2.点击按钮 ...
- 谈谈代码中的this
js中我们常常会遇到this,this的具体指向问题对于很多同学来说是很懵懂的:就想lz刚开始接触时候就是一脸的懵逼,经常被一些题目转的眼花缭乱.那么今天lz就跟大家一起交流一下这个this的指向问题 ...
- slitaz的root密码
可以先试试root(我这个版本就是),如果不行passwd改密码吧...
- RSP小组——团队冲刺博客五
RSP小组--团队冲刺博客五 冲刺日期:2018年12月17日 前言 周末的结束,我们并没有完全的休息,对于这个项目,以我们的实力还是需要花费更多的时间. 各成员今日(12.17)完成的任务 马瑞蕃由 ...
- linq给list集合数据分页
var lastlist= newlist.Skip(pageindex * pagesize).Take(pagesize);
- JS中[object object]怎么取值
错误信息:本来是要显示JSON对象的 结果控制台打印了[object object] 需要做一个简单的转换,如下: var jsonData = JSON.stringify(data);// 转成 ...
- 纯javascript实现可拖住/大小的div
好久没写了,不得不说人懒了好多.. 也不打算实现什么太厉害的功能,因为不喜欢网上那些一大堆代码的,看的头晕,于是自己写了一个 旨在越简单越好(当然也走点形式- -其实是自己菜),所以一些宽度和高度都写 ...
- IIS7配置伪静态把后缀名映射为html
1.在IIS新建站点.[ 创建的时候不用去选择版本和模式,默认即可 ] 2.选中站点,切换到功能试图,找到“处理程序映射",双击之后,在打开窗口右侧的操作栏目下做如下设置: 1) 右边&qu ...
- Mac自动化环境
1. JDK安装 下载JDK for Mac 我这里使用的是 jdk-7u79-macosx-x64.dmg 验证安装open Terminal java -version java versio ...