一、所需工具

FontCreator

二、问题引入

我们用Chrome登录电影《死侍2》的主页,查看页面信息,会发现用户评分出现乱码两个方框:
再查看这个地方的html源代码:
是类似一个引用。这明显使用了某种反爬技术。
另外大家可以自行验证,这里的引用的16进制的编号,每次访问都是不一样的(或者是过几分钟再访问),同一个数每次访问可能对应不同的编号。

三、解决问题

这其实是使用的css3的新特性,继续查看源代码可以发现html中有这一段:
简单点理解就是,它这里的评分数字是用的图标的形式(iconfont),即在请求页面信息的同时,请求了一个字体文件(就是上图的那个请求woff的url),然后根据源码中的16进制编号,找到这个文件中对应的字体对象,再显示给用户。同时,每次请求的这个woff和评分位置的16进制编号并不唯一,意思就是说,它这个woff是动态的(即数字对象的编号是动态的),只要每次16进制的编号和woff文件中的对应就可以,这样实现了反爬的效果。

通过验证,会发现woff中数字对应的字体对象是不变的,只是每次访问的数字的编号在变化。(验证过程无非就是用fontTools.ttLib库中的TTFont.(“×××.woff”).saveXML(“×××.xml”),将woff保存为xml,打开亲自比对一下每个数的配置)

