攔截網(wǎng)絡(luò)爬蟲(chóng)流量技術(shù)的應(yīng)用研究
一、Headers頭部校驗(yàn)
網(wǎng)絡(luò)爬蟲(chóng)的本質(zhì)是對(duì)網(wǎng)絡(luò)請(qǐng)求的模擬。腳本要發(fā)送請(qǐng)求,就需要構(gòu)造請(qǐng)求頭部,這個(gè)請(qǐng)求頭部通常被稱為Headers。Headers頭部校驗(yàn)指的是服務(wù)器對(duì)HTTP請(qǐng)求報(bào)文中請(qǐng)求頭鍵值對(duì)的檢測(cè)。檢測(cè)的鍵值對(duì)主要有三個(gè):
(1) User-Agent:檢測(cè)請(qǐng)求者的用戶代理,此項(xiàng)缺失則判定為機(jī)器人。
(2) Referer:檢測(cè)請(qǐng)求者是否以正常途徑跳轉(zhuǎn)到本頁(yè)面,常用于防盜鏈技術(shù)。
(3) Cookie:檢測(cè)請(qǐng)求者身份狀態(tài),在需要登錄才能訪問(wèn)的網(wǎng)站通常需要攜帶。
要應(yīng)對(duì)這類Headers頭部檢測(cè)非常容易,只需要在使用瀏覽器訪問(wèn)頁(yè)面后進(jìn)行抓包觀察,大多數(shù)情況下直接復(fù)制請(qǐng)求頭中的內(nèi)容即可。值得注意的是,在需要登錄才能訪問(wèn)的頁(yè)面,其中的Cookie是有時(shí)效性的,需要及時(shí)更新。在一些安全防護(hù)較好的網(wǎng)站,Headers頭部中也會(huì)額外加入一些本地JS運(yùn)行后計(jì)算出的加密參數(shù)。
二、IP地址記錄
對(duì)于IP地址的記錄,主要是針對(duì)惡意爬蟲(chóng),防止其在短時(shí)間內(nèi)大量發(fā)起HTTP請(qǐng)求訪問(wèn)網(wǎng)站,造成網(wǎng)站資源的侵占。這種反爬蟲(chóng)手段原理就是檢測(cè)異常訪問(wèn)用戶,如果有請(qǐng)求在短時(shí)間(例如3秒)內(nèi)連續(xù)訪問(wèn)網(wǎng)站高達(dá)數(shù)十次,則會(huì)進(jìn)行IP記錄,將其判定為機(jī)器人,在該IP地址的HTTP請(qǐng)求再次發(fā)來(lái)的時(shí)候,服務(wù)器就回復(fù)狀態(tài)碼403 Forbidden,禁止該請(qǐng)求的繼續(xù)訪問(wèn),這種防護(hù)手段的優(yōu)點(diǎn)很明顯,缺陷也很明顯,那就是一刀切容易誤傷人類用戶。
此種反爬蟲(chóng)手段的應(yīng)對(duì)需要爬蟲(chóng)開(kāi)發(fā)者盡量減緩HTTP請(qǐng)求間隔,以求達(dá)到和正常人類訪問(wèn)頁(yè)面相似的速度,避免被算法檢測(cè)?;蛘呖梢越P代理池,也可以購(gòu)買(mǎi)代理商IP,如圖1所示:
圖1快代理IP頁(yè)面
在進(jìn)行HTTP請(qǐng)求的時(shí)候使用代理IP訪問(wèn),本地IP就會(huì)被隱藏在代理之后,即便被算法檢測(cè),也只需要更換新的IP地址。
三、Ajax異步加載
Ajax(Asynchronous JS And XML,異步JS和XML)是一種創(chuàng)建交互式網(wǎng)頁(yè)應(yīng)用的網(wǎng)頁(yè)開(kāi)發(fā)技術(shù),簡(jiǎn)單來(lái)說(shuō),就是在瀏覽一個(gè)界面的時(shí)候,URL地址本身沒(méi)有發(fā)生改變,頁(yè)面內(nèi)容卻發(fā)生了動(dòng)態(tài)更新,如圖2所示,網(wǎng)頁(yè)端里百度圖片的瀑布流加載即使用了Ajax。
圖2 百度圖片抓包
這個(gè)時(shí)候,直接使用GET請(qǐng)求去獲取頁(yè)面內(nèi)容是定位不到具體內(nèi)容的,因?yàn)樗墨@取一般是經(jīng)由數(shù)據(jù)接口進(jìn)行返回的。
嚴(yán)格來(lái)說(shuō),這并不算是一種反爬蟲(chóng)技術(shù),但是運(yùn)用Ajax之后,爬蟲(chóng)開(kāi)發(fā)者需要在網(wǎng)絡(luò)請(qǐng)求包中去自行選擇數(shù)據(jù)包才可以,而不是可以簡(jiǎn)單通過(guò)GET頁(yè)面源代碼來(lái)編寫(xiě)爬蟲(chóng)。面對(duì)此類技術(shù),只需要進(jìn)行網(wǎng)頁(yè)抓包,在大量的數(shù)據(jù)包中尋找到真正包含網(wǎng)頁(yè)內(nèi)容的數(shù)據(jù)接口即可。因?yàn)閿?shù)據(jù)如果要渲染到頁(yè)面,就一定會(huì)有數(shù)據(jù)包將其傳輸?shù)娇蛻舳?,開(kāi)發(fā)者要做的只是將它找出來(lái)。一般而言,此類技術(shù)進(jìn)行數(shù)據(jù)傳輸返回的結(jié)果都是JSON格式的,所以需要用JSON包進(jìn)行數(shù)據(jù)解析。
四、字體反爬蟲(chóng)
不同于一般的反爬蟲(chóng)思路,字體反爬蟲(chóng)主要在數(shù)據(jù)上做手腳。要獲取的網(wǎng)頁(yè)數(shù)據(jù)在瀏覽器中可以正常查看,但是在將其復(fù)制到本地后就會(huì)得到亂碼。它的原理是網(wǎng)站自己自定義創(chuàng)造了一套字體,構(gòu)建映射關(guān)系后將其添加到了css的font中,在瀏覽器中查看的時(shí)候,網(wǎng)站會(huì)自動(dòng)獲取這些文件,從而建立對(duì)應(yīng)關(guān)系映射得到字符。而爬蟲(chóng)開(kāi)發(fā)者在編寫(xiě)網(wǎng)絡(luò)爬蟲(chóng)的時(shí)候,往往只會(huì)請(qǐng)求網(wǎng)頁(yè)的URL地址,這就造成了映射文件的空缺,沒(méi)有字符集能夠解析這些字符,導(dǎo)致亂碼問(wèn)題。如圖3所示,實(shí)習(xí)僧網(wǎng)頁(yè)端使用了自定制的字體文件。
圖3 實(shí)習(xí)僧字體反爬蟲(chóng)
字體反爬蟲(chóng)的突破有兩種方法,第一種方法是找到font文件的URL請(qǐng)求地址,將其下載到本地后使用xml解析工具解析出來(lái),然后就可以根據(jù)其中的字符對(duì)應(yīng)關(guān)系,建立本地映射進(jìn)行字符替換。第二種方法是直接手動(dòng)復(fù)制其中的加密字符,在本地通過(guò)encode編碼后得到對(duì)應(yīng)編碼,建立自己的本地映射字典,然后進(jìn)行字符爬取替換。之所以可以使用第二種方法,是因?yàn)樽煮w反爬蟲(chóng)的加密字符通常不會(huì)很多,大多是對(duì)阿拉伯?dāng)?shù)字和部分網(wǎng)站常用漢字進(jìn)行加密,所以可以直接人工復(fù)制進(jìn)行編碼映射。
五、驗(yàn)證碼反爬蟲(chóng)
如今的互聯(lián)網(wǎng)惡意爬蟲(chóng)橫行,上述的反爬蟲(chóng)手段雖然可行,但是被惡意爬蟲(chóng)突破也很容易。為了應(yīng)對(duì)這種情況就誕生了驗(yàn)證碼,從最開(kāi)始的英數(shù)驗(yàn)證碼到如今的圖片點(diǎn)選驗(yàn)證碼,驗(yàn)證碼技術(shù)在不斷更新迭代,未來(lái)也會(huì)出現(xiàn)更多類型的驗(yàn)證碼。驗(yàn)證碼的防護(hù)主要在兩個(gè)階段,第一個(gè)階段是登錄注冊(cè)階段,第二個(gè)階段是訪問(wèn)頁(yè)面階段,前者是為了將惡意爬蟲(chóng)攔在門(mén)外,讓人類用戶進(jìn)入,后者是為了清理那些突破了登錄注冊(cè)階段,進(jìn)入頁(yè)面爬取的惡意爬蟲(chóng),如果服務(wù)器檢測(cè)到某IP地址在短時(shí)間內(nèi)大量訪問(wèn),不會(huì)直接封禁用戶,而是出現(xiàn)驗(yàn)證碼,這樣就避免了對(duì)用戶的誤傷,不是一刀切,更加人性化。如果是人類用戶自然可以通過(guò)這些點(diǎn)選識(shí)別的驗(yàn)證碼,但如果是機(jī)器人就很難突破這第二道關(guān)卡,如圖4所示的圖片點(diǎn)選驗(yàn)證碼。
圖4 圖片點(diǎn)選驗(yàn)證碼
這類反爬蟲(chóng)手段的應(yīng)對(duì)主要是對(duì)接各大驗(yàn)證碼識(shí)別平臺(tái)或者是通過(guò)訓(xùn)練深度學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)模型,讓模型幫助爬蟲(chóng)程序過(guò)掉驗(yàn)證碼。而且如今深度學(xué)習(xí)框架盛行,訓(xùn)練模型早已不是難事,單純的驗(yàn)證碼識(shí)別已經(jīng)攔不住搭配了深度學(xué)習(xí)模型的網(wǎng)絡(luò)爬蟲(chóng),所以網(wǎng)站開(kāi)發(fā)者會(huì)在驗(yàn)證碼識(shí)別背后再加上較復(fù)雜的JS參數(shù)加密,即便驗(yàn)證碼被識(shí)別,也很難構(gòu)造出最終的加密結(jié)果來(lái),這樣就提高了破解門(mén)檻。不過(guò)使用特殊的測(cè)試工具,例如selenium,可以直接搭配訓(xùn)練模型模擬人類行為過(guò)掉驗(yàn)證碼,免去破解JS加密參數(shù)的煩惱。不過(guò)自動(dòng)化的測(cè)試工具存在著明顯的特征,個(gè)別網(wǎng)站會(huì)在JS文件中添加對(duì)自動(dòng)化軟件特征的識(shí)別,從而拒絕服務(wù)。
六、JavaScript參數(shù)加密
JavaScript(以下簡(jiǎn)稱JS)參數(shù)加密常見(jiàn)于POST表單提交的情形里,主要是為了防范惡意機(jī)器人批量注冊(cè)與模擬登錄等行為。如果對(duì)POST表單進(jìn)行抓包的話,會(huì)發(fā)現(xiàn)自己在表單里輸入的數(shù)據(jù)被加密為了不可知的字符串,這主要是通過(guò)加載網(wǎng)站的本地JS腳本實(shí)現(xiàn)的。
對(duì)于這類反爬蟲(chóng)的應(yīng)對(duì),除了熟悉調(diào)試技巧外,還需要讀者有較扎實(shí)的JS語(yǔ)言基礎(chǔ),因?yàn)榇祟惣用艿钠平馔ǔP枰_(kāi)發(fā)者能夠讀懂目標(biāo)網(wǎng)站的JS加密腳本,并進(jìn)行一系列的刪改操作,用靜態(tài)分析逐步從龐大的JS腳本中將具體的加密函數(shù)“扣”出來(lái),在本地模擬運(yùn)行得到加密結(jié)果,再通過(guò)POST發(fā)包將參數(shù)進(jìn)行傳遞才能得到正常反饋,因此它能夠阻擋大量技術(shù)力較低的惡意爬蟲(chóng)。
這類反爬蟲(chóng)手段的破解手段主要分兩種:
(1)簡(jiǎn)單的加密直接使用Python語(yǔ)言進(jìn)行復(fù)現(xiàn)。
(2)較復(fù)雜一些的加密可以將具體函數(shù)“扣”出來(lái),組成加密腳本后模擬運(yùn)行。同時(shí)還要對(duì)一些瀏覽器指紋檢測(cè)進(jìn)行模擬。
七、JS反調(diào)試
JS參數(shù)加密對(duì)于熟悉JS語(yǔ)言的開(kāi)發(fā)者來(lái)說(shuō),防范的門(mén)檻并不高。所以為了從源頭上斷絕開(kāi)發(fā)者對(duì)網(wǎng)站加密文件的分析,就誕生了JS反調(diào)試。
最簡(jiǎn)單的方法是通過(guò)禁止用戶右擊以及按F12等快捷鍵實(shí)現(xiàn)的,對(duì)于這種簡(jiǎn)單的防護(hù)只需要修改對(duì)應(yīng)快捷鍵,或者在新窗口中打開(kāi)開(kāi)發(fā)者工具再切換回原頁(yè)面即可。
較難一些的主要是通過(guò)檢測(cè)用戶是否打開(kāi)了瀏覽器開(kāi)發(fā)者工具或者是否修改了本地JS腳本文件,從而判斷是否進(jìn)行無(wú)限循環(huán)debugger的卡頓,讓開(kāi)發(fā)者無(wú)法進(jìn)行腳本調(diào)試。這種反爬蟲(chóng)的破解需要熟悉JS Hook相關(guān)知識(shí),因?yàn)闄z測(cè)控制臺(tái)狀態(tài)和腳本文件狀態(tài)的源代碼是大同小異的,可以通過(guò)編寫(xiě)Chrome拓展插件自動(dòng)Hook反調(diào)試代碼并進(jìn)行函數(shù)替換,從而過(guò)掉檢測(cè)讓開(kāi)發(fā)者能夠進(jìn)行靜態(tài)分析。
八、AST混淆反爬蟲(chóng)
從理論上來(lái)說(shuō),任何反爬蟲(chóng)手段都無(wú)法阻止爬蟲(chóng)的進(jìn)入,因?yàn)槿绻粋€(gè)網(wǎng)站想要有用戶流量,必然不會(huì)設(shè)置太高的門(mén)檻導(dǎo)致正常用戶也無(wú)法訪問(wèn)。只要開(kāi)發(fā)者的網(wǎng)絡(luò)爬蟲(chóng)盡可能地模擬人類訪問(wèn)網(wǎng)站的情形,就能夠進(jìn)入網(wǎng)站肆意橫行。
不過(guò)雖然無(wú)法根絕網(wǎng)絡(luò)爬蟲(chóng)的進(jìn)入,卻可以提高網(wǎng)絡(luò)爬蟲(chóng)進(jìn)入的門(mén)檻,將網(wǎng)站的損失降到最低。在所有的反爬蟲(chóng)防護(hù)手段中,JS參數(shù)加密的防護(hù)效果是比較出色的,它能將大多數(shù)低技術(shù)力的爬蟲(chóng)開(kāi)發(fā)者擋在門(mén)外?,F(xiàn)在的網(wǎng)站即便是使用了驗(yàn)證碼防護(hù),其背后的HTTP請(qǐng)求傳輸也會(huì)使用JS對(duì)驗(yàn)證碼參數(shù)進(jìn)行加密,它雖然沒(méi)辦法完全阻止爬蟲(chóng)的進(jìn)入,卻能讓爬蟲(chóng)開(kāi)發(fā)者耗費(fèi)大量時(shí)間在破解上,這是一種成本低廉卻效果非凡的手段,如果網(wǎng)站的加密腳本經(jīng)常更換的話,即便是再老練的爬蟲(chóng)開(kāi)發(fā)者也會(huì)疲于奔命,因此如何加大JS腳本的破解難度是一個(gè)關(guān)鍵點(diǎn)。
常見(jiàn)的防止開(kāi)發(fā)者調(diào)試JS腳本文件的方法無(wú)非禁止右擊和禁止打開(kāi)開(kāi)發(fā)者工具,或者使用JS代碼進(jìn)行檢測(cè),但這些方法都存在著通殺通用的解決方案,因?yàn)樗鼈兊姆雷o(hù)等級(jí)并不算高,只要熟練使用搜索引擎就可以過(guò)掉。要想在JS腳本防護(hù)上盡可能延長(zhǎng)被爬蟲(chóng)破解的時(shí)間,最好的方法就是使用AST抽象語(yǔ)法樹(shù)對(duì)JS腳本代碼進(jìn)行高度混淆,將其轉(zhuǎn)化生成為不可閱讀且不可識(shí)別,卻可以正常運(yùn)作的亂碼文件。如圖5所示,經(jīng)過(guò)混淆的JS代碼的可讀性已經(jīng)大大下降,這進(jìn)一步增大了JS逆向的難度。
圖5 經(jīng)過(guò)混淆的JS代碼
九、總 結(jié)
反爬蟲(chóng)技術(shù)并不能夠根絕網(wǎng)絡(luò)爬蟲(chóng),這是必然的。網(wǎng)站的前端加密文件是任何用戶都可以隨意讀取的,網(wǎng)站的存在是以真實(shí)用戶的流量為依托的,如今的網(wǎng)絡(luò)爬蟲(chóng)技術(shù)飛速發(fā)展,幾乎能夠達(dá)到以假亂真的狀態(tài)。即便是檢查JS文件是否真實(shí)運(yùn)行在瀏覽器當(dāng)中,爬蟲(chóng)開(kāi)發(fā)者也可以在腳本文件中模擬對(duì)應(yīng)的對(duì)象原型。但不論怎么說(shuō),爬蟲(chóng)和反爬蟲(chóng)的對(duì)抗,一方面提高了爬蟲(chóng)的門(mén)檻,強(qiáng)化了企業(yè)的安全意識(shí),另一方面,又促進(jìn)了爬蟲(chóng)技術(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.