python爬取2021猫眼票房字体加密实例


Posted in Python onFebruary 19, 2021

春节假期刚过,大家有没有看春节档的电影呢?今年的春节档电影很是火爆,我们可以在猫眼票房app查看有关数据,因为数据一致在更新,所以他的字体是动态的,想要爬取有些困难,再加上猫眼app对字体进行加密,该如何爬取呢?本文介绍反爬2021猫眼票房字体加密的实例。

一、字体加密原理

简单来说就是程序员在设计网站的时候使用了自己设计的字体代码对关键字进行编码,在浏览器加载的时会根据这个字体文件对这些字体进行编码,从而显示出正确的字体。

二、爬取实例

1、得到字体斜率字典

import requestsimport urllib.request as downimport jsonfrom fontTools.ttLib 
import TTFontimport reimport MyPyClass# 
得到字体斜率列表(部分)def font_Kdict(mapstype,maps=None):
  '''
  得到字体斜率字典(部分)
  参数:
  mapstype:str->maps类型,判断是是base/new
  maps:映射字典
  return kdict
  kdict字典关系:
  num:Klist 数字对应每条线段的斜率列表
  '''
  kdict={}

2、遍历maps字典,找到对应的num和namecode

for num, namecode in maps.items():
    # 跳过无用数据
    if namecode == 'x': continue
    # 判断类型,并从.coordinates得到对应num的所有坐标
    if mapstype=='base':coordinates = namecode.coordinates    
 elif mapstype=='new':coordinates=glyf[namecode].coordinates    # 得到坐标 X列表和坐标 Y列表
    x = [i[0] for i in coordinates]
    y = [i[1] for i in coordinates]
    Klist = []
    # 遍历X列表并切片为前10个数据进行斜率计算,即代表绘图的前10条线段的斜率
    for index, absx in enumerate(x[:10]):
      # 当斜率为0/1时,认为斜率为1计算
      if x[index + 1] == x[index] or y[index + 1] == y[index]:
        absxy = 1
      else:
        absxy = (y[index + 1] - y[index]) / (x[index + 1] - x[index])
      # 将斜率加入到列表
      Klist.append(-absxy if absxy < 0 else absxy)
    kdict[num]=Klist    #print('base:', code, Klist, name)
  return kdict

3、对比斜率字典

