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 查找文件夹下所有文件 实现代码
Jul 01 Python
Python中关于字符串对象的一些基础知识
Apr 08 Python
python使用xlrd实现检索excel中某列含有指定字符串记录的方法
May 09 Python
python创建临时文件夹的方法
Jul 06 Python
解决Python出现_warn_unsafe_extraction问题的方法
Mar 24 Python
Python运维开发之psutil库的使用详解
Oct 18 Python
Python获取基金网站网页内容、使用BeautifulSoup库分析html操作示例
Jun 04 Python
Pyqt5 实现跳转界面并关闭当前界面的方法
Jun 19 Python
解决django后台管理界面添加中文内容乱码问题
Nov 15 Python
深入理解Python 多线程
Jun 16 Python
Python系统公网私网流量监控实现流程
Nov 23 Python
Python 实现进度条的六种方式
Jan 06 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
Memcached常用命令以及使用说明详解
2013/06/27 PHP
PHP操作MySQL的mysql_fetch_* 函数的常见用法教程
2015/12/25 PHP
yii2 RBAC使用DbManager实现后台权限判断的方法
2016/07/23 PHP
可以支持多中格式的JS键盘
2007/05/02 Javascript
javascript下数值型比较难点说明
2010/06/07 Javascript
Jquery 实现弹出层插件
2015/01/28 Javascript
基于jquery实现的树形菜单效果代码
2015/09/06 Javascript
JS实现Select的option上下移动的方法
2016/03/01 Javascript
使用伪命名空间封装保护独自创建的对象方法
2016/08/04 Javascript
Express URL跳转(重定向)的实现方法
2017/04/07 Javascript
bootstrap table插件的分页与checkbox使用详解
2017/07/23 Javascript
用node-webkit把web应用打包成桌面应用(windows环境)
2018/02/01 Javascript
解决vue同一slot在组件中渲染多次的问题
2018/09/06 Javascript
vue的.vue文件是怎么run起来的(vue-loader)
2018/12/10 Javascript
微信小程序导航栏滑动定位功能示例(实现CSS3的positionsticky效果)
2019/01/24 Javascript
element-ui组件中input等的change事件中传递自定义参数
2019/05/22 Javascript
微信小程序自定义头部导航栏和导航栏背景图片 navigationStyle问题
2019/07/26 Javascript
weui上传多图片,压缩,base64编码的示例代码
2020/06/22 Javascript
使用Python监控文件内容变化代码实例
2018/06/04 Python
详解配置Django的Celery异步之路踩坑
2018/11/25 Python
python3.4爬虫demo
2019/01/22 Python
python学生管理系统学习笔记
2019/03/19 Python
如何教少儿学习Python编程
2020/07/10 Python
Matplotlib 绘制饼图解决文字重叠的方法
2020/07/24 Python
pytest fixtures装饰器的使用和如何控制用例的执行顺序
2021/01/28 Python
YOINS官网:时尚女装网上购物
2017/03/17 全球购物
上海天奕面试题笔试题
2015/04/19 面试题
WSDL的操作类型主要有几种
2013/07/19 面试题
幼儿园春游活动方案
2014/01/19 职场文书
管事部库房保管员岗位职责
2014/02/21 职场文书
财产保全担保书范文
2014/04/01 职场文书
《青海高原一株柳》教学反思
2014/04/25 职场文书
法人代表身份证明书及授权委托书
2014/09/16 职场文书
成品仓管员岗位职责
2015/04/01 职场文书
2015年大学学生会工作总结
2015/05/13 职场文书
电影开国大典观后感
2015/06/04 职场文书