字體反爬之58同城求職簡歷數據抓取

一直想寫一篇關于字體反爬的文章,但是由于時間問題一直拖到現在,字體反爬的網站有很多比如貓眼電影專業版、汽車之家、58同城、大眾點評等,今天我就拿58同城試刀,當然58同城不止求職簡歷才有字體反爬,比如租房模塊也有,大家有空可以自己去研究。

目標

抓取58同城深圳地區的簡歷信息,由于此次主要是為了破解字體反爬,而且簡歷信息只有姓名、性別、年齡、工作經驗、學歷才有字體反爬,所有我們只抓這幾個信息,并且時間問題我們只抓取第一頁


抓取目標

目標分析

首先用瀏覽器對頁面進行抓包分析,找到信息所在的文件:

抓包

通過抓包發現信息就在當前頁面,并沒有JS加載渲染以及Ajax異步加載,既然找到了信息的地方,那我們先檢查一下我們要抓取的信息:
Elements檢查

一檢查就傻眼了,發現我們要抓取的信息全部都亂碼了,我們再查看一下網頁源代碼:
網頁源代碼

我們發現有一些字被編碼了,這到底是怎么回事呢?其實這就是我們今天要講的字體反爬,網站采用了自定義的字體文件,通過字體映射然后在瀏覽器上正常顯示,但是爬蟲抓取下來的數據要么就是亂碼,要么就是變成其他字符,那么知道了字體反爬的原理,我們就要找到字體文件,字體文件在哪里呢?字體文件一般抓包的時候可以抓到或者定義到了頁面里:
Font抓包的字體文件

網頁源代碼中的字體文件

可以看到兩個地方都找到了字體文件,而且我們發現字體文件進行了base64編碼,我們直接把字體文件下載下來,然后用百度的FontEditor工具來查看字體文件:
FontEditor查看字體文件

網頁源代碼中的編碼

頁面顯示的內容

查看字體文件字體對應的編碼然后把它們帶入到網頁源代碼中的編碼,你會發現居然還原了內容,看到這里你也許會說這還不簡單,我把這些字和編碼組成對應的映射集合,然后每次抓取的數據按照這個映射集合來替換不就是了,確實可以這樣,但是如果你刷新頁面后,你再看網頁源代碼中的編碼和字體文件,你會發現字體文件對應的編碼變了:
刷新后的字體文件

我們發現字體文件對應的編碼變了,但是所有的字沒有變,那我們該怎么辦呢?這是就要用到Python里面的字體庫Font-Tools了。

字體庫Font-Tools介紹

Font-Tools?是一套以?ttx?為核心的工具集,用于處理與字體編輯有關的各種問題,程序用?Python?編寫完成,代碼開源,具有良好的跨平臺性。Font-Tools?由以下?4?個程序組成:

  • ttx?可將字體文件與?xml?文件進行雙向轉換
  • pyft-merge?可將數個字體文件合并成為一個字體文件
  • pyft-sub-set?可產生一個由字體的指定字符組成的子集
  • pyftin-spect?可顯示字體文件的二進制組成信息

Font-Tools?原本是托管在?Source-forge?上的項目,由于原項目長期停滯,Be-hdad?在?Github?上?fork?并繼續進行開發。由于?Font-Tools?基于?Python?寫成,在安裝?Font-Tools?之前需要首先安裝?Python。

字體庫Font-Tools基本使用

  1. TTFont()用于打開本地字體文件
from fontTools.ttLib import TTFont
 
# 可以是.ttf類型的字體文件也可以是.woff類型的字體文件
# font=TTFont('58.ttf')
font=TTFont('58.woff')
  1. coordinates用于獲取字體坐標
from fontTools.ttLib import TTFont
 
font=TTFont('58.woff')
# 獲取編碼為uniE0AC的字體的坐標
x_y = font['glyf']['uniE0AC'].coordinates
  1. saveXML()將ttf文件或woff文件轉化成xml格式并保存到本地,主要是方便查看內部數據結構

from fontTools.ttLib import TTFont
 
font=TTFont('58.woff')   
font.saveXML('58.xml')

