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抓取某汽车网数据解析html存入excel示例
Dec 04 Python
让 python 命令行也可以自动补全
Nov 30 Python
简单理解Python中基于生成器的状态机
Apr 13 Python
Python实现优先级队列结构的方法详解
Jun 02 Python
python3制作捧腹网段子页爬虫
Feb 12 Python
Python绘制正余弦函数图像的方法
Aug 28 Python
python实现朴素贝叶斯算法
Nov 19 Python
python实现烟花小程序
Jan 30 Python
Python List列表对象内置方法实例详解
Oct 22 Python
基于matplotlib中ion()和ioff()的使用详解
Jun 16 Python
记录一下scrapy中settings的一些配置小结
Sep 28 Python
matplotlib 使用 plt.savefig() 输出图片去除旁边的空白区域
Jan 05 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学习之简单计算器实现代码
2011/06/09 PHP
php常用表单验证类用法实例
2015/06/18 PHP
PHP实现新型冠状病毒疫情实时图的实例
2020/02/04 PHP
PHP7 字符串处理机制修改
2021/03/09 PHP
又一个小巧的图片预加载类
2007/05/05 Javascript
JavaScript 在线压缩和格式化收藏
2009/01/16 Javascript
Javascript 检测、添加、移除样式(className)函数代码
2009/09/08 Javascript
查看源码的工具 学习jQuery源码不错的工具
2011/12/26 Javascript
html5的自定义data-*属性和jquery的data()方法的使用示例
2013/08/21 Javascript
jquery中插件实现自动添加用户的具体代码
2013/11/15 Javascript
解决jQuery动态获取手机屏幕高和宽的问题
2014/05/07 Javascript
javaScript 事件绑定、事件冒泡、事件捕获和事件执行顺序整理总结
2016/10/10 Javascript
使用vue.js2.0 + ElementUI开发后台管理系统详细教程(二)
2017/01/21 Javascript
Nodejs实现多文件夹文件同步
2018/10/17 NodeJs
VUE动态生成word的实现
2020/07/26 Javascript
vue配置多代理服务接口地址操作
2020/09/08 Javascript
微信小程序实现打卡签到页面
2020/09/21 Javascript
[29:59]完美世界DOTA2联赛PWL S3 Forest vs access 第二场 12.11
2020/12/13 DOTA
python实现带声音的摩斯码翻译实现方法
2015/05/20 Python
python实现12306火车票查询器
2017/04/20 Python
Python3 SSH远程连接服务器的方法示例
2018/12/29 Python
Python程序控制语句用法实例分析
2020/01/14 Python
Python socket连接中的粘包、精确传输问题实例分析
2020/03/24 Python
浅谈移动端网页图片预加载方案
2018/11/05 HTML / CSS
美国新蛋IT数码商城:Newegg.com
2016/07/21 全球购物
日本最大的购物网站:日本乐天市场(Rakuten Ichiba)
2020/11/04 全球购物
一份软件工程师的面试试题
2016/02/01 面试题
建筑自我鉴定
2013/10/19 职场文书
高二学生评语大全
2014/04/25 职场文书
银行金融服务方案
2014/06/11 职场文书
解放思想演讲稿
2014/09/11 职场文书
医生学习党的群众路线教育实践活动心得体会
2014/11/03 职场文书
工程进度款催款函
2015/06/24 职场文书
教你用Python写一个植物大战僵尸小游戏
2021/04/25 Python
微信小程序基础教程之echart的使用
2021/06/01 Javascript
div与span之间的区别与使用介绍
2021/12/06 HTML / CSS