這篇文章主要介紹python中如何實現反爬2021貓眼票房字體加密,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
1、云計算,典型應用OpenStack。2、WEB前端開發,眾多大型網站均為Python開發。3.人工智能應用,基于大數據分析和深度學習而發展出來的人工智能本質上已經無法離開python。4、系統運維工程項目,自動化運維的標配就是python+Django/flask。5、金融理財分析,量化交易,金融分析。6、大數據分析。
一、字體加密原理
簡單來說就是程序員在設計網站的時候使用了自己設計的字體代碼對關鍵字進行編碼,在瀏覽器加載的時會根據這個字體文件對這些字體進行編碼,從而顯示出正確的字體。
二、、爬取實例
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 kdict3、對比斜率字典
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 fontMaps4、爬取內容
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貓眼票房字體加密”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。