把字體文件轉化成xml格式,以便打開查看里面的數據結構。打開xml文件可以看到類似html標簽的結構:

XML結構

而對我們有用的是<GlyphOrder>標簽對象glyf標簽對象
<GlyphOrder>標簽對象

點開標簽內部,<GlyphOrder...>內包含著所有編碼信息,注意前兩個是不是0-9的編碼,需要去除。
glyf標簽對象

<glyf...> 內包含著每一個字符對象<TTGlyph>,同樣第一個和最后一個不是0-9的字符,需要去除。點開<TTGlyph>對象,里面的信息如下,是一些坐標點的信息,可以想到這些點應該是描繪字體形狀的,而且我們發現不同的字體文件雖然編碼不一樣,但是只要它們對應的文字一樣,所以我們可以在<TTGlyph>對象里找出坐標規律,這就是我們破解字體反爬的關鍵所在。

破解思路

先在本地保存一份字體文件58.woff,并通過FontEditor工具確認編碼和數字的對應關系,保存到字典中。然后重新訪問網頁的時候,把網頁中新的字體文件也下載保存到本地58tc.woff。先獲取58tc.woff中的<GlyphID...>里的編碼name的值(uni編碼),再通過uni的對象獲取其對應的TTGlyph對象的坐標,然后取前2個計算差值,與58.woff中的每一個TTGlyph對象的坐標差值相減注逐一判斷是否等于0,再根據TTGlyph對象對應的編碼,在字典中找到對應的數字。

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

url = "https://sz.58.com/searchjob/"


headers = {
    'user-agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
                  "Chrome/73.0.3683.86 Safari/537.36",
    }

response = requests.get(url, headers=headers)
html = etree.HTML(response.text)
font_face = html.xpath('//head/style[1]/text()')[0].strip()
# 提前字體文件
base64_code = re.findall(r"base64,(.*?)\)",font_face)
if len(base64_code)!=0:
    base64_code = base64_code[0]
woff = base64.b64decode(base64_code)
# base64 寫入字體文件58tc.woff中,一定要wb方式寫入,每次運行代碼會覆蓋文件
with open("58tc.woff","wb") as f:
    f.write(woff)

# 打開下載保存好的新字體文件58tc.woff
font = TTFont('58tc.woff')
# 打開本地保存的基本字體文件58.woff
base_font = TTFont("58.woff")

# getGlyphNames()[1:-1]和getGlyphOrder()[2:]結果是一樣的
# uni_list = font.getGlyphNames()[1:-1]
uni_list = font.getGlyphOrder()[2:]

# 定義一個臨時存儲新字體文件映射關系的字典temp
temp = {}
# 把本地字體文件的映射關系用base_uni和base_value兩個列表映射保存
base_uni = [
            'uniE0AC', 'uniE0D6', 'uniE189', 'uniE19A', 'uniE1BC', 'uniE441', 'uniE47A', 'uniE4BE', 'uniE4F1',
            'uniE587', 'uniE5B0', 'uniE5CE', 'uniE615', 'uniE632', 'uniE701', 'uniE87F', 'uniEAC1', 'uniEAF9',
            'uniEB60', 'uniEB96', 'uniEBB0', 'uniEC03', 'uniEF5F', 'uniEF8B', 'uniF037', 'uniF076', 'uniF0A0',
            'uniF13A', 'uniF14D', 'uniF1DB', 'uniF264', 'uniF2D1', 'uniF31A', 'uniF386', 'uniF406', 'uniF46B',
            'uniF49A', 'uniF4DB', 'uniF5F0', 'uniF607', 'uniF62A', 'uniF6E6', 'uniF772', 'uniF787', 'uniF7B9'
]
base_value =[
             '7', '下', '王', '周', '專', '0', '女', '博', '楊', '李', '校', '技', '屆', '8', '男', '科', '中',
             '趙', '生', 'M', '9', '以', '經', '6', '陳', 'A', '驗', '黃', 'B', '5', '士', '1', '張', '碩', '4',
             '高', '無', '大', '吳', 'E', '應', '3', '2', '本', '劉'
]
# 循環對比
for i in range(len(base_uni)):
    # 編碼字體坐標轉化成了列表,列表里是一個個元組,元組里放的是(x,y)坐標
    new_glyph = list(font['glyf'][uni_list[i]].coordinates)
    # 用前兩個坐標作為取差值
    new_glyph_difference = [abs(k[0] - k[1]) for k in new_glyph[:2]]
    for j in range(len(base_uni)):
        base_glyph = list(base_font['glyf'][base_uni[j]].coordinates)
        base_glyph_difference = [abs(n[0] - n[1]) for n in base_glyph[:2]]
        # 比較兩個差值是否為0
        if int(abs(sum(new_glyph_difference) / len(new_glyph_difference)-sum(base_glyph_difference) / len(base_glyph_difference))) == 0:
            # 把編碼去掉uni三個字符然后轉換成全小寫,再拼接成網頁源代碼一樣的編碼格式,最后把映射關系存儲到temp字典中
            temp["&#x" + uni_list[i][3:].lower() + ';'] = base_value[j]

