Python爬蟲雜記 - 字體文件反爬(二)

字體文件反爬

在搞定靜態(tài)字庫反爬之后蝗羊, 可以解決部分字體文件的反爬框杜, 但動(dòng)態(tài)字文件反爬是解決不掉的咪辱。此文章就是為解決動(dòng)態(tài)字體文件的反反爬而寫弱贼。本想以去哪兒網(wǎng)(手機(jī)端)的為例, 奈何手機(jī)端的字庫反爬可能需要賬號(hào)密碼才會(huì)出現(xiàn)仁堪, 遂改用貓眼電影網(wǎng)的字體文件反爬為例哮洽。源碼在最后!

1. 開發(fā)者模式查看網(wǎng)頁內(nèi)容

開發(fā)者模式中的字體無法顯示

2. 下載網(wǎng)頁源碼保存至本地查看

網(wǎng)頁源碼下載到本地后查看

3. 字體文件保存在本地通過 font creator 查看字體文件信息

字體文件1
字體文件2

可以查看到字體文件的映射關(guān)系是動(dòng)態(tài)的弦聂, 需要解決的就是通過某種方法來找到映射與數(shù)字之間的關(guān)系鸟辅。

4.通過fontTools庫氛什, 將字庫文件轉(zhuǎn)換成xml格式

映射關(guān)系與字體信息
# 將字體文件轉(zhuǎn)換成xml格式可以發(fā)現(xiàn)字體保存的圖行信息是不變的, 變化的是unicode映射
#以此為突破點(diǎn)匪凉, 找到圖形對(duì)應(yīng)的編碼枪眉, 然后再匹配到對(duì)應(yīng)的數(shù)字,以不變應(yīng)萬變再层。
onlineFonts = TTFont('fonts.woff')
onlineFonts.saveXML('test.xml')
注: 此步驟在實(shí)際生產(chǎn)過程中并不需要贸铜, 為了便于理解, 我加上了 

5.通過fontTools庫聂受, 獲取字體信息中不變的部分

baseFonts = TTFont('basefonts.woff') # basefonts.woff 這個(gè)文件是保存在本地的蒿秦, 需要手動(dòng)解析一個(gè)字體庫, 作為不變的部分
base_nums = ['7', '9', '0', '3', '6', '5', '2', '1', '4', '8'] # 基本的數(shù)字表
base_fonts = ['uniF04C', 'uniE374', 'uniF426', 'uniEAAA', 'uniF519', 'uniEEC4', 'uniF543', 'uniF7C7', 'uniF046',
          'uniF08E'] # 基本的映射表 
onlineFonts = TTFont('fonts.woff') # 網(wǎng)絡(luò)上下載的動(dòng)態(tài)的字體文件
uni_list = onlineFonts.getGlyphNames()[1:-1] # 只有中間的部分是數(shù)字
temp = {}
# 解析字體庫
for i in range(10):
    onlineGlyph = onlineFonts['glyf'][uni_list[i]]  # 返回的是unicode對(duì)應(yīng)信息的對(duì)象
    for j in range(10):
        baseGlyph = baseFonts['glyf'][base_fonts[j]]
        if onlineGlyph == baseGlyph:
            temp["&#x" + uni_list[i][3:].lower() + ';'] = base_nums[j]

6.最終結(jié)果展示

最終結(jié)果

參考資料:
知乎作者謝俊杰的文章
fontTools庫詳解
github fonttools庫詳解

本人水平有限蛋济, 如有錯(cuò)誤歡迎提出指正棍鳖!如有參考, 請(qǐng)注明出處M肼谩渡处!禁止抄襲,遇抄必肛K畋佟R教薄!

源碼:

# coding:utf-8

import re
import requests
from fontTools.ttLib import TTFont
from lxml import etree

headers = {
            "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) "
              "Chrome/66.0.3359.139 Safari/537.36 "
    }

index_url = 'http://maoyan.com/'
# 獲取首頁內(nèi)容
response_index = requests.get(index_url, headers=headers).text
index_xml = etree.HTML(response_index)
info_list = index_xml.xpath('//*[@id="app"]/div/div[1]/div[1]/div/div[2]/ul/li[1]/a/div[2]/div//text()')
a = u'電影名稱:%s, 票房總數(shù):%s' % (info_list[1], info_list[4])
print (a)

# 獲取字體文件的url
woff_ = re.search(r"url\('(.*\.woff)'\)", response_index).group(1)
woff_url = 'http:' + woff_
response_woff = requests.get(woff_url, headers=headers).content

with open('fonts.woff', 'wb') as f:
    f.write(response_woff)

#base_nums旧困, base_fonts 需要自己手動(dòng)解析映射關(guān)系醇份, 要和basefonts.woff一致
baseFonts = TTFont('basefonts.woff')
base_nums = ['7', '9', '0', '3', '6', '5', '2', '1', '4', '8']
base_fonts = ['uniF04C', 'uniE374', 'uniF426', 'uniEAAA', 'uniF519', 'uniEEC4', 'uniF543', 'uniF7C7', 'uniF046',
              'uniF08E']
