
作者:Python進階者
來源:Python爬蟲與數據挖掘
今天給大家帶來干貨,JS逆向。
網站的反爬措施有很多,例如:js反爬、ip反爬、css反爬、字體反爬、驗證碼反爬、滑動點擊類驗證反爬等等,今天我們通過爬取某招聘來實戰學習字體反爬。
小編已加密:
aHR0cHM6Ly93d3cuc2hpeGlzZW5nLmNvbS8= 出于安全原因,我們把網址通過base64編碼了,大家可以通過base64解碼把網址獲取下來。
字體反爬:一種常見的反爬技術,是網頁與前端字體文件配合完成的反爬策略,最早使用字體反爬技術的有58同城、汽車之家等等,現在很多主流的網站或APP也使用字體反爬技術為自身的網站或APP增加一種反爬措施。
字體反爬原理:通過自定義的字體來替換頁面中某些數據,當我們不使用正確的解碼方式就無法獲取正確的數據內容。
在HTML中通過@font-face來使用自定義字體,如下圖所示:
其語法格式為:
@font-face{ font-family:"名字"; src:url('字體文件鏈接'); url('字體文件鏈接')format('文件類型')
}
字體文件一般是ttf類型、eot類型、woff類型,woff類型的文件運用比較廣泛,所以大家一般碰到的都是woff類型的文件。
以woff類型文件為例,其內容是怎樣的呢,又是以什么編碼方式使得數據與代碼一一對應的呢?
我們以某招聘網站的字體文件為例,進入百度字體編譯器并打開字體文件,如下圖所示:
隨機打開一個字體,如下圖所示:
可以發現字體6放在一個平面坐標里面,根據平面坐標的每個點來得出字體6的編碼,這里就不解釋如何得出字體6的編碼了。
如何解決字體反爬呢?
首先映射關系可以看作為字典,大致有兩種常用的方法:
第一種:手動把一組編碼和字符的對應關系提取出來并用字典的形式展示,代碼如下所示:
replace_dict={ '0xf7ce':'1', '0xf324':'2', '0xf23e':'3',
....... '0xfe43':'n',
} for key in replace_dict:
數據=數據.replace(key,replace_dict[key])
首先定義字體與其對應的代碼一一對應的字典,再通過for循環把數據一一替換。
注意:這種方法主要適用于字體映射少的數據。
第二種:首先下載網站的字體文件,再把字體文件轉換為XML文件,找到里面的字體映射關系的代碼,通過decode函數解碼,然后將解碼的代碼組合成一個字典,再根據字典內容將數據一一替換,由于代碼比較長,這里就不寫示例代碼了,待會在實戰演練中會展示這種方法的代碼。
好了,字體反爬就簡單講到這里,接下來我們正式爬取某招聘網站。
首先進入某招聘網并打開開發者模式,如下圖所示:
這里我們看到代碼中只有生字不能正常函數,而是用來代碼來替代,初步判定為使用了自定義的字體文件,這時就要找到字體文件了,那么字體文件在哪里找呢,首先打開開發者模式,并點擊Network選項,如下圖所示:
一般情況下,字體文件放在Font選卡中,我們發現這里一共有5個條目,那么哪個是自定義字體文件的條目呢,當我們每次點擊下一頁的時候,自定義字體文件就會執行一次,這時我們只需要點擊網頁中的下一頁即可,如下圖所示:
可以看到多了一個以file開頭的條目,這時可以初步判定該文件為自定義字體文件,現在我們把它下載下來,下載方式很簡單,只需要把file開頭的條目的URL復制并在網頁上打開即可,下載下來后在百度字體編譯器打開,如下圖所示:
這時發現打開不了,是不是找錯了字體文件,網站提示說不支持這種文件類型,那么我們把下載的文件后綴改為.woff在打開試試,如下圖所示:
這時就成功打開了。
找到自定義字體文件了,那么我們該怎么利用呢?這時我們先自定義方法get_fontfile()來處理自定義字體文件,然后在通過兩步來把字體文件中的映射關系通過字典的方式展示出來。
首先自定義字體文件更新頻率是很高的,這時我們可以實時獲取網頁的自定義字體文件來防止利用了之前的自定義字體文件從而導致獲取數據不準確。首先觀察自定義字體文件的url鏈接:
https://www.xxxxxx.com/interns/iconfonts/file?rand=0.2254193167485603 https://www.xxxxxx.com/interns/iconfonts/file?rand=0.4313944100724574 https://www.xxxxxx.com/interns/iconfonts/file?rand=0.3615862774301839
可以發現自定義字體文件的URL只有rand這個參數發生變化,而且是隨機的十六位小于1的浮點數,那么我們只需要構造rand參數即可,主要代碼如下所示:
def get_fontfile(): rand=round(random.uniform(0,1),17)
url=f'https://www.xxxxxx.com/interns/iconfonts/file?rand={rand}' response=requests.get(url,headers=headers).content with open('file.woff','wb')as f:
f.write(response)
font = TTFont('file.woff')
font.saveXML('file.xml')
首先通過random.uniform()方法來控制隨機數的大小,再通過round()方法控制隨機數的位數,這樣就可以得到rand的值,再通過.content把URL響應內容轉換為二進制并寫入file.woff文件中,在通過TTFont()方法獲取文件內容,通過saveXML方法把內容保存為xml文件。xml文件內容如下圖所示:
該字體.xml文件一共有4589行那么多,哪個部分才是字體映射關系的代碼部分呢?
首先我們看回在百度字體編碼器的內容,如下圖所示:
漢字人對應的代碼為f0e2,那么我們就在字體.xml文件中查詢人的代碼,如下圖所示:
可以發現一共有4個結果,但仔細觀察每個結果都相同,這時我們可以根據它們代碼規律來獲取映射關系,再通過解碼來獲取對應的數據值,最后以字典的形式展示,主要代碼如下所示:
with open('file.xml') as f: xml = f.read() keys = re.findall('', xml) values = re.findall('', xml) for i in range(len(values)): if len(values[i]) < 4: values[i] = ('u00' + values[i]).encode('utf-8').decode('unicode_escape') else: values[i] = ('u' + values[i]).encode('utf-8').decode('unicode_escape')
word_dict = dict(zip(keys, values))
首先讀取file.xml文件內容,找出把代碼中的code、name的值并分別設置為keys鍵,values值,再通過for循環把values的值解碼為我們想要的數據,最后通過zip()方法合并為一個元組并通過dict()方法轉換為字典數據,運行結果如圖所示:
在上一步中,我們成功把字體映射關系轉換為字典數據了,接下來開始發出網絡請求來獲取數據,主要代碼如下所示:
def get_data(dict,url):
response=requests.get(url,headers=headers).text.replace('&#','0') for key in dict: response=response.replace(key,dict[key])
XPATH=parsel.Selector(response)
datas=XPATH.xpath('//*[@id="__layout"]/div/div[2]/div[2]/div[1]/div[1]/div[1]/div') for i in datas: data={ 'workname':i.xpath('./div[1]/div[1]/p[1]/a/text()').extract_first(), 'link':i.xpath('./div[1]/div[1]/p[1]/a/@href').extract_first(), 'salary':i.xpath('./div[1]/div[1]/p[1]/span/text()').extract_first(), 'place':i.xpath('./div[1]/div[1]/p[2]/span[1]/text()').extract_first(), 'work_time':i.xpath('./div[1]/div[1]/p[2]/span[3]/text()').extract_first()+i.xpath('./div[1]/div[1]/p[2]/span[5]/text()').extract_first(), 'company_name':i.xpath('./div[1]/div[2]/p[1]/a/text()').extract_first(), 'Field_scale':i.xpath('./div[1]/div[2]/p[2]/span[1]/text()').extract_first()+i.xpath('./div[1]/div[2]/p[2]/span[3]/text()').extract_first(), 'advantage': ','.join(i.xpath('./div[2]/div[1]/span/text()').extract()), 'welfare':','.join(i.xpath('./div[2]/div[2]/span/text()').extract())
}
saving_data(list(data.values()))
首先自定義方法get_data()并接收字體映射關系的字典數據,再通過for循環將字典內容與數據一一替換,最后通過xpath()來提取我們想要的數據,最后把數據傳入我們自定義方法saving_data()中。
數據已經獲取下來了,接下來將保存數據,主要代碼如下所示:
def saving_data(data): db = pymysql.connect(host=host, user=user, password=passwd, port=port, db='recruit')
cursor = db.cursor()
sql = 'insert into recruit_data(work_name, link, salary, place, work_time,company_name,Field_scale,advantage,welfare) values(%s,%s,%s,%s,%s,%s,%s,%s,%s)' try:
cursor.execute(sql,data)
db.commit() except:
db.rollback()
db.close()
好了,程序已經寫得差不多了,接下來將編寫代碼運行程序,主要代碼如下所示:
if __name__ == '__main__':
create_db()
get_fontfile() for i in range(1,3):
url=f'https://www.xxxxxx.com/interns?page={i}&type=intern&salary=-0&city=%E5%85%A8%E5%9B%BD' get_data(get_dict(),url)
好了,學習字體反爬并爬取某招聘就講到這里了?。?!
數據分析咨詢請掃描二維碼
若不方便掃碼,搜微信號:CDAshujufenxi
CDA數據分析師證書考試體系(更新于2025年05月22日)
2025-05-26解碼數據基因:從數字敏感度到邏輯思維 每當看到超市貨架上商品的排列變化,你是否會聯想到背后的銷售數據波動?三年前在零售行 ...
2025-05-23在本文中,我們將探討 AI 為何能夠加速數據分析、如何在每個步驟中實現數據分析自動化以及使用哪些工具。 數據分析中的AI是什么 ...
2025-05-20當數據遇見人生:我的第一個分析項目 記得三年前接手第一個數據分析項目時,我面對Excel里密密麻麻的銷售數據手足無措。那些跳動 ...
2025-05-20在數字化運營的時代,企業每天都在產生海量數據:用戶點擊行為、商品銷售記錄、廣告投放反饋…… 這些數據就像散落的拼圖,而相 ...
2025-05-19在當今數字化營銷時代,小紅書作為國內領先的社交電商平臺,其銷售數據蘊含著巨大的商業價值。通過對小紅書銷售數據的深入分析, ...
2025-05-16Excel作為最常用的數據分析工具,有沒有什么工具可以幫助我們快速地使用excel表格,只要輕松幾步甚至輸入幾項指令就能搞定呢? ...
2025-05-15數據,如同無形的燃料,驅動著現代社會的運轉。從全球互聯網用戶每天產生的2.5億TB數據,到制造業的傳感器、金融交易 ...
2025-05-15大數據是什么_數據分析師培訓 其實,現在的大數據指的并不僅僅是海量數據,更準確而言是對大數據分析的方法。傳統的數 ...
2025-05-14CDA持證人簡介: 萬木,CDA L1持證人,某電商中廠BI工程師 ,5年數據經驗1年BI內訓師,高級數據分析師,擁有豐富的行業經驗。 ...
2025-05-13CDA持證人簡介: 王明月 ,CDA 數據分析師二級持證人,2年數據產品工作經驗,管理學博士在讀。 學習入口:https://edu.cda.cn/g ...
2025-05-12CDA持證人簡介: 楊貞璽 ,CDA一級持證人,鄭州大學情報學碩士研究生,某上市公司數據分析師。 學習入口:https://edu.cda.cn/g ...
2025-05-09CDA持證人簡介 程靖 CDA會員大咖,暢銷書《小白學產品》作者,13年頂級互聯網公司產品經理相關經驗,曾在百度、美團、阿里等 ...
2025-05-07相信很多做數據分析的小伙伴,都接到過一些高階的數據分析需求,實現的過程需要用到一些數據獲取,數據清洗轉換,建模方法等,這 ...
2025-05-06以下的文章內容來源于劉靜老師的專欄,如果您想閱讀專欄《10大業務分析模型突破業務瓶頸》,點擊下方鏈接 https://edu.cda.cn/g ...
2025-04-30CDA持證人簡介: 邱立峰 CDA 數據分析師二級持證人,數字化轉型專家,數據治理專家,高級數據分析師,擁有豐富的行業經驗。 ...
2025-04-29CDA持證人簡介: 程靖 CDA會員大咖,暢銷書《小白學產品》作者,13年頂級互聯網公司產品經理相關經驗,曾在百度,美團,阿里等 ...
2025-04-28CDA持證人簡介: 居瑜 ,CDA一級持證人國企財務經理,13年財務管理運營經驗,在數據分析就業和實踐經驗方面有著豐富的積累和經 ...
2025-04-27數據分析在當今信息時代發揮著重要作用。單因素方差分析(One-Way ANOVA)是一種關鍵的統計方法,用于比較三個或更多獨立樣本組 ...
2025-04-25CDA持證人簡介: 居瑜 ,CDA一級持證人國企財務經理,13年財務管理運營經驗,在數據分析就業和實踐經驗方面有著豐富的積累和經 ...
2025-04-25