# 構造正則表達式用|匹配左右任意一個表達式,替換編碼
re_rule = '(' + '|'.join(temp.keys()) + ')'
# 把所有的編碼替換成文字
response_data = re.sub(re_rule, lambda x: temp[x.group()], response.text)
data = etree.HTML(response_data)
personal_information = data .xpath('//div[@id="infolist"]/ul/li//dl[@class="infocardMessage clearfix"]')
for info in personal_information:
    # 姓名
    name = info.xpath('./dd//span[@class="infocardName fl stonefont resumeName"]/text()')[0]
    # 性別
    gender = info.xpath('./dd//div[@ class="infocardBasic fl"]/div/em[1]/text()')[0]
    # 年齡
    age = info.xpath('./dd//div[@ class="infocardBasic fl"]/div/em[2]/text()')[0]
    工作經驗

    work_experiences = info.xpath('./dd//div[@ class="infocardBasic fl"]/div/em[3]/text()')
    if work_experiences == []:
        work_experience = ""
    else:
        work_experience = info.xpath('./dd//div[@ class="infocardBasic fl"]/div/em[3]/text()')[0]
    # 學歷
    educations = info.xpath('./dd//div[@ class="infocardBasic fl"]/div/em[4]/text()')
    if educations == []:
        education = ""
    else:
        education = info.xpath('./dd//div[@ class="infocardBasic fl"]/div/em[4]/text()')[0]
    print(name, gender, age, work_experience, education)

結果

運行結果

下面是58.woff文件的下載地址,直接復制這個地址到瀏覽器下載,下載好放到項目目錄同級下并改名為58.woff

58.woff文件:data:application/font-woff;charset=utf-8;base64,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

總結

  • 字體反爬的關鍵在于字體文件轉換成xml文件,雖然編碼變了但是中間的規律就是我們破解的依據
  • 如果字體和編碼都會發生變化的字體反爬,那么這種方式就不適合,只能使用OCR來識別文字與編碼
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,327評論 6 537
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,996評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,316評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,406評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,128評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,524評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,576評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,759評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,310評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,065評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,249評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,821評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,479評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,909評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,140評論 1 290
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,984評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,228評論 2 375

推薦閱讀更多精彩內容

  • 一、字體反爬的概述 目前字體反爬的網站是貓眼,汽車之家,天眼查,起點中文網,58同城等等。還有:https://w...
    夢捷者閱讀 859評論 0 1
  • 最近興致上來,就想更換了那Blog標題字體(漢字的);網上搜索了一番,發現蘇新詩柳繁體這款甚合我心;然后就著手搞將...
    晚晴幽草閱讀 2,406評論 1 8
  • 我用眼睛看,雖然看不到心靈的惡與善。但懂得藍天下有這剎那的風景作伴。所以,我不會放棄屬于自己的那份態度。讓一切渾濁...
    不俗小七閱讀 522評論 14 31
  • 看過年會之后,感受最大的是自己的激情都去哪兒了?
    TechLeap閱讀 286評論 0 0