• 售前

  • 售后

热门帖子
入门百科

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

[复制链接]
唐伯狼乌 显示全部楼层 发表于 2021-10-25 19:21:43 |阅读模式 打印 上一主题 下一主题
春节假期刚过,各人有没有看春节档的影戏呢?今年的春节档影戏非常火爆,我们可以在猫眼票房app查察有关数据,由于数据划一在更新,以是他的字体是动态的,想要爬取有些困难,再加上猫眼app对字体举行加密,该如何爬取呢?本文介绍反爬2021猫眼票房字体加密的实例。
一、字体加密原理

简单来说就是步调员在计划网站的时候利用了本身计划的字体代码对关键字举行编码,在浏览器加载的时会根据这个字体文件对这些字体举行编码,从而体现出精确的字体。
二、爬取实例

1、得到字体斜率字典
  1. import requestsimport urllib.request as downimport jsonfrom fontTools.ttLib
  2. import TTFontimport reimport MyPyClass#
  3. 得到字体斜率列表(部分)def font_Kdict(mapstype,maps=None):
  4.   '''
  5.   得到字体斜率字典(部分)
  6.   参数:
  7.   mapstype:str->maps类型,判断是是base/new
  8.   maps:映射字典
  9.   return kdict
  10.   kdict字典关系:
  11.   num:Klist 数字对应每条线段的斜率列表
  12.   '''
  13.   kdict={}
复制代码
2、遍历maps字典,找到对应的num和namecode
  1. for num, namecode in maps.items():
  2.     # 跳过无用数据
  3.     if namecode == 'x': continue
  4.     # 判断类型,并从.coordinates得到对应num的所有坐标
  5.     if mapstype=='base':coordinates = namecode.coordinates   
  6. elif mapstype=='new':coordinates=glyf[namecode].coordinates    # 得到坐标 X列表和坐标 Y列表
  7.     x = [i[0] for i in coordinates]
  8.     y = [i[1] for i in coordinates]
  9.     Klist = []
  10.     # 遍历X列表并切片为前10个数据进行斜率计算,即代表绘图的前10条线段的斜率
  11.     for index, absx in enumerate(x[:10]):
  12.       # 当斜率为0/1时,认为斜率为1计算
  13.       if x[index + 1] == x[index] or y[index + 1] == y[index]:
  14.         absxy = 1
  15.       else:
  16.         absxy = (y[index + 1] - y[index]) / (x[index + 1] - x[index])
  17.       # 将斜率加入到列表
  18.       Klist.append(-absxy if absxy < 0 else absxy)
  19.     kdict[num]=Klist    #print('base:', code, Klist, name)
  20.   return kdict
复制代码
3、对比斜率字典
  1. def contrast_K(kbase,knew):
  2.   '''
  3.   对比斜率映射差距
  4.   参数:
  5.   kbase:基础字体映射表的斜率字典
  6.   knew:当前链接的字体映射表的斜率字典
  7.   return:dict
  8.   fontMaps:根据对比得出正确的字体映射关系字典
  9.   fontMaps = {}
  10.   # 遍历kbase字典
  11.   for base in kbase.items():
  12.     n = 0 # 成功匹配的斜率个数
  13.     # 遍历knew字典
  14.     for new in knew.items():
  15.       # 遍历kbase>knew>下的两组斜率,进行大小匹配,
  16.       # 如果斜率k的差值小于0.5,并且样本数>=9时,认为两个坐标图形相识只是大小比例不同
  17.       # 即k<=0.5  n>=9
  18.       for (k1,k2) in zip(base[1],new[1]):
  19.         # k取正数
  20.         k=k1-k2 if k1>k2 else k2-k1        if k<=0.5:
  21.           n+=1
  22.           continue
  23.         else:
  24.           break
  25.       if n>=9:
  26.         # 匹配正确则添加进字典中 此时的字典关系是:code:num 代码对应数字的关系
  27.         fontMaps[str(hex(new[0]).replace('0x','&#x'))]=str(base[0])
  28.         break
  29.       n=0
  30.   #print(fontMaps)
  31.   return fontMaps
复制代码
4、爬取内容
  1. with requests.get(url,headers={'user-agent':ua}) as response:
  2.   # 获取存放字典的json字段,并提取字体url
  3.   fontStyle=json.loads(response.content)['fontStyle']
  4.   fontStyle=re.findall('"([\s\S]*?)"',fontStyle[::-1])
  5.   fonturl='http:'+fontStyle[0][::-1]# 字体url链接
  6.   # 将加载的字体下载保存到本地,并对其进行分析
  7.   down.urlretrieve(fonturl,'newfont.woff')
  8.   # 爬取的电影数据内容
  9.   content = json.loads(response.content)['movieList']['data']['list']# 信息字典movieNum={}#综合票房数字典movieDayOne= {}#上映首日数量movieRate={}#票房占比movieshowCount={}#排片场次movieViewerAvg={}#场均人数movieInfos={}# 页面内容for i in content:
  10.   moviename=i['movieInfo']['movieName']
  11.   movieNum[moviename]=i['boxSplitUnit']['num']
  12.   movieDayOne[moviename]=i['sumBoxDesc']
  13.   movieRate[moviename]=i['splitBoxRate']
  14.   movieshowCount[moviename]=i['showCount']
  15.   movieViewerAvg[moviename]=i['avgShowView']# 新字体对象fontnew=TTFont('newfont.woff')
  16. # 得到当前字体的映射关系表newNumberMaps=fontnew.getBestCmap()# 获取字形glyf=fontnew['glyf']
  17. # 基础字体斜率字典k_base_dict=font_Kdict(maps=baseNumberMaps,mapstype='base')
  18. # 新字体斜率字典k_new_dict=font_Kdict(maps=fontnew.getBestCmap(),mapstype='new')
  19. # 得到字体映射字典fontcodes=contrast_K(k_base_dict,k_new_dict)# 对加密的字体遍历分组,并去除无用字符
  20. for name,numbercode in movieNum.items():
  21.   movieNum[name]=re.findall('([\S]*?);', numbercode)
  22. # 根据得到的fontcodes映射对加密字体进行替换,得到正确数值for index,(name,numbercodelist)
  23. in enumerate(movieNum.items()):
  24.   num=[]
  25.   # 替换操作
  26.   for code in numbercodelist:
  27.     if '.' in code:
  28.       code=code.replace('.','')
  29.       num.append('.'+fontcodes[code])
  30.     else:
  31.       num.append(fontcodes[code])
  32.   infos=['排行:'+str(index+1),
  33.     '片名',name,
  34.     '上映首日',movieDayOne[name],
  35.     '票房',''.join(num)+'万',
  36.     '票房占比',movieRate[name],
  37.     '场均人数',movieViewerAvg[name]+'人',
  38.     '排片场次',movieshowCount[name]]
  39.   print(infos)
复制代码
到此这篇关于python爬取2021猫眼票房字体加密实例的文章就介绍到这了,更多干系python爬2021猫眼票房数据内容请搜刮脚本之家从前的文章或继承浏览下面的干系文章希望各人以后多多支持脚本之家!

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作