(至于iconfont的使用也非常简单,可以在https://www.iconfont.cn/下载几个矢量图标试一下。这里和爬虫没什么关系,就不再介绍。)

对此我们可以想到下面的策略:

  • 下载一个基准的woff文件a.woff(可以理解为woff文件中保存了编号与数字字体对象的对应),通过FontCreator工具打开,手动记录其中的编号与数字的对应关系,这时,就捆绑了 基准的 “编码—数字的字体对象—数字”。
  • 下载第二个woff文件b.woff和对应页面的编号,在代码中通过编号拿到了b.woff中对于的数字的字体对象,用这个对象依次与基准的十个字体对象比较,找到相同的一个,对应的基准数字及正确的数字。

四、代码实现

1、首先我先下载了一个woff文件,用FontCreator打开
这就作为基准的对应

2、为了方便演示,我打开另一部电影的主页,同时下载这个主页捆绑的woff文件,并记录它的评分及编号
它的编号为&#xe8da、&#xf587,分别是9、4
注意:这里的编号在各个地方的前缀不一致,代码中需要处理一下
在这里看到的是&#x
爬下来的html为\u
在woff中为uni
3、代码

from fontTools.ttLib import TTFont
base_num = dict()  # 编号—数字
base_obj = dict()  # 编号—对象
def init():# 注意,这里的编号与上面说的是一致的,只是前缀不一样,网页上看的是 &#x,爬下来的是\u,需要处理一下base_num["uniF290"] = "0"base_num["uniEA12"] = "1"base_num["uniED86"] = "2"base_num["uniED0D"] = "3"base_num["uniE60A"] = "4"base_num["uniEF1F"] = "5"base_num["uniEEBA"] = "6"base_num["uniEC5B"] = "7"base_num["uniF01B"] = "8"base_num["uniF6B0"] = "9"# 打开基准的woff文件BaseFontfile = TTFont('d2f5f7d50623609613eb8c0cddf472ac2080.woff')for key in base_num:base_obj[key] = BaseFontfile['glyf'][key]  # 获得woff内编号对应的字体对象def getRealNum(HexNum,woffFileName):fontFile = TTFont(woffFileName)obj = fontFile['glyf'][HexNum]for key in base_obj:  # 遍历找到相同的字体对象if obj == base_obj[key]:return base_num[key]if __name__ == '__main__':init()print(getRealNum("uniE8DA","9f14db7a2613e566981242118676d9d72080.woff"))print(getRealNum("uniF587", "9f14db7a2613e566981242118676d9d72080.woff"))

python爬取猫眼电影评分反反爬方式相关推荐

  1. 使用Requests库+re库爬取猫眼电影评分

    使用Requests库+re库爬取猫眼电影评分 作者:小胖 0x1: 分析 在简单的翻页中,我们可以知道.网页涵盖了以下几个规律 1.offset参数的值是除以30就是当前的页面 2.每个页面只有30 ...

  2. 爬取猫眼电影评分TOP100

    操作系统:macos python版本:3.6 现在查看猫眼电影的页面真实页面源码会自动跳转, 可以在火狐浏览器中查看开发者模式的Network监听组件中查看源码 根据源码来编写的正则表达式('< ...

  3. python爬取b站搜索结果_Python爬虫实例:爬取猫眼电影——破解字体反爬,Python爬虫实例:爬取B站《工作细胞》短评——异步加载信息的爬取,Python爬虫实例:爬取豆瓣Top250...

    字体反爬 字体反爬也就是自定义字体反爬,通过调用自定义的字体文件来渲染网页中的文字,而网页中的文字不再是文字,而是相应的字体编码,通过复制或者简单的采集是无法采集到编码后的文字内容的. 现在貌似不少网 ...

  4. Python爬虫实例:爬取猫眼电影——破解字体反爬

    字体反爬 字体反爬也就是自定义字体反爬,通过调用自定义的字体文件来渲染网页中的文字,而网页中的文字不再是文字,而是相应的字体编码,通过复制或者简单的采集是无法采集到编码后的文字内容的. 现在貌似不少网 ...

  5. python爬取猫眼电影评分

    直接上代码 import datetime import json from multiprocessing.dummy import Pool from time import localtime, ...

  6. python 抓取猫眼电影评分

    目标网页 完整代码: from selenium import webdriver from PIL import Image from io import BytesIO import time i ...

  7. 爬虫基本库request使用—爬取猫眼电影信息

    使用request库和正则表达式爬取猫眼电影信息. 1.爬取目标 猫眼电影TOP100的电影名称,时间,评分,等信息,将结果以文件存储. 2.准备工作 安装request库. 3.代码实现 1 imp ...

  8. 运用正则爬取猫眼电影流程

    一.爬虫爬取网站流程 1.分析网站的数据来源 ​ 分析网站结构,待爬取数据在哪. 2.查看页面数据能否通过requests模块获取到 ​ (1)在开发者工具中,找到页面的url对应的请求.通过这条请求 ...

  9. python战反爬虫:爬取猫眼电影数据 (一)(Requests, BeautifulSoup, MySQLdb,re等库)

    姓名:隋顺意 博客:Sui_da_xia 微信名:世界上的霸主 本篇文章未涉及猫眼反爬,主要介绍爬取无反爬内容,战反爬内容请去 python战反爬虫:爬取猫眼电影数据 (二)(Requests, Be ...

最新文章

  1. 异常“本机框架位于调用堆栈顶部,因此无法计算表达式的值”的解决办法
  2. python自动测试p-python自动化测试_8
  3. review what i studied `date` - 2017-4-24
  4. PHP用CURL伪造IP和来源
  5. vsc中HTML配置,vscode怎么配置node?
  6. C#实现二维码功能,winform 以及 asp.net均可以用
  7. 谢谢你,阅读了这篇文章
  8. m_pRecordset遍历记录集之后,m_pRecordset-MoveFirst()为什么会出错
  9. 面试必考之Java三大特性
  10. 使用jsp实现成语接龙
  11. python 高德/百度/腾讯/谷歌API 与WGS84坐标互转(BD09/GCJ02/WGS84)
  12. 133.Python修炼之路【138-前端-JQuery-Json】2018.08.02
  13. 【3D建模工具】上海道宁与McNeel为您提供强大的专业3D造型软件
  14. 统计学中基础概念说明
  15. Java 编程语言的特点、优点和架构
  16. 查看设备串口列表和串口上电使能
  17. 2006-07-16蜡肉的吃法(不完全)
  18. 高通Q+A Virtio hypervisor touch框架介绍(share-device)
  19. 如何升级python的包_Python的包怎么升级
  20. cesium 的 API 结构及Viewer的介绍

热门文章

  1. 我的人生,离拥有一个真·机器猫,又近了一步
  2. linux 消息队列 msgget/msgsnd/msgrecv
  3. Java中合法的关键词_优秀程序员必须掌握的java中50个关键字
  4. java中的线程安全是什么?什么叫线程安全?什么叫不安全?
  5. tf.nn.moments( ) 的用法
  6. mbedtls学习(8)ECDH密钥协商
  7. IT类应届大学生简历的制作技巧
  8. 中鸣循迹机器人_中鸣机器人RIC创新任务挑战赛.DOC
  9. Vue获取url路由地址、参数
  10. 伪元素使用——字体图标(以阿里巴巴矢量图标库为例)