主頁(yè) > 知識(shí)庫(kù) > python爬取2021貓眼票房字體加密實(shí)例

python爬取2021貓眼票房字體加密實(shí)例

熱門(mén)標(biāo)簽:400電話辦理費(fèi)用收費(fèi) 外呼系統(tǒng)前面有錄音播放嗎 千呼ai電話機(jī)器人免費(fèi) 鎮(zhèn)江人工外呼系統(tǒng)供應(yīng)商 申請(qǐng)辦個(gè)400電話號(hào)碼 騰訊地圖標(biāo)注有什么版本 深圳網(wǎng)絡(luò)外呼系統(tǒng)代理商 高德地圖標(biāo)注字母 柳州正規(guī)電銷(xiāo)機(jī)器人收費(fèi)

春節(jié)假期剛過(guò),大家有沒(méi)有看春節(jié)檔的電影呢?今年的春節(jié)檔電影很是火爆,我們可以在貓眼票房app查看有關(guān)數(shù)據(jù),因?yàn)閿?shù)據(jù)一致在更新,所以他的字體是動(dòng)態(tài)的,想要爬取有些困難,再加上貓眼app對(duì)字體進(jìn)行加密,該如何爬取呢?本文介紹反爬2021貓眼票房字體加密的實(shí)例。

一、字體加密原理

簡(jiǎn)單來(lái)說(shuō)就是程序員在設(shè)計(jì)網(wǎng)站的時(shí)候使用了自己設(shè)計(jì)的字體代碼對(duì)關(guān)鍵字進(jìn)行編碼,在瀏覽器加載的時(shí)會(huì)根據(jù)這個(gè)字體文件對(duì)這些字體進(jìn)行編碼,從而顯示出正確的字體。

二、爬取實(shí)例

1、得到字體斜率字典

import requestsimport urllib.request as downimport jsonfrom fontTools.ttLib 
import TTFontimport reimport MyPyClass# 
得到字體斜率列表(部分)def font_Kdict(mapstype,maps=None):
  '''
  得到字體斜率字典(部分)
  參數(shù):
  mapstype:str->maps類(lèi)型,判斷是是base/new
  maps:映射字典
  return kdict
  kdict字典關(guān)系:
  num:Klist 數(shù)字對(duì)應(yīng)每條線段的斜率列表
  '''
  kdict={}

2、遍歷maps字典,找到對(duì)應(yīng)的num和namecode

 for num, namecode in maps.items():
    # 跳過(guò)無(wú)用數(shù)據(jù)
    if namecode == 'x': continue
    # 判斷類(lèi)型,并從.coordinates得到對(duì)應(yīng)num的所有坐標(biāo)
    if mapstype=='base':coordinates = namecode.coordinates    
 elif mapstype=='new':coordinates=glyf[namecode].coordinates    # 得到坐標(biāo) X列表和坐標(biāo) Y列表
    x = [i[0] for i in coordinates]
    y = [i[1] for i in coordinates]
    Klist = []
    # 遍歷X列表并切片為前10個(gè)數(shù)據(jù)進(jìn)行斜率計(jì)算,即代表繪圖的前10條線段的斜率
    for index, absx in enumerate(x[:10]):
      # 當(dāng)斜率為0/1時(shí),認(rèn)為斜率為1計(jì)算
      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、對(duì)比斜率字典

