爬蟲(chóng)與反爬蟲(chóng)技術(shù)簡(jiǎn)介
作者 | vivo 互聯(lián)網(wǎng)安全團(tuán)隊(duì)- Xie Peng
互聯(lián)網(wǎng)的大數(shù)據(jù)時(shí)代的來(lái)臨,網(wǎng)絡(luò)爬蟲(chóng)也成了互聯(lián)網(wǎng)中一個(gè)重要行業(yè),它是一種自動(dòng)獲取網(wǎng)頁(yè)數(shù)據(jù)信息的爬蟲(chóng)程序,是網(wǎng)站搜索引擎的重要組成部分。通過(guò)爬蟲(chóng),可以獲取自己想要的相關(guān)數(shù)據(jù)信息,讓爬蟲(chóng)協(xié)助自己的工作,進(jìn)而降低成本,提高業(yè)務(wù)成功率和提高業(yè)務(wù)效率。
本文一方面從爬蟲(chóng)與反反爬的角度來(lái)說(shuō)明如何高效的對(duì)網(wǎng)絡(luò)上的公開(kāi)數(shù)據(jù)進(jìn)行爬取,另一方面也會(huì)介紹反爬蟲(chóng)的技術(shù)手段,為防止外部爬蟲(chóng)大批量的采集數(shù)據(jù)的過(guò)程對(duì)服務(wù)器造成超負(fù)載方面提供些許建議。
爬蟲(chóng)指的是按照一定規(guī)則自動(dòng)抓取萬(wàn)維網(wǎng)信息的程序,本次主要會(huì)從爬蟲(chóng)的技術(shù)原理與實(shí)現(xiàn),反爬蟲(chóng)與反反爬蟲(chóng)兩個(gè)方面進(jìn)行簡(jiǎn)單的介紹,介紹的案例均只是用于安全研究和學(xué)習(xí),并不會(huì)進(jìn)行大量爬蟲(chóng)或者應(yīng)用于商業(yè)。
一、爬蟲(chóng)的技術(shù)原理與實(shí)現(xiàn)
1.1 爬蟲(chóng)的定義
爬蟲(chóng)分為通用爬蟲(chóng)和聚焦爬蟲(chóng)兩大類,前者的目標(biāo)是在保持一定內(nèi)容質(zhì)量的情況下爬取盡可能多的站點(diǎn),比如百度這樣的搜索引擎就是這種類型的爬蟲(chóng),如圖1是通用搜索引擎的基礎(chǔ)架構(gòu):
- 首先在互聯(lián)網(wǎng)中選出一部分網(wǎng)頁(yè),以這些網(wǎng)頁(yè)的鏈接地址作為種子URL;
- 將這些種子URL放入待抓取的URL隊(duì)列中,爬蟲(chóng)從待抓取的URL隊(duì)列依次讀?。?/li>
- 將URL通過(guò)DNS解析,把鏈接地址轉(zhuǎn)換為網(wǎng)站服務(wù)器對(duì)應(yīng)的IP地址;
- 網(wǎng)頁(yè)下載器通過(guò)網(wǎng)站服務(wù)器對(duì)網(wǎng)頁(yè)進(jìn)行下載,下載的網(wǎng)頁(yè)為網(wǎng)頁(yè)文檔形式;
- 對(duì)網(wǎng)頁(yè)文檔中的URL進(jìn)行抽取,并過(guò)濾掉已經(jīng)抓取的URL;
- 對(duì)未進(jìn)行抓取的URL繼續(xù)循環(huán)抓取,直至待抓取URL隊(duì)列為空。
圖1.通用搜索引擎的基礎(chǔ)架構(gòu)
爬蟲(chóng)通常從一個(gè)或多個(gè) URL 開(kāi)始,在爬取的過(guò)程中不斷將新的并且符合要求的 URL 放入待爬隊(duì)列,直到滿足程序的停止條件。
而我們?nèi)粘R?jiàn)到的爬蟲(chóng)基本為后者,目標(biāo)是在爬取少量站點(diǎn)的情況下盡可能保持精準(zhǔn)的內(nèi)容質(zhì)量。典型的比如圖2搶票軟件所示,就是利用爬蟲(chóng)來(lái)登錄售票網(wǎng)絡(luò)并爬取信息,從而輔助商業(yè)。
圖2.搶票軟件
了解了爬蟲(chóng)的定義后,那么應(yīng)該如何編寫(xiě)爬蟲(chóng)程序來(lái)爬取我們想要的數(shù)據(jù)呢。我們可以先了解下目前常用的爬蟲(chóng)框架,因?yàn)樗梢詫⒁恍┏R?jiàn)爬蟲(chóng)功能的實(shí)現(xiàn)代碼寫(xiě)好,然后留下一些接口,在做不同的爬蟲(chóng)項(xiàng)目時(shí),我們只需要根據(jù)實(shí)際情況,手寫(xiě)少量需要變動(dòng)的代碼部分,并按照需要調(diào)用這些接口,即可以實(shí)現(xiàn)一個(gè)爬蟲(chóng)項(xiàng)目。
1.2 爬蟲(chóng)框架介紹
常用的搜索引擎爬蟲(chóng)框架如圖3所示,首先Nutch是專門(mén)為搜索引擎設(shè)計(jì)的爬蟲(chóng),不適合用于精確爬蟲(chóng)。Pyspider和Scrapy都是python語(yǔ)言編寫(xiě)的爬蟲(chóng)框架,都支持分布式爬蟲(chóng)。另外Pyspider由于其可視化的操作界面,相比Scrapy全命令行的操作對(duì)用戶更加友好,但是功能不如Scrapy強(qiáng)大。
圖3.爬蟲(chóng)框架對(duì)比
1.3 爬蟲(chóng)的簡(jiǎn)單示例
除了使用爬蟲(chóng)框架來(lái)進(jìn)行爬蟲(chóng),也可以從頭開(kāi)始來(lái)編寫(xiě)爬蟲(chóng)程序,步驟如圖4所示:
圖4.爬蟲(chóng)的基本原理
接下來(lái)通過(guò)一個(gè)簡(jiǎn)單的例子來(lái)實(shí)際演示上述的步驟,我們要爬取的是某應(yīng)用市場(chǎng)的榜單,以這個(gè)作為例子,是因?yàn)檫@個(gè)網(wǎng)站沒(méi)有任何的反爬蟲(chóng)手段,我們通過(guò)上面的步驟可以輕松爬取到內(nèi)容。
圖5.網(wǎng)頁(yè)與其對(duì)應(yīng)的源代碼
網(wǎng)頁(yè)與其對(duì)應(yīng)的源代碼如圖5所示,對(duì)于網(wǎng)頁(yè)上的數(shù)據(jù),假定我們想要爬取排行榜上每個(gè)app的名稱以及其分類。
我們首先分析網(wǎng)頁(yè)源代碼,發(fā)現(xiàn)可以直接在網(wǎng)頁(yè)源代碼中搜索到“抖音”等app的名稱,接著看到app名稱、app類別等都是在一個(gè)<li>標(biāo)簽里,所以我們只需要請(qǐng)求網(wǎng)頁(yè)地址,拿到返回的網(wǎng)頁(yè)源代碼,然后對(duì)網(wǎng)頁(yè)源代碼進(jìn)行正則匹配,提取出想要的數(shù)據(jù),保存下來(lái)即可,如圖6所示。
圖6.爬蟲(chóng)的代碼以及結(jié)果
二、反爬蟲(chóng)相關(guān)技術(shù)
在了解具體的反爬蟲(chóng)措施之前,我們先介紹下反爬蟲(chóng)的定義和意義,限制爬蟲(chóng)程序訪問(wèn)服務(wù)器資源和獲取數(shù)據(jù)的行為稱為反爬蟲(chóng)。爬蟲(chóng)程序的訪問(wèn)速率和目的與正常用戶的訪問(wèn)速率和目的是不同的,大部分爬蟲(chóng)會(huì)無(wú)節(jié)制地對(duì)目標(biāo)應(yīng)用進(jìn)行爬取,這給目標(biāo)應(yīng)用的服務(wù)器帶來(lái)巨大的壓力。爬蟲(chóng)程序發(fā)出的網(wǎng)絡(luò)請(qǐng)求被運(yùn)營(yíng)者稱為“垃圾流量”。開(kāi)發(fā)者為了保證服務(wù)器的正常運(yùn)轉(zhuǎn)或降低服務(wù)器的壓力與運(yùn)營(yíng)成本,不得不使出各種各樣的技術(shù)手段來(lái)限制爬蟲(chóng)對(duì)服務(wù)器資源的訪問(wèn)。
所以為什么要做反爬蟲(chóng),答案是顯然的,爬蟲(chóng)流量會(huì)提升服務(wù)器的負(fù)載,過(guò)大的爬蟲(chóng)流量會(huì)影響到服務(wù)的正常運(yùn)轉(zhuǎn),從而造成收入損失,另一方面,一些核心數(shù)據(jù)的外泄,會(huì)使數(shù)據(jù)擁有者失去競(jìng)爭(zhēng)力。
常見(jiàn)的反爬蟲(chóng)手段,如圖7所示。主要包含文本混淆、頁(yè)面動(dòng)態(tài)渲染、驗(yàn)證碼校驗(yàn)、請(qǐng)求簽名校驗(yàn)、大數(shù)據(jù)風(fēng)控、js混淆和蜜罐等,其中文本混淆包含css偏移、圖片偽裝文本、自定義字體等,而風(fēng)控策略的制定則往往是從參數(shù)校驗(yàn)、行為頻率和模式異常等方面出發(fā)的。
圖7.常見(jiàn)的反爬蟲(chóng)手段
2.1 CSS偏移反爬蟲(chóng)
在搭建網(wǎng)頁(yè)的時(shí)候,需要用CSS來(lái)控制各類字符的位置,也正是如此,可以利用CSS來(lái)將瀏覽器中顯示的文字,在HTML中以亂序的方式存儲(chǔ),從而來(lái)限制爬蟲(chóng)。CSS偏移反爬蟲(chóng),就是一種利用CSS樣式將亂序的文字排版成人類正常閱讀順序的反爬蟲(chóng)手段。這個(gè)概念不是很好理解,我們可以通過(guò)對(duì)比兩段文字來(lái)加深對(duì)這個(gè)概念的理解:
- HTML 文本中的文字:我的學(xué)號(hào)是 1308205,我在北京大學(xué)讀書(shū)。
- 瀏覽器顯示的文字:我的學(xué)號(hào)是 1380205,我在北京大學(xué)讀書(shū)。
以上兩段文字中瀏覽器顯示的應(yīng)該是正確的信息,如果我們按之前提到的爬蟲(chóng)步驟,分析網(wǎng)頁(yè)后正則提取信息,會(huì)發(fā)現(xiàn)學(xué)號(hào)是錯(cuò)的。
接著看圖8所示的例子,如果我們想爬取該網(wǎng)頁(yè)上的機(jī)票信息,首先需要分析網(wǎng)頁(yè)。紅框所示的價(jià)格467對(duì)應(yīng)的是中國(guó)民航的從石家莊到上海的機(jī)票,但是分析網(wǎng)頁(yè)源代碼發(fā)現(xiàn)代碼中有 3 對(duì) b 標(biāo)簽,第 1 對(duì) b 標(biāo)簽中包含 3 對(duì) i 標(biāo)簽,i 標(biāo)簽中的數(shù)字都是 7,也就是說(shuō)第 1 對(duì) b 標(biāo)簽的顯示結(jié)果應(yīng)該是 777。而第 2 對(duì) b 標(biāo)簽中的數(shù)字是 6,第 3 對(duì) b 標(biāo)簽中的數(shù)字是 4,這樣的話我們會(huì)無(wú)法直接通過(guò)正則匹配得到正確的機(jī)票價(jià)格。
圖8.CSS 偏移反爬蟲(chóng)例子
2.2 圖片偽裝反爬蟲(chóng)
圖片偽裝反爬蟲(chóng),它的本質(zhì)就是用圖片替換了原來(lái)的內(nèi)容,從而讓爬蟲(chóng)程序無(wú)法正常獲取,如圖9所示。這種反爬蟲(chóng)的原理十分簡(jiǎn)單,就是將本應(yīng)是普通文本內(nèi)容的部分在前端頁(yè)面中用圖片來(lái)進(jìn)行替換,遇到這種案例可以直接用ocr識(shí)別圖片中的文字就可以繞過(guò)。而且因?yàn)槭怯脠D片替換文本顯示,所以圖片本身會(huì)相對(duì)比較清晰,沒(méi)有很多噪聲干擾,ocr識(shí)別的結(jié)果會(huì)很準(zhǔn)確。
圖9. 圖片偽裝反爬蟲(chóng)例子
2.3 自定義字體反爬蟲(chóng)
在 CSS3 時(shí)代,開(kāi)發(fā)者可以使用@font-face為網(wǎng)頁(yè)指定字體。開(kāi)發(fā)者可將心儀的字體文件放在 Web 服務(wù)器上,并在 CSS 樣式中使用它。用戶使用瀏覽器訪問(wèn) Web 應(yīng)用時(shí),對(duì)應(yīng)的字體會(huì)被瀏覽器下載到用戶的計(jì)算機(jī)上,但是我們?cè)谑褂门老x(chóng)程序時(shí),由于沒(méi)有相應(yīng)的字體映射關(guān)系,直接爬取就會(huì)無(wú)法得到有效數(shù)據(jù)。
如圖10所示,該網(wǎng)頁(yè)中每個(gè)店鋪的評(píng)價(jià)數(shù)、人均、口味、環(huán)境等信息均是亂碼字符,爬蟲(chóng)無(wú)法直接讀取到內(nèi)容。
圖10. 自定義字體反爬蟲(chóng)例子
2.4 頁(yè)面動(dòng)態(tài)渲染反爬蟲(chóng)
網(wǎng)頁(yè)按渲染方式的不同,大體可以分為客戶端和服務(wù)端渲染。
- 服務(wù)端渲染,頁(yè)面的結(jié)果是由服務(wù)器渲染后返回的,有效信息包含在請(qǐng)求的 HTML 頁(yè)面里面,通過(guò)查看網(wǎng)頁(yè)源代碼可以直接查看到數(shù)據(jù)等信息;
- 客戶端渲染,頁(yè)面的主要內(nèi)容由 JavaScript 渲染而成,真實(shí)的數(shù)據(jù)是通過(guò) Ajax 接口等形式獲取的,通過(guò)查看網(wǎng)頁(yè)源代碼,無(wú)有效數(shù)據(jù)信息。
客戶端渲染和服務(wù)器端渲染的最重要的區(qū)別就是究竟是誰(shuí)來(lái)完成html文件的完整拼接,如果是在服務(wù)器端完成的,然后返回給客戶端,就是服務(wù)器端渲染,而如果是前端做了更多的工作完成了html的拼接,則就是客戶端渲染。
圖11.客戶端渲染例子
2.5 驗(yàn)證碼反爬蟲(chóng)
幾乎所有的應(yīng)用程序在涉及到用戶信息安全的操作時(shí),都會(huì)彈出驗(yàn)證碼讓用戶進(jìn)行識(shí)別,以確保該操作為人類行為,而不是大規(guī)模運(yùn)行的機(jī)器。那為什么會(huì)出現(xiàn)驗(yàn)證碼呢?在大多數(shù)情形下是因?yàn)榫W(wǎng)站的訪問(wèn)頻率過(guò)高或者行為異常,或者是為了直接限制某些自動(dòng)化行為。歸類如下:
- 很多情況下,比如登錄和注冊(cè),這些驗(yàn)證碼幾乎是必現(xiàn)的,它的目的就是為了限制惡意注冊(cè)、惡意爆破等行為,這也算反爬的一種手段。
- 一些網(wǎng)站遇到訪問(wèn)頻率過(guò)高的行為的時(shí)候,可能會(huì)直接彈出一個(gè)登錄窗口,要求我們登錄才能繼續(xù)訪問(wèn),此時(shí)的驗(yàn)證碼就直接和登錄表單綁定在一起了,這就算檢測(cè)到異常之后利用強(qiáng)制登錄的方式進(jìn)行反爬。
- 一些較為常規(guī)的網(wǎng)站如果遇到訪問(wèn)頻率稍高的情形的時(shí)候,會(huì)主動(dòng)彈出一個(gè)驗(yàn)證碼讓用戶識(shí)別并提交,驗(yàn)證當(dāng)前訪問(wèn)網(wǎng)站的是不是真實(shí)的人,用來(lái)限制一些機(jī)器的行為,實(shí)現(xiàn)反爬蟲(chóng)。
常見(jiàn)的驗(yàn)證碼形式包括圖形驗(yàn)證碼、行為驗(yàn)證碼、短信、掃碼驗(yàn)證碼等,如圖12所示。對(duì)于能否成功通過(guò)驗(yàn)證碼,除了能夠準(zhǔn)確的根據(jù)驗(yàn)證碼的要求完成相應(yīng)的點(diǎn)擊、選擇、輸入等,通過(guò)驗(yàn)證碼風(fēng)控也至關(guān)重要;比如對(duì)于滑塊驗(yàn)證碼,驗(yàn)證碼風(fēng)控可能會(huì)針對(duì)滑動(dòng)軌跡進(jìn)行檢測(cè),如果檢測(cè)出軌跡非人為,就會(huì)判定為高風(fēng)險(xiǎn),導(dǎo)致無(wú)法成功通過(guò)。
圖12.驗(yàn)證碼反爬蟲(chóng)手段
2.6 請(qǐng)求簽名校驗(yàn)反爬蟲(chóng)
簽名驗(yàn)證是防止服務(wù)器被惡意鏈接和篡改數(shù)據(jù)的有效方式之一,也是目前后端API最常用的防護(hù)方式之一。簽名是一個(gè)根據(jù)數(shù)據(jù)源進(jìn)行計(jì)算或者加密的過(guò)程,用戶經(jīng)過(guò)簽名后會(huì)一個(gè)具有一致性和唯一性的字符串,它就是你訪問(wèn)服務(wù)器的身份象征。由它的一致性和唯一性這兩種特性,從而可以有效的避免服務(wù)器端,將偽造的數(shù)據(jù)或被篡改的數(shù)據(jù)當(dāng)初正常數(shù)據(jù)處理。
前面在2.4節(jié)提到的網(wǎng)站是通過(guò)客戶端渲染網(wǎng)頁(yè),數(shù)據(jù)則是通過(guò)ajax請(qǐng)求拿到的,這種在一定程度上提升了爬蟲(chóng)的難度。接下來(lái)分析ajax請(qǐng)求,如圖13所示,會(huì)發(fā)現(xiàn)其ajax請(qǐng)求是帶有請(qǐng)求簽名的,analysis就是加密后的參數(shù),而如果想要破解請(qǐng)求接口,就需要破解該參數(shù)的加密方法,這無(wú)疑進(jìn)一步提升了難度。
圖13. 請(qǐng)求榜單數(shù)據(jù)的ajax請(qǐng)求
2.7 蜜罐反爬蟲(chóng)
蜜罐反爬蟲(chóng),是一種在網(wǎng)頁(yè)中隱藏用于檢測(cè)爬蟲(chóng)程序的鏈接的手段,被隱藏的鏈接不會(huì)顯示在頁(yè)面中,正常用戶無(wú)法訪問(wèn),但爬蟲(chóng)程序有可能將該鏈接放入待爬隊(duì)列,并向該鏈接發(fā)起請(qǐng)求,開(kāi)發(fā)者可以利用這個(gè)特點(diǎn)區(qū)分正常用戶和爬蟲(chóng)程序。如圖14所示,查看網(wǎng)頁(yè)源碼,頁(yè)面只有6個(gè)商品,col-md-3的 <div>標(biāo)簽卻有 8 對(duì)。該 CSS 樣式的作用是隱藏標(biāo)簽,所以我們?cè)陧?yè)面只看到 6 件商品,爬蟲(chóng)程序會(huì)提取到 8 件商品的 URL。
圖14.蜜罐反爬蟲(chóng)例子
三、反反爬相關(guān)技術(shù)
針對(duì)上一節(jié)提到的反爬蟲(chóng)相關(guān)技術(shù),有以下幾類反反爬技術(shù)手段:css偏移反反爬、自定義字體反反爬、頁(yè)面動(dòng)態(tài)渲染反反爬、驗(yàn)證碼破解等,下面對(duì)這幾類方法進(jìn)行詳細(xì)的介紹。
3.1 CSS偏移反反爬
3.1.1 CSS偏移邏輯介紹
那么對(duì)于以上2.1css偏移反爬蟲(chóng)的例子,怎么才能得到正確的機(jī)票價(jià)格呢。仔細(xì)觀察css樣式,可以發(fā)現(xiàn)每個(gè)帶有數(shù)字的標(biāo)簽都設(shè)定了樣式,第 1 對(duì) b 標(biāo)簽內(nèi)的i 標(biāo)簽對(duì)的樣式是相同的,都是width: 16px;另外,還注意到最外層的 span 標(biāo)簽對(duì)的樣式為width:48px。
如果按照 css樣式這條線索來(lái)分析的話,第 1 對(duì) b 標(biāo)簽中的 3 對(duì) i 標(biāo)簽剛好占滿 span 標(biāo)簽對(duì)的位置,其位置如圖15所示。此時(shí)網(wǎng)頁(yè)中顯示的價(jià)格應(yīng)該是 777,但是由于第 2 和第 3 對(duì) b 標(biāo)簽中有值,所以我們還需要計(jì)算它們的位置。由于第 2 對(duì) b 標(biāo)簽的位置樣式是 left:-32px,所以第 2 對(duì) b 標(biāo)簽中的值 6 就會(huì)覆蓋原來(lái)第 1 對(duì) b 標(biāo)簽中的中的第 2 個(gè)數(shù)字 7,此時(shí)頁(yè)面應(yīng)該顯示的數(shù)字是 767。
按此規(guī)律推算,第 3 對(duì) b 標(biāo)簽的位置樣式是 left:-48px,這個(gè)標(biāo)簽的值會(huì)覆蓋第 1 對(duì) b 標(biāo)簽中的第 1 個(gè)數(shù)字 7,最后顯示的票價(jià)就是 467。
圖15.偏移邏輯
3.1.2 CSS偏移反反爬代碼實(shí)現(xiàn)
因此接下來(lái)我們按以上css樣式的規(guī)律來(lái)編寫(xiě)代碼對(duì)該網(wǎng)頁(yè)爬取獲取正確的機(jī)票價(jià)格,代碼和結(jié)果如圖16所示。
圖16. CSS 偏移反反爬代碼與結(jié)果
3.2 自定義字體反反爬
針對(duì)于以上2.3自定義字體反爬蟲(chóng)的情況,解決思路就是提取出網(wǎng)頁(yè)中自定義字體文件(一般為WOFF文件),并將映射關(guān)系包含到爬蟲(chóng)代碼中,就可以獲取到有效數(shù)據(jù)。解決的步驟如下:
發(fā)現(xiàn)問(wèn)題:查看網(wǎng)頁(yè)源代碼,發(fā)現(xiàn)關(guān)鍵字符被編碼替代,如
分析:檢查網(wǎng)頁(yè),發(fā)現(xiàn)應(yīng)用了css自定義字符集隱藏
查找:查找css文件url,獲取字符集對(duì)應(yīng)的url,如PingFangSC-Regular-num
查找:查找和下載字符集url
比對(duì):比對(duì)字符集中的字符與網(wǎng)頁(yè)源代碼中的編碼,發(fā)現(xiàn)編碼的后四位與字符對(duì)應(yīng),也即網(wǎng)頁(yè)源代碼對(duì)應(yīng)的口味是8.9分
3.3 頁(yè)面動(dòng)態(tài)渲染反反爬
客戶端渲染的反爬蟲(chóng),頁(yè)面代碼在瀏覽器源代碼中看不到,需要執(zhí)行渲染并進(jìn)一步獲取渲染后結(jié)果。針對(duì)這種反爬蟲(chóng),有以下幾種方式破解:
- 在瀏覽器中,通過(guò)開(kāi)發(fā)者工具直接查看ajax具體的請(qǐng)求方式、參數(shù)等內(nèi)容;
- 通過(guò)selenium模擬真人操作瀏覽器,獲取渲染后的結(jié)果,之后的操作步驟和服務(wù)端渲染的流程一樣;
- 如果渲染的數(shù)據(jù)隱藏在html結(jié)果的JS變量中,可以直接正則提??;
- 如果有通過(guò)JS生成的加密參數(shù),可以找出加密部分的代碼,然后使用pyexecJS來(lái)模擬執(zhí)行JS,返回執(zhí)行結(jié)果。
3.4 驗(yàn)證碼破解
下面舉例一個(gè)識(shí)別滑塊驗(yàn)證碼的例子,如圖17所示,是使用目標(biāo)檢測(cè)模型來(lái)識(shí)別某滑塊驗(yàn)證碼缺口位置的結(jié)果示例,這種破解滑塊驗(yàn)證碼的方式對(duì)應(yīng)的是模擬真人的方式。不采用接口破解的原因一方面是破解加密算法有難度,另一方面也是加密算法可能每天都會(huì)變,這樣破解的時(shí)間成本也比較大。
圖17. 通過(guò)目標(biāo)檢測(cè)模型識(shí)別滑塊驗(yàn)證碼的缺口
3.4.1 爬取滑塊驗(yàn)證碼圖片
因?yàn)槭褂玫哪繕?biāo)檢測(cè)模型yolov5是有監(jiān)督學(xué)習(xí),所以需要爬取滑塊驗(yàn)證碼的圖片并進(jìn)行打標(biāo),進(jìn)而輸入到模型中訓(xùn)練。通過(guò)模擬真人的方式在某場(chǎng)景爬取部分驗(yàn)證碼。
圖18. 爬取的滑塊驗(yàn)證碼圖片
3.4.2 人工打標(biāo)
本次使用的是labelImg來(lái)對(duì)圖片人工打標(biāo)簽的,人工打標(biāo)耗時(shí)較長(zhǎng),100張圖片一般耗時(shí)40分鐘左右。自動(dòng)打標(biāo)代碼寫(xiě)起來(lái)比較復(fù)雜,主要是需要分別提取出驗(yàn)證碼的所有背景圖片和缺口圖片,然后隨機(jī)生成缺口位置,作為標(biāo)簽,同時(shí)將缺口放到對(duì)應(yīng)的缺口位置,生成圖片,作為輸入。
圖19. 對(duì)驗(yàn)證碼圖片打標(biāo)簽以及打標(biāo)簽后生成的xml文件
3.4.3 目標(biāo)檢測(cè)模型yolov5
直接從github下clone yolov5的官方代碼,它是基于pytorch實(shí)現(xiàn)。
接下來(lái)的使用步驟如下:
- 數(shù)據(jù)格式轉(zhuǎn)換:將人工標(biāo)注的圖片和標(biāo)簽文件轉(zhuǎn)換為yolov5接收的數(shù)據(jù)格式,得到1100張圖片和1100個(gè)yolov5格式的標(biāo)簽文件;
- 新建數(shù)據(jù)集:新建custom.yaml文件來(lái)創(chuàng)建自己的數(shù)據(jù)集,包括訓(xùn)練集和驗(yàn)證集的目錄、類別數(shù)目、類別名;
- 訓(xùn)練調(diào)優(yōu):修改模型配置文件和訓(xùn)練文件后,進(jìn)行訓(xùn)練,并根據(jù)訓(xùn)練結(jié)果調(diào)優(yōu)超參數(shù)。
轉(zhuǎn)換xml文件為yolov5格式的部分腳本:
訓(xùn)練參數(shù)設(shè)置:
3.4.4 目標(biāo)檢測(cè)模型的訓(xùn)練結(jié)果
模型基本在50次迭代的時(shí)候在precision和recall以及mAP上已經(jīng)達(dá)到了瓶頸。預(yù)測(cè)結(jié)果也有如下問(wèn)題:大部分能夠是能夠準(zhǔn)確框出缺口,但也出現(xiàn)少量框錯(cuò)、框出兩個(gè)缺口、框不出缺口的情況。
圖20. 上:模型的訓(xùn)練結(jié)果走勢(shì)圖;
下:模型對(duì)部分驗(yàn)證集的預(yù)測(cè)結(jié)果
四、總結(jié)
本次簡(jiǎn)單對(duì)爬蟲(chóng)以及反爬蟲(chóng)的技術(shù)手段進(jìn)行了介紹,介紹的技術(shù)和案例均只是用于安全研究和學(xué)習(xí),并不會(huì)進(jìn)行大量爬蟲(chóng)或者應(yīng)用于商業(yè)。
對(duì)于爬蟲(chóng),本著爬取網(wǎng)絡(luò)上公開(kāi)數(shù)據(jù)用于數(shù)據(jù)分析等的目的,我們應(yīng)該遵守網(wǎng)站robots協(xié)議,本著不影響網(wǎng)站正常運(yùn)行以及遵守法律的情況下進(jìn)行數(shù)據(jù)爬取;對(duì)于反爬蟲(chóng),因?yàn)橹灰祟惸軌蛘TL問(wèn)的網(wǎng)頁(yè),爬蟲(chóng)在具備同等資源的情況下就一定可以抓取到。所以反爬蟲(chóng)的目的還是在于能夠防止爬蟲(chóng)在大批量的采集網(wǎng)站信息的過(guò)程對(duì)服務(wù)器造成超負(fù)載,從而杜絕爬蟲(chóng)行為妨礙到用戶的體驗(yàn),來(lái)提高用戶使用網(wǎng)站服務(wù)的滿意度。