溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

python中如何實(shí)現(xiàn)反爬2021貓眼票房字體加密

發(fā)布時(shí)間:2021-05-09 09:34:40 來源:億速云 閱讀:158 作者:小新 欄目:編程語言

這篇文章主要介紹python中如何實(shí)現(xiàn)反爬2021貓眼票房字體加密,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!

python主要應(yīng)用領(lǐng)域有哪些

1、云計(jì)算,典型應(yīng)用OpenStack。2、WEB前端開發(fā),眾多大型網(wǎng)站均為Python開發(fā)。3.人工智能應(yīng)用,基于大數(shù)據(jù)分析和深度學(xué)習(xí)而發(fā)展出來的人工智能本質(zhì)上已經(jīng)無法離開python。4、系統(tǒng)運(yùn)維工程項(xiàng)目,自動(dòng)化運(yùn)維的標(biāo)配就是python+Django/flask。5、金融理財(cái)分析,量化交易,金融分析。6、大數(shù)據(jù)分析。

一、字體加密原理

簡(jiǎn)單來說就是程序員在設(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類型,判斷是是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():
        # 跳過無用數(shù)據(jù)
        if namecode == 'x': continue
        # 判斷類型,并從.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={}# 頁面內(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ì)加密的字體遍歷分組,并去除無用字符
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)+'萬',
        '票房占比',movieRate[name],
        '場(chǎng)均人數(shù)',movieViewerAvg[name]+'人',
        '排片場(chǎng)次',movieshowCount[name]]
    print(infos)

以上是“python中如何實(shí)現(xiàn)反爬2021貓眼票房字體加密”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI