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基于回溯法子集树模板解决旅行商问题(TSP)实例
Sep 05 Python
Python实现按当前日期(年、月、日)创建多级目录的方法
Apr 26 Python
浅谈python中np.array的shape( ,)与( ,1)的区别
Jun 04 Python
利用Python写一个爬妹子的爬虫
Jun 08 Python
Anaconda 离线安装 python 包的操作方法
Jun 11 Python
Django框架自定义模型管理器与元选项用法分析
Jul 22 Python
详解Python用三种方式统计词频的方法
Jul 29 Python
python飞机大战pygame游戏背景设计详解
Dec 17 Python
Python+opencv+pyaudio实现带声音屏幕录制
Dec 23 Python
python时间序列数据转为timestamp格式的方法
Aug 03 Python
python读取excel数据绘制简单曲线图的完整步骤记录
Oct 30 Python
Python爬虫之Selenium中frame/iframe表单嵌套页面
Dec 04 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
《DOTA3》开发工作已经开始 《DOTA3》将代替《DOTA2》
2021/03/06 DOTA
php学习笔记 数组遍历实现代码
2011/06/09 PHP
关于访问控制的一首PHP面试题(对属性或方法的访问控制)
2012/09/13 PHP
php仿QQ验证码的实例分析
2013/07/01 PHP
thinkphp文件处理类Dir.class.php的用法分析
2014/12/08 PHP
php微信公众平台开发(一) 配置接口
2016/12/06 PHP
javascript window.opener的用法分析
2010/04/07 Javascript
js限制文本框输入长度两种限制方式(长度、字节数)
2012/12/19 Javascript
使用js修改客户端注册表的方法
2013/08/09 Javascript
在JavaScript中使用NaN值的方法
2015/06/05 Javascript
JavaScript中Date.toSource()方法的使用教程
2015/06/12 Javascript
JavaScript中的Promise使用详解
2015/06/24 Javascript
微信小程序 页面传参实例详解
2016/11/16 Javascript
原生js仿浏览器滚动条效果
2017/03/02 Javascript
Angular中实现树形结构视图实例代码
2017/05/05 Javascript
js自定义瀑布流布局插件
2017/05/16 Javascript
微信小程序实现指定显示行数多余文字去掉用省略号代替
2018/07/25 Javascript
一秒学会微信小程序制作table表格
2019/02/14 Javascript
实现高性能javascript的注意事项
2019/05/27 Javascript
python列出目录下指定文件与子目录的方法
2015/07/03 Python
基于python中的TCP及UDP(详解)
2017/11/06 Python
pycharm配置当鼠标悬停时快速提示方法参数
2019/07/31 Python
Python循环实现n的全排列功能
2019/09/16 Python
Python3和PyCharm安装与环境配置【图文教程】
2020/02/14 Python
Python bisect模块原理及常见实例
2020/06/17 Python
解决pycharm不能自动保存在远程linux中的问题
2021/02/06 Python
python实现b站直播自动发送弹幕功能
2021/02/20 Python
美国内衣品牌:Leonisa
2016/08/14 全球购物
沙特阿拉伯网上购物:Sayidaty Mall
2018/05/06 全球购物
WWE美国职业摔角官方商店:WWE Shop
2018/11/15 全球购物
欧洲领先的技术商店:eibmarkt.com
2019/05/10 全球购物
德国拖鞋网站:German Slippers
2019/11/08 全球购物
应届大学生的推荐信
2013/11/20 职场文书
演讲稿怎么写才完美
2014/01/02 职场文书
民主生活会剖析材料
2014/09/30 职场文书
nginx rewrite功能使用场景分析
2022/05/30 Servers