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

ttf 文件反爬

想寫這篇文章的起源是在一個技術(shù)群里,有人討論去哪網(wǎng)(手機端)的反爬:請求下來的數(shù)字跟瀏覽器上的數(shù)字有規(guī)律的不同蛤售,查看字體文件之后烘豹, 發(fā)現(xiàn)字體文件中的數(shù)字位置顛倒了..., 后有朋友老冀爬取汽車之家精品貼也出現(xiàn)了類似的情況胆敞,不太清楚這種反爬的成本着帽, 但憑直覺將來這種反爬措施可能越來越普遍, 拿汽車之家為例竿秆, 遂記錄之启摄!源碼在最后!幽钢!

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

未顯示正確字體的方框就是改變了編碼格式的字體

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

網(wǎng)頁源碼保存至本地歉备, 顯示的亂碼

3. 通過fontTools進(jìn)行解析字庫文件

# 解析字體庫
font = TTFont('fonts.ttf')
# 讀取字體的映射關(guān)系
uni_list = font['cmap'].tables[0].ttFont.getGlyphOrder() # 參數(shù)'cmap' 表示漢字對應(yīng)的映射 為unicode編碼
print(uni_list)
打印的結(jié)果為:['.notdef', 'uniECD5', 'uniEC83', 'uniED37', 'uniECE5', 'uniED98', 'uniEC58', 'uniEDFA', 'uniECB9', 'uniED6D', 'uniED1B', 'uniEDCE', 'uniED7D', 'uniEC3C', 'uniECEF', 'uniEC9E', 'uniED51', 'uniEE04', 'uniEDB3', 'uniEC72', 'uniEC20', 'uniECD4', 'uniED87', 'uniED35', 'uniEDE9', 'uniECA8', 'uniEC56', 'uniED0A', 'uniECB8', 'uniED6B', 'uniEC2B', 'uniEDCD', 'uniEC8C', 'uniED40', 'uniECEE', 'uniEDA1', 'uniED4F', 'uniEE03', 'uniECC2']
需要注意的是:.notdef 并不是漢字的映射, 而是表示字體家族名稱匪燕。真是數(shù)據(jù)是從下標(biāo) 1 開始蕾羊。

fontTools庫詳解: https://darknode.in/font/font-tools-guide/

4. 將映射列表轉(zhuǎn)換成utf-8的類型
utf_list = [eval(r"u'\u" + x[3:] + "'") for x in uni_list[1:]]

5. 通過軟件查看字庫的對應(yīng)的映射關(guān)系 font creator

查看字庫中的映射關(guān)系
# 得到字符列表
word_list = [u'一', u'七', u'三', u'上', u'下', u'不', u'九', u'了', u'二', u'五', u'低', u'八', u'六',
             u'十', u'的', u'著', u'近', u'遠(yuǎn)', u'長', u'右', u'呢', u'和', u'四', u'地', u'壞', u'多',
             u'大', u'好', u'小', u'少', u'短', u'矮', u'高', u'左', u'很', u'得', u'是', u'更']
參考資料:

知乎作者謝俊杰的文章
fontTools庫詳解
github fonttools庫詳解

總注:汽車之家的字庫對應(yīng)的字形順序是不變的,只有映射的unicode的編碼在改變帽驯, 用這種方法是可以處理的龟再。 但應(yīng)對unicode編碼在變, 字形的順序也在改變尼变, 這種方法是無法解決的利凑。具體的處理辦法, 將在下一篇文中介紹嫌术。

本人水平有限哀澈, 如有錯誤歡迎提出指正!如有參考度气, 請注明出處8畎础!禁止抄襲磷籍,遇抄必肛J嗜佟!院领!

源碼:

# coding:utf-8
import re
import requests
from lxml import etree
from fontTools.ttLib import TTFont

headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 "
              "Safari/537.36 "
}

url = 'https://club.autohome.com.cn/bbs/thread/1d0784305887ec3f/72381110-1.html#pvareaid=102410'

# 請求內(nèi)容
response = requests.get(url, headers=headers)
response_html = response.content.decode('gbk')

# xpath 獲取帖子內(nèi)容
response_xml = etree.HTML(response_html)
content_list = response_xml.xpath('//div[@xname="content"]//div[@class="tz-paragraph"]//text()')
content_str = ''.join(content_list)
print(content_str)

# 獲取字體的連接文件
fonts_ = re.search(r",url\('(//.*\.ttf)?'\) format",response_html).group(1)

# 請求字體文件弛矛, 字體文件是動態(tài)更新的
fonts_url = 'https:'+fonts_
response = requests.get(fonts_url, headers=headers).content
# 講字體文件保存到本地
with open('fonts.ttf', 'wb') as f:
    f.write(response)

# 解析字體庫
font = TTFont('fonts.ttf')

# 讀取字體的映射關(guān)系
uni_list = font['cmap'].tables[0].ttFont.getGlyphOrder()

# 轉(zhuǎn)換格式
utf_list = [eval(r"u'\u" + x[3:] + "'") for x in uni_list[1:]]

# 被替換的字體的列表
word_list = [u'一', u'七', u'三', u'上', u'下', u'不', u'九', u'了', u'二', u'五', u'低', u'八', u'六',
         u'十', u'的', u'著', u'近', u'遠(yuǎn)', u'長', u'右', u'呢', u'和', u'四', u'地', u'壞', u'多',
         u'大', u'好', u'小', u'少', u'短', u'矮', u'高', u'左', u'很', u'得', u'是', u'更']
#遍歷需要被替換的字符
for i in range(len(utf_list)):
    content_str = content_str.replace(utf_list[i], word_list[i])

print (content_str)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市栅盲,隨后出現(xiàn)的幾起案子汪诉,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件扒寄,死亡現(xiàn)場離奇詭異鱼鼓,居然都是意外死亡,警方通過查閱死者的電腦和手機该编,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進(jìn)店門迄本,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人课竣,你說我怎么就攤上這事嘉赎。” “怎么了于樟?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵公条,是天一觀的道長。 經(jīng)常有香客問我迂曲,道長靶橱,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任路捧,我火速辦了婚禮关霸,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘杰扫。我一直安慰自己队寇,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布章姓。 她就那樣靜靜地躺著佳遣,像睡著了一般。 火紅的嫁衣襯著肌膚如雪凡伊。 梳的紋絲不亂的頭發(fā)上苍日,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天,我揣著相機與錄音窗声,去河邊找鬼。 笑死辜纲,一個胖子當(dāng)著我的面吹牛笨觅,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播耕腾,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼见剩,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了扫俺?” 一聲冷哼從身側(cè)響起苍苞,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后羹呵,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體骂际,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年冈欢,在試婚紗的時候發(fā)現(xiàn)自己被綠了歉铝。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡凑耻,死狀恐怖太示,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情香浩,我是刑警寧澤类缤,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站邻吭,受9級特大地震影響餐弱,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜镜盯,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一岸裙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧速缆,春花似錦降允、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至破停,卻和暖如春翅楼,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背真慢。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工毅臊, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人黑界。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓管嬉,卻偏偏與公主長得像,于是被迫代替她去往敵國和親朗鸠。 傳聞我的和親對象是個殘疾皇子蚯撩,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,864評論 2 354

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