def contrast_K(kbase,knew):
  '''
  對(duì)比斜率映射差距
  參數(shù):
  kbase:基礎(chǔ)字體映射表的斜率字典
  knew:當(dāng)前鏈接的字體映射表的斜率字典
 
  return:dict
  fontMaps:根據(jù)對(duì)比得出正確的字體映射關(guān)系字典
  fontMaps = {}
  # 遍歷kbase字典
  for base in kbase.items():
    n = 0 # 成功匹配的斜率個(gè)數(shù)
    # 遍歷knew字典
    for new in knew.items():
      # 遍歷kbase>knew>下的兩組斜率,進(jìn)行大小匹配,
      # 如果斜率k的差值小于0.5,并且樣本數(shù)>=9時(shí),認(rèn)為兩個(gè)坐標(biāo)圖形相識(shí)只是大小比例不同
      # 即k=0.5  n>=9
      for (k1,k2) in zip(base[1],new[1]):
        # k取正數(shù)
        k=k1-k2 if k1>k2 else k2-k1        if k=0.5:
          n+=1
          continue
        else:
          break
      if n>=9:
        # 匹配正確則添加進(jìn)字典中 此時(shí)的字典關(guān)系是:code:num 代碼對(duì)應(yīng)數(shù)字的關(guān)系
        fontMaps[str(hex(new[0]).replace('0x','#x'))]=str(base[0])
        break
      n=0
  #print(fontMaps)
  return fontMaps

4、爬取內(nèi)容

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鏈接
  # 將加載的字體下載保存到本地,并對(duì)其進(jìn)行分析
  down.urlretrieve(fonturl,'newfont.woff')
  # 爬取的電影數(shù)據(jù)內(nèi)容
  content = json.loads(response.content)['movieList']['data']['list']# 信息字典movieNum={}#綜合票房數(shù)字典movieDayOne= {}#上映首日數(shù)量movieRate={}#票房占比movieshowCount={}#排片場(chǎng)次movieViewerAvg={}#場(chǎng)均人數(shù)movieInfos={}# 頁(yè)面內(nèi)容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']# 新字體對(duì)象fontnew=TTFont('newfont.woff')
# 得到當(dāng)前字體的映射關(guān)系表newNumberMaps=fontnew.getBestCmap()# 獲取字形glyf=fontnew['glyf']
# 基礎(chǔ)字體斜率字典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)# 對(duì)加密的字體遍歷分組,并去除無(wú)用字符
for name,numbercode in movieNum.items():
  movieNum[name]=re.findall('([\S]*?);', numbercode)
# 根據(jù)得到的fontcodes映射對(duì)加密字體進(jìn)行替換,得到正確數(shù)值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)+'萬(wàn)',
    '票房占比',movieRate[name],
    '場(chǎng)均人數(shù)',movieViewerAvg[name]+'人',
    '排片場(chǎng)次',movieshowCount[name]]
  print(infos)

到此這篇關(guān)于python爬取2021貓眼票房字體加密實(shí)例的文章就介紹到這了,更多相關(guān)python爬2021貓眼票房數(shù)據(jù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • Python構(gòu)建圖像分類(lèi)識(shí)別器的方法
  • Python爬蟲(chóng)實(shí)例之2021貓眼票房字體加密反爬策略(粗略版)
  • 利用python如何實(shí)現(xiàn)貓捉老鼠小游戲
  • Python貓眼電影最近上映的電影票房信息
  • 用Python 爬取貓眼電影數(shù)據(jù)分析《無(wú)名之輩》
  • python爬蟲(chóng)開(kāi)發(fā)之使用Python爬蟲(chóng)庫(kù)requests多線程抓取貓眼電影TOP100實(shí)例
  • python爬蟲(chóng) 貓眼電影和電影天堂數(shù)據(jù)csv和mysql存儲(chǔ)過(guò)程解析
  • Python通過(guò)TensorFlow卷積神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)貓狗識(shí)別
  • python調(diào)用opencv實(shí)現(xiàn)貓臉檢測(cè)功能
  • Python爬取酷狗MP3音頻的步驟
  • python發(fā)qq消息轟炸虐狗好友思路詳解(完整代碼)
  • python使用beautifulsoup4爬取酷狗音樂(lè)代碼實(shí)例
  • Java基礎(chǔ)之ClassLoader詳解

標(biāo)簽:合肥 烏蘭察布 哈爾濱 大慶 烏蘭察布 平頂山 郴州 海南

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《python爬取2021貓眼票房字體加密實(shí)例》,本文關(guān)鍵詞  python,爬取,2021,貓眼,票房,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《python爬取2021貓眼票房字體加密實(shí)例》相關(guān)的同類(lèi)信息!
  • 本頁(yè)收集關(guān)于python爬取2021貓眼票房字體加密實(shí)例的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章