def contrast_K(kbase,knew):
  '''
  对比斜率映射差距
  参数:
  kbase:基础字体映射表的斜率字典
  knew:当前链接的字体映射表的斜率字典
 
  return:dict
  fontMaps:根据对比得出正确的字体映射关系字典
  fontMaps = {}
  # 遍历kbase字典
  for base in kbase.items():
    n = 0 # 成功匹配的斜率个数
    # 遍历knew字典
    for new in knew.items():
      # 遍历kbase>knew>下的两组斜率,进行大小匹配,
      # 如果斜率k的差值小于0.5,并且样本数>=9时,认为两个坐标图形相识只是大小比例不同
      # 即k<=0.5  n>=9
      for (k1,k2) in zip(base[1],new[1]):
        # k取正数
        k=k1-k2 if k1>k2 else k2-k1        if k<=0.5:
          n+=1
          continue
        else:
          break
      if n>=9:
        # 匹配正确则添加进字典中 此时的字典关系是:code:num 代码对应数字的关系
        fontMaps[str(hex(new[0]).replace('0x','&#x'))]=str(base[0])
        break
      n=0
  #print(fontMaps)
  return fontMaps

4、爬取内容

with requests.get(url,headers={'user-agent':ua}) as response:
  # 获取存放字典的json字段,并提取字体url
  fontStyle=json.loads(response.content)['fontStyle']
  fontStyle=re.findall('\"([\s\S]*?)\"',fontStyle[::-1])
  fonturl='http:'+fontStyle[0][::-1]# 字体url链接
  # 将加载的字体下载保存到本地,并对其进行分析
  down.urlretrieve(fonturl,'newfont.woff')
  # 爬取的电影数据内容
  content = json.loads(response.content)['movieList']['data']['list']# 信息字典movieNum={}#综合票房数字典movieDayOne= {}#上映首日数量movieRate={}#票房占比movieshowCount={}#排片场次movieViewerAvg={}#场均人数movieInfos={}# 页面内容for i in content:
  moviename=i['movieInfo']['movieName']
  movieNum[moviename]=i['boxSplitUnit']['num']
  movieDayOne[moviename]=i['sumBoxDesc']
  movieRate[moviename]=i['splitBoxRate']
  movieshowCount[moviename]=i['showCount']
  movieViewerAvg[moviename]=i['avgShowView']# 新字体对象fontnew=TTFont('newfont.woff')
# 得到当前字体的映射关系表newNumberMaps=fontnew.getBestCmap()# 获取字形glyf=fontnew['glyf']
# 基础字体斜率字典k_base_dict=font_Kdict(maps=baseNumberMaps,mapstype='base')
# 新字体斜率字典k_new_dict=font_Kdict(maps=fontnew.getBestCmap(),mapstype='new')
# 得到字体映射字典fontcodes=contrast_K(k_base_dict,k_new_dict)# 对加密的字体遍历分组,并去除无用字符
for name,numbercode in movieNum.items():
  movieNum[name]=re.findall('([\S]*?);', numbercode)
# 根据得到的fontcodes映射对加密字体进行替换,得到正确数值for index,(name,numbercodelist) 
in enumerate(movieNum.items()):
  num=[]
  # 替换操作
  for code in numbercodelist:
    if '.' in code:
      code=code.replace('.','')
      num.append('.'+fontcodes[code])
    else:
      num.append(fontcodes[code])
  infos=['排行:'+str(index+1),
    '片名',name,
    '上映首日',movieDayOne[name],
    '票房',''.join(num)+'万',
    '票房占比',movieRate[name],
    '场均人数',movieViewerAvg[name]+'人',
    '排片场次',movieshowCount[name]]
  print(infos)

到此这篇关于python爬取2021猫眼票房字体加密实例的文章就介绍到这了,更多相关python爬2021猫眼票房数据内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
举例讲解Python中metaclass元类的创建与使用
Jun 30 Python
用python记录运行pid,并在需要时kill掉它们的实例
Jan 16 Python
Python中正则表达式详解
May 17 Python
Python 找到列表中满足某些条件的元素方法
Jun 26 Python
Python类中self参数用法详解
Feb 13 Python
Python如何实现爬取B站视频
May 20 Python
python实现画图工具
Aug 27 Python
基于Python 函数和方法的区别说明
Mar 24 Python
Keras在mnist上的CNN实践,并且自定义loss函数曲线图操作
May 25 Python
Python 循环读取数据内存不足的解决方案
May 25 Python
OpenCV 图像梯度的实现方法
Jul 25 Python
Python超详细分步解析随机漫步
Mar 17 Python
Python之Sklearn使用入门教程
Feb 19 #Python
Python爬虫UA伪装爬取的实例讲解
Feb 19 #Python
Pycharm制作搞怪弹窗的实现代码
Feb 19 #Python
python 高阶函数简单介绍
Feb 19 #Python
如何用Matlab和Python读取Netcdf文件
Feb 19 #Python
python中最小二乘法详细讲解
Feb 19 #Python
python中scipy.stats产生随机数实例讲解
Feb 19 #Python
You might like
攻克CakePHP系列三 表单数据增删改
2008/10/22 PHP
PHP中执行MYSQL事务解决数据写入不完整等情况
2014/01/07 PHP
thinkphp中ajax与php响应过程详解
2014/12/08 PHP
php中smarty模板条件判断用法实例
2015/06/11 PHP
通过PHP自带的服务器来查看正则匹配结果的方法
2015/12/24 PHP
PHP中串行化用法示例
2016/11/16 PHP
PHP实现单条sql执行多个数据的insert语句方法
2019/10/11 PHP
用 javascript 实现的点击复制代码
2007/03/24 Javascript
js编写trim()函数及正则表达式的运用
2013/10/24 Javascript
自定义函数实现IE7与IE8不兼容js中trim函数的问题
2015/02/03 Javascript
JavaScript获取网页表单提交方式的方法
2015/04/02 Javascript
JavaScript实现cookie的写入、读取、删除功能
2015/11/05 Javascript
通过网页查看JS源码中汉字显示乱码的解决方法
2016/10/26 Javascript
微信小程序websocket聊天室的实现示例代码
2019/02/12 Javascript
JS学习笔记之原型链和利用原型实现继承详解
2019/05/29 Javascript
JS实现排行榜文字向上滚动轮播效果
2019/11/26 Javascript
js实现贪吃蛇游戏 canvas绘制地图
2020/09/09 Javascript
python学习 流程控制语句详解
2016/06/01 Python
Python 中urls.py:URL dispatcher(路由配置文件)详解
2017/03/24 Python
python 文件操作删除某行的实例
2017/09/04 Python
python判断设备是否联网的方法
2018/06/29 Python
Python去除字符串前后空格的几种方法
2019/03/04 Python
Python3.5 + sklearn利用SVM自动识别字母验证码方法示例
2019/05/10 Python
h5移动端调用支付宝、微信支付的实现
2020/06/08 HTML / CSS
Foot Locker英国官网:美国知名运动产品零售商
2019/02/21 全球购物
英国在线泳装店:Simply Swim
2019/05/05 全球购物
Marc O’Polo俄罗斯官方在线商店:德国高端时尚品牌
2019/12/26 全球购物
大学生学习自我评价
2014/01/13 职场文书
人事专员工作职责
2014/02/22 职场文书
面试自我评价范文
2014/09/17 职场文书
行政前台岗位职责
2015/04/16 职场文书
拾金不昧表扬信怎么写
2015/05/04 职场文书
元宵节晚会主持词
2015/07/01 职场文书
超市员工管理制度
2015/08/06 职场文书
如何正确理解python装饰器
2021/06/15 Python
Go语言实现Base64、Base58编码与解码
2021/07/26 Golang