攔截網(wǎng)絡(luò)爬蟲流量技術(shù)的應(yīng)用研究
一、Headers頭部校驗
網(wǎng)絡(luò)爬蟲的本質(zhì)是對網(wǎng)絡(luò)請求的模擬。腳本要發(fā)送請求,就需要構(gòu)造請求頭部,這個請求頭部通常被稱為Headers。Headers頭部校驗指的是服務(wù)器對HTTP請求報文中請求頭鍵值對的檢測。檢測的鍵值對主要有三個:
(1) User-Agent:檢測請求者的用戶代理,此項缺失則判定為機(jī)器人。
(2) Referer:檢測請求者是否以正常途徑跳轉(zhuǎn)到本頁面,常用于防盜鏈技術(shù)。
(3) Cookie:檢測請求者身份狀態(tài),在需要登錄才能訪問的網(wǎng)站通常需要攜帶。
要應(yīng)對這類Headers頭部檢測非常容易,只需要在使用瀏覽器訪問頁面后進(jìn)行抓包觀察,大多數(shù)情況下直接復(fù)制請求頭中的內(nèi)容即可。值得注意的是,在需要登錄才能訪問的頁面,其中的Cookie是有時效性的,需要及時更新。在一些安全防護(hù)較好的網(wǎng)站,Headers頭部中也會額外加入一些本地JS運行后計算出的加密參數(shù)。
二、IP地址記錄
對于IP地址的記錄,主要是針對惡意爬蟲,防止其在短時間內(nèi)大量發(fā)起HTTP請求訪問網(wǎng)站,造成網(wǎng)站資源的侵占。這種反爬蟲手段原理就是檢測異常訪問用戶,如果有請求在短時間(例如3秒)內(nèi)連續(xù)訪問網(wǎng)站高達(dá)數(shù)十次,則會進(jìn)行IP記錄,將其判定為機(jī)器人,在該IP地址的HTTP請求再次發(fā)來的時候,服務(wù)器就回復(fù)狀態(tài)碼403 Forbidden,禁止該請求的繼續(xù)訪問,這種防護(hù)手段的優(yōu)點很明顯,缺陷也很明顯,那就是一刀切容易誤傷人類用戶。
此種反爬蟲手段的應(yīng)對需要爬蟲開發(fā)者盡量減緩HTTP請求間隔,以求達(dá)到和正常人類訪問頁面相似的速度,避免被算法檢測?;蛘呖梢越P代理池,也可以購買代理商IP,如圖1所示:
圖1快代理IP頁面
在進(jìn)行HTTP請求的時候使用代理IP訪問,本地IP就會被隱藏在代理之后,即便被算法檢測,也只需要更換新的IP地址。
三、Ajax異步加載
Ajax(Asynchronous JS And XML,異步JS和XML)是一種創(chuàng)建交互式網(wǎng)頁應(yīng)用的網(wǎng)頁開發(fā)技術(shù),簡單來說,就是在瀏覽一個界面的時候,URL地址本身沒有發(fā)生改變,頁面內(nèi)容卻發(fā)生了動態(tài)更新,如圖2所示,網(wǎng)頁端里百度圖片的瀑布流加載即使用了Ajax。
圖2 百度圖片抓包
這個時候,直接使用GET請求去獲取頁面內(nèi)容是定位不到具體內(nèi)容的,因為它的獲取一般是經(jīng)由數(shù)據(jù)接口進(jìn)行返回的。
嚴(yán)格來說,這并不算是一種反爬蟲技術(shù),但是運用Ajax之后,爬蟲開發(fā)者需要在網(wǎng)絡(luò)請求包中去自行選擇數(shù)據(jù)包才可以,而不是可以簡單通過GET頁面源代碼來編寫爬蟲。面對此類技術(shù),只需要進(jìn)行網(wǎng)頁抓包,在大量的數(shù)據(jù)包中尋找到真正包含網(wǎng)頁內(nèi)容的數(shù)據(jù)接口即可。因為數(shù)據(jù)如果要渲染到頁面,就一定會有數(shù)據(jù)包將其傳輸?shù)娇蛻舳耍_發(fā)者要做的只是將它找出來。一般而言,此類技術(shù)進(jìn)行數(shù)據(jù)傳輸返回的結(jié)果都是JSON格式的,所以需要用JSON包進(jìn)行數(shù)據(jù)解析。
四、字體反爬蟲
不同于一般的反爬蟲思路,字體反爬蟲主要在數(shù)據(jù)上做手腳。要獲取的網(wǎng)頁數(shù)據(jù)在瀏覽器中可以正常查看,但是在將其復(fù)制到本地后就會得到亂碼。它的原理是網(wǎng)站自己自定義創(chuàng)造了一套字體,構(gòu)建映射關(guān)系后將其添加到了css的font中,在瀏覽器中查看的時候,網(wǎng)站會自動獲取這些文件,從而建立對應(yīng)關(guān)系映射得到字符。而爬蟲開發(fā)者在編寫網(wǎng)絡(luò)爬蟲的時候,往往只會請求網(wǎng)頁的URL地址,這就造成了映射文件的空缺,沒有字符集能夠解析這些字符,導(dǎo)致亂碼問題。如圖3所示,實習(xí)僧網(wǎng)頁端使用了自定制的字體文件。
圖3 實習(xí)僧字體反爬蟲
字體反爬蟲的突破有兩種方法,第一種方法是找到font文件的URL請求地址,將其下載到本地后使用xml解析工具解析出來,然后就可以根據(jù)其中的字符對應(yīng)關(guān)系,建立本地映射進(jìn)行字符替換。第二種方法是直接手動復(fù)制其中的加密字符,在本地通過encode編碼后得到對應(yīng)編碼,建立自己的本地映射字典,然后進(jìn)行字符爬取替換。之所以可以使用第二種方法,是因為字體反爬蟲的加密字符通常不會很多,大多是對阿拉伯?dāng)?shù)字和部分網(wǎng)站常用漢字進(jìn)行加密,所以可以直接人工復(fù)制進(jìn)行編碼映射。
五、驗證碼反爬蟲
如今的互聯(lián)網(wǎng)惡意爬蟲橫行,上述的反爬蟲手段雖然可行,但是被惡意爬蟲突破也很容易。為了應(yīng)對這種情況就誕生了驗證碼,從最開始的英數(shù)驗證碼到如今的圖片點選驗證碼,驗證碼技術(shù)在不斷更新迭代,未來也會出現(xiàn)更多類型的驗證碼。驗證碼的防護(hù)主要在兩個階段,第一個階段是登錄注冊階段,第二個階段是訪問頁面階段,前者是為了將惡意爬蟲攔在門外,讓人類用戶進(jìn)入,后者是為了清理那些突破了登錄注冊階段,進(jìn)入頁面爬取的惡意爬蟲,如果服務(wù)器檢測到某IP地址在短時間內(nèi)大量訪問,不會直接封禁用戶,而是出現(xiàn)驗證碼,這樣就避免了對用戶的誤傷,不是一刀切,更加人性化。如果是人類用戶自然可以通過這些點選識別的驗證碼,但如果是機(jī)器人就很難突破這第二道關(guān)卡,如圖4所示的圖片點選驗證碼。
圖4 圖片點選驗證碼
這類反爬蟲手段的應(yīng)對主要是對接各大驗證碼識別平臺或者是通過訓(xùn)練深度學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)模型,讓模型幫助爬蟲程序過掉驗證碼。而且如今深度學(xué)習(xí)框架盛行,訓(xùn)練模型早已不是難事,單純的驗證碼識別已經(jīng)攔不住搭配了深度學(xué)習(xí)模型的網(wǎng)絡(luò)爬蟲,所以網(wǎng)站開發(fā)者會在驗證碼識別背后再加上較復(fù)雜的JS參數(shù)加密,即便驗證碼被識別,也很難構(gòu)造出最終的加密結(jié)果來,這樣就提高了破解門檻。不過使用特殊的測試工具,例如selenium,可以直接搭配訓(xùn)練模型模擬人類行為過掉驗證碼,免去破解JS加密參數(shù)的煩惱。不過自動化的測試工具存在著明顯的特征,個別網(wǎng)站會在JS文件中添加對自動化軟件特征的識別,從而拒絕服務(wù)。
六、JavaScript參數(shù)加密
JavaScript(以下簡稱JS)參數(shù)加密常見于POST表單提交的情形里,主要是為了防范惡意機(jī)器人批量注冊與模擬登錄等行為。如果對POST表單進(jìn)行抓包的話,會發(fā)現(xiàn)自己在表單里輸入的數(shù)據(jù)被加密為了不可知的字符串,這主要是通過加載網(wǎng)站的本地JS腳本實現(xiàn)的。
對于這類反爬蟲的應(yīng)對,除了熟悉調(diào)試技巧外,還需要讀者有較扎實的JS語言基礎(chǔ),因為此類加密的破解通常需要開發(fā)者能夠讀懂目標(biāo)網(wǎng)站的JS加密腳本,并進(jìn)行一系列的刪改操作,用靜態(tài)分析逐步從龐大的JS腳本中將具體的加密函數(shù)“扣”出來,在本地模擬運行得到加密結(jié)果,再通過POST發(fā)包將參數(shù)進(jìn)行傳遞才能得到正常反饋,因此它能夠阻擋大量技術(shù)力較低的惡意爬蟲。
這類反爬蟲手段的破解手段主要分兩種:
(1)簡單的加密直接使用Python語言進(jìn)行復(fù)現(xiàn)。
(2)較復(fù)雜一些的加密可以將具體函數(shù)“扣”出來,組成加密腳本后模擬運行。同時還要對一些瀏覽器指紋檢測進(jìn)行模擬。
七、JS反調(diào)試
JS參數(shù)加密對于熟悉JS語言的開發(fā)者來說,防范的門檻并不高。所以為了從源頭上斷絕開發(fā)者對網(wǎng)站加密文件的分析,就誕生了JS反調(diào)試。
最簡單的方法是通過禁止用戶右擊以及按F12等快捷鍵實現(xiàn)的,對于這種簡單的防護(hù)只需要修改對應(yīng)快捷鍵,或者在新窗口中打開開發(fā)者工具再切換回原頁面即可。
較難一些的主要是通過檢測用戶是否打開了瀏覽器開發(fā)者工具或者是否修改了本地JS腳本文件,從而判斷是否進(jìn)行無限循環(huán)debugger的卡頓,讓開發(fā)者無法進(jìn)行腳本調(diào)試。這種反爬蟲的破解需要熟悉JS Hook相關(guān)知識,因為檢測控制臺狀態(tài)和腳本文件狀態(tài)的源代碼是大同小異的,可以通過編寫Chrome拓展插件自動Hook反調(diào)試代碼并進(jìn)行函數(shù)替換,從而過掉檢測讓開發(fā)者能夠進(jìn)行靜態(tài)分析。
八、AST混淆反爬蟲
從理論上來說,任何反爬蟲手段都無法阻止爬蟲的進(jìn)入,因為如果一個網(wǎng)站想要有用戶流量,必然不會設(shè)置太高的門檻導(dǎo)致正常用戶也無法訪問。只要開發(fā)者的網(wǎng)絡(luò)爬蟲盡可能地模擬人類訪問網(wǎng)站的情形,就能夠進(jìn)入網(wǎng)站肆意橫行。
不過雖然無法根絕網(wǎng)絡(luò)爬蟲的進(jìn)入,卻可以提高網(wǎng)絡(luò)爬蟲進(jìn)入的門檻,將網(wǎng)站的損失降到最低。在所有的反爬蟲防護(hù)手段中,JS參數(shù)加密的防護(hù)效果是比較出色的,它能將大多數(shù)低技術(shù)力的爬蟲開發(fā)者擋在門外。現(xiàn)在的網(wǎng)站即便是使用了驗證碼防護(hù),其背后的HTTP請求傳輸也會使用JS對驗證碼參數(shù)進(jìn)行加密,它雖然沒辦法完全阻止爬蟲的進(jìn)入,卻能讓爬蟲開發(fā)者耗費大量時間在破解上,這是一種成本低廉卻效果非凡的手段,如果網(wǎng)站的加密腳本經(jīng)常更換的話,即便是再老練的爬蟲開發(fā)者也會疲于奔命,因此如何加大JS腳本的破解難度是一個關(guān)鍵點。
常見的防止開發(fā)者調(diào)試JS腳本文件的方法無非禁止右擊和禁止打開開發(fā)者工具,或者使用JS代碼進(jìn)行檢測,但這些方法都存在著通殺通用的解決方案,因為它們的防護(hù)等級并不算高,只要熟練使用搜索引擎就可以過掉。要想在JS腳本防護(hù)上盡可能延長被爬蟲破解的時間,最好的方法就是使用AST抽象語法樹對JS腳本代碼進(jìn)行高度混淆,將其轉(zhuǎn)化生成為不可閱讀且不可識別,卻可以正常運作的亂碼文件。如圖5所示,經(jīng)過混淆的JS代碼的可讀性已經(jīng)大大下降,這進(jìn)一步增大了JS逆向的難度。
圖5 經(jīng)過混淆的JS代碼
九、總 結(jié)
反爬蟲技術(shù)并不能夠根絕網(wǎng)絡(luò)爬蟲,這是必然的。網(wǎng)站的前端加密文件是任何用戶都可以隨意讀取的,網(wǎng)站的存在是以真實用戶的流量為依托的,如今的網(wǎng)絡(luò)爬蟲技術(shù)飛速發(fā)展,幾乎能夠達(dá)到以假亂真的狀態(tài)。即便是檢查JS文件是否真實運行在瀏覽器當(dāng)中,爬蟲開發(fā)者也可以在腳本文件中模擬對應(yīng)的對象原型。但不論怎么說,爬蟲和反爬蟲的對抗,一方面提高了爬蟲的門檻,強(qiáng)化了企業(yè)的安全意識,另一方面,又促進(jìn)了爬蟲技術(shù)的發(fā)展。
參考文獻(xiàn)
[1]Ma Xiaoju,Yan Min. Design and Implementation of Craweper Based on Scrapy[J]. Journal of Physics: Conference Series,2021,2033(1).
[2]Deng Kaiying,Chen Senpeng,Deng Jingwei. On optimisation of web crawler system on Scrapy framework[J]. International Journal of Wireless and Mobile Computing,2020,18(4).
[3]Wang Wei,Yu Lihua. UCrawler: A learning-based web crawler using a URL knowledge base[J]. Journal of Computational Methods in Sciences and Engineering,2021,21(2).
[4]Tianyi Ma,Ziyang Zhang. Medical Consultation System based on Python Web crawler[C]//.Proceedings of 2021 2nd International Conference on Electronics, Communications and Information Technology (CECIT 2021).,2021:772-776.DOI:10.26914/c.cnkihy.2021.065511.
[5]Addo Prince Clement,Dorgbefu Jnr. Maxwell,Kulbo Nora Bakabbey,Akpatsa Samuel Kofi,Ohemeng Asare Andy,Dagadu Joshua Caleb,Boansi Kufuor Oliver,Kofi Frimpong Adasa Nkrumah. Video Ads in Digital Marketing and Sales: A Big Data Analytics Using Scrapy Web Crawler Mining Technique[J]. Asian Journal of Research in Computer Science,2021.