onlineFonts = TTFont('fonts.woff')

# onlineFonts.saveXML('test.xml')

uni_list = onlineFonts.getGlyphNames()[1:-1]
temp = {}
# 解析字體庫
for i in range(10):
    onlineGlyph = onlineFonts['glyf'][uni_list[i]]
    for j in range(10):
        baseGlyph = baseFonts['glyf'][base_fonts[j]]
        if onlineGlyph == baseGlyph:
            temp["&#x" + uni_list[i][3:].lower() + ';'] = base_nums[j]

# 字符替換
pat = '(' + '|'.join(temp.keys()) + ')'
response_index = re.sub(pat, lambda x: temp[x.group()],     response_index)

# 內(nèi)容提取
index_xml = etree.HTML(response_index)
info_list = index_xml.xpath('//*[@id="app"]/div/div[1]/div[1]        /div/div[2]/ul/li[1]/a/div[2]/div//text()')
a = u'電影名稱:%s, 票房總數(shù):%s' % (info_list[1], info_list[4])
print(a)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市叮喳,隨后出現(xiàn)的幾起案子被芳,更是在濱河造成了極大的恐慌缰贝,老刑警劉巖馍悟,帶你破解...
    沈念sama閱讀 210,978評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異剩晴,居然都是意外死亡锣咒,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門赞弥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來毅整,“玉大人,你說我怎么就攤上這事绽左〉考担” “怎么了?”我有些...
    開封第一講書人閱讀 156,623評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵拼窥,是天一觀的道長(zhǎng)戏蔑。 經(jīng)常有香客問我蹋凝,道長(zhǎng),這世上最難降的妖魔是什么总棵? 我笑而不...
    開封第一講書人閱讀 56,324評(píng)論 1 282
  • 正文 為了忘掉前任鳍寂,我火速辦了婚禮,結(jié)果婚禮上情龄,老公的妹妹穿的比我還像新娘迄汛。我一直安慰自己,他們只是感情好骤视,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評(píng)論 5 384
  • 文/花漫 我一把揭開白布鞍爱。 她就那樣靜靜地躺著,像睡著了一般专酗。 火紅的嫁衣襯著肌膚如雪硬霍。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,741評(píng)論 1 289
  • 那天笼裳,我揣著相機(jī)與錄音唯卖,去河邊找鬼。 笑死躬柬,一個(gè)胖子當(dāng)著我的面吹牛拜轨,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播允青,決...
    沈念sama閱讀 38,892評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼橄碾,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了颠锉?” 一聲冷哼從身側(cè)響起法牲,我...
    開封第一講書人閱讀 37,655評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎琼掠,沒想到半個(gè)月后拒垃,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,104評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡瓷蛙,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年悼瓮,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片艰猬。...
    茶點(diǎn)故事閱讀 38,569評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡横堡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出冠桃,到底是詐尸還是另有隱情命贴,我是刑警寧澤,帶...
    沈念sama閱讀 34,254評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站胸蛛,受9級(jí)特大地震影響培己,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜胚泌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評(píng)論 3 312
  • 文/蒙蒙 一省咨、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧玷室,春花似錦零蓉、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至津肛,卻和暖如春章喉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背身坐。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評(píng)論 1 264
  • 我被黑心中介騙來泰國(guó)打工秸脱, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人部蛇。 一個(gè)月前我還...
    沈念sama閱讀 46,260評(píng)論 2 360
  • 正文 我出身青樓摊唇,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親涯鲁。 傳聞我的和親對(duì)象是個(gè)殘疾皇子巷查,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,734評(píng)論 25 707
  • ttf 文件反爬 想寫這篇文章的起源是在一個(gè)技術(shù)群里,有人討論去哪網(wǎng)(手機(jī)端)的反爬:請(qǐng)求下來的數(shù)字跟瀏覽器上的數(shù)...
    董小賤閱讀 12,153評(píng)論 18 15
  • 我不知風(fēng)從哪個(gè)方向吹來抹腿, 送來了一股久違的花香岛请, 我在夢(mèng)中沉醉。 沉醉著警绩,沉醉著崇败, 香味愈來愈淡, 欲隨花香而去房蝉,...
    憶思寒閱讀 215評(píng)論 0 1
  • 當(dāng)那道黑色光影出現(xiàn)時(shí)僚匆,天地間的靈氣仿佛都是咆哮暴動(dòng),一種連天地都為之顫粟的威壓彌漫開來搭幻。在那種威壓之下,這里所有人...
    混沌天書閱讀 924評(píng)論 0 0
  • 多數(shù)情況下逞盆,一個(gè)人損害另一個(gè)人檀蹋,是出于迫不得已,一個(gè)人要發(fā)跡,沒有現(xiàn)成的道路可以走俯逾,必然要踩到別人 要想不這么死贸桶,...
    jesmil閱讀 646評(píng)論 0 1