python爬取2021貓眼票房字體加密實(shí)例
春節(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)每條線(xiàn)段的斜率列表 ''' 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條線(xiàn)段的斜率 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多線(xiàn)程抓取貓眼電影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詳解
相關(guān)文章
web.py 十分鐘創(chuàng)建簡(jiǎn)易博客實(shí)現(xiàn)代碼
web.py是一款輕量級(jí)的Python web開(kāi)發(fā)框架,簡(jiǎn)單、高效、學(xué)習(xí)成本低,特別適合作為python web開(kāi)發(fā)的入門(mén)框架2016-04-04只用50行Python代碼爬取網(wǎng)絡(luò)美女高清圖片
第一次寫(xiě)文章,技術(shù)不成熟之處望各位大神輕噴,今天教大家只用50行Python代碼爬取網(wǎng)絡(luò)美女圖片是怎么操作的,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)python的小伙伴們很有幫助哦,需要的朋友可以參考下2021-06-06教你怎么用python實(shí)現(xiàn)字符串轉(zhuǎn)日期
今天教各位小伙伴怎么用python實(shí)現(xiàn)字符串轉(zhuǎn)日期,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)python的小伙伴很有幫助,需要的朋友可以參考下2021-05-05Python設(shè)計(jì)模式之迭代器模式原理與用法實(shí)例分析
這篇文章主要介紹了Python設(shè)計(jì)模式之迭代器模式原理與用法,結(jié)合具體實(shí)例形式分析了迭代器模式的概念、原理、定義及使用方法,代碼注釋說(shuō)明簡(jiǎn)單易懂,需要的朋友可以參考下2019-01-01Python抓新型冠狀病毒肺炎疫情數(shù)據(jù)并繪制全國(guó)疫情分布的代碼實(shí)例
在本篇文章里小編給大家整理了一篇關(guān)于Python抓新型冠狀病毒肺炎疫情數(shù)據(jù)并繪制全國(guó)疫情分布的代碼實(shí)例,有興趣的朋友們可以學(xué)習(xí)下。2020-02-02新手學(xué)python應(yīng)該下哪個(gè)版本
在本篇內(nèi)容中小編給大家整理的是關(guān)于新手學(xué)python應(yīng)該下版本的相關(guān)知識(shí)點(diǎn),需要的朋友們可以參考學(xué)習(xí)下。2020-06-06Python MNIST手寫(xiě)體識(shí)別詳解與試練
MNIST(官方網(wǎng)站)是非常有名的手寫(xiě)體數(shù)字識(shí)別數(shù)據(jù)集,在Tensorflow的官方網(wǎng)站里,第一個(gè)就拿它來(lái)做實(shí)戰(zhàn)講解,咱們也以此作為開(kāi)始的項(xiàng)目2021-11-11使用matplotlib在Python中繪制數(shù)據(jù)的詳細(xì)教程
Python 在處理數(shù)據(jù)方面非常出色,通常,數(shù)據(jù)集 會(huì)包括多個(gè)變量和許多實(shí)例,這使得很難理解數(shù)據(jù)的情況,數(shù)據(jù)可視化是幫助您識(shí)別數(shù)據(jù)模式的一種有用方式,本教程將描述如何使用 matplotlib 在 Python 中繪制數(shù)據(jù),需要的朋友可以參考下2024-10-10