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实现linux服务器批量修改密码并生成execl
Apr 22 Python
python实现查找excel里某一列重复数据并且剔除后打印的方法
May 26 Python
python更新列表的方法
Jul 28 Python
python timestamp和datetime之间转换详解
Dec 11 Python
python通过百度地图API获取某地址的经纬度详解
Jan 28 Python
python 限制函数调用次数的实例讲解
Apr 21 Python
详解python中TCP协议中的粘包问题
Mar 22 Python
Python3内置模块pprint让打印比print更美观详解
Jun 02 Python
使用Pandas的Series方法绘制图像教程
Dec 04 Python
python实现梯度法 python最速下降法
Mar 24 Python
PyQt5如何将.ui文件转换为.py文件的实例代码
May 26 Python
python利用线程实现多任务
Sep 18 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
PHP图片处理之使用imagecopyresampled函数裁剪图片例子
2014/11/19 PHP
自己写的php中文截取函数mb_strlen和mb_substr
2015/02/09 PHP
php过滤所有的空白字符(空格、全角空格、换行等)
2015/10/27 PHP
thinkPHP框架中执行原生SQL语句的方法
2017/10/25 PHP
Laravel中为什么不使用blpop取队列详析
2018/08/01 PHP
用javascript控制iframe滚动的代码
2007/04/10 Javascript
两种简单实现菜单高亮显示的JS类代码
2010/06/27 Javascript
jQuery.extend 函数详解
2012/02/03 Javascript
JavaScript 图像动画的小demo
2012/05/23 Javascript
jQuery中:button选择器用法实例
2015/01/04 Javascript
jQuery中dom元素上绑定的事件详解
2015/04/24 Javascript
jQuery绑定事件的四种方式介绍
2016/10/31 Javascript
jquery结合html实现中英文页面切换
2016/11/29 Javascript
JS文件/图片从电脑里面拖拽到浏览器上传文件/图片
2017/03/08 Javascript
详解ES6之用let声明变量以及let loop机制
2017/07/15 Javascript
关于webpack2和模块打包的新手指南(小结)
2017/08/07 Javascript
JS实现闭包中的沙箱模式示例
2017/09/07 Javascript
JS实现字符串去重及数组去重的方法示例
2018/04/21 Javascript
webpack4 SCSS提取和懒加载的示例
2018/09/03 Javascript
JS实现简易留言板(节点操作)
2020/03/16 Javascript
Vue 解决通过this.$refs来获取DOM或者组件报错问题
2020/07/28 Javascript
javascript前端实现多视频上传
2020/12/13 Javascript
Python实现的寻找前5个默尼森数算法示例
2018/03/25 Python
Pycharm运行加载文本出现错误的解决方法
2019/06/27 Python
python正则过滤字母、中文、数字及特殊字符方法详解
2020/02/11 Python
python实现图片素描效果
2020/09/26 Python
怎么写有吸引力的自荐信
2013/11/17 职场文书
安全检查与奖惩制度
2014/01/23 职场文书
幼儿园大班毕业教师寄语
2014/04/03 职场文书
踏青活动策划方案
2014/08/19 职场文书
建筑专业毕业生求职信
2014/09/30 职场文书
初中作文评语
2014/12/25 职场文书
nginx优化的六点方法
2021/03/31 Servers
mysql对于模糊查询like的一些汇总
2021/05/09 MySQL
新手入门Jvm-- JVM对象创建与内存分配机制
2021/06/18 Java/Android
Java面试题冲刺第十五天--设计模式
2021/08/07 面试题