HTML防數(shù)據(jù)采集

什么是防采集

就是我們想利用爬蟲(chóng)工具采集某個(gè)網(wǎng)站的數(shù)據(jù)(前提當(dāng)然是公開(kāi)合法數(shù)據(jù)),但網(wǎng)站不想給你采集而設(shè)置的技術(shù)阻擋措施。

常見(jiàn)的防止采集方案

  • 利用輸入驗(yàn)證碼框驗(yàn)證,在采集某些網(wǎng)站過(guò)程中,要求你輸入驗(yàn)證碼,否則就卡住進(jìn)行不下去。這是網(wǎng)站最常用且最基礎(chǔ)的防采措施之一,它要求你必須你手動(dòng)輸入驗(yàn)證碼里的數(shù)字和字母,才能繼續(xù)看到更多信息或者進(jìn)行下一步,以此來(lái)判斷你是機(jī)器人還是真人。
  • 滑動(dòng)圖片進(jìn)行拼圖驗(yàn)證,它要求你必須滑動(dòng)拼圖到它指定的位置,才能通過(guò)驗(yàn)證進(jìn)行下一步操作。
  • 登錄驗(yàn)證,這類網(wǎng)站通常需要登錄才能看到更豐富的信息,否則只會(huì)展現(xiàn)非常有限的內(nèi)容。
  • 數(shù)據(jù)加密防采集,我們?cè)诰W(wǎng)頁(yè)上看到的內(nèi)容是真實(shí)的,但我們打開(kāi)源代碼看,這段文字被已經(jīng)被加密分離,這樣當(dāng)我們用爬蟲(chóng)工具進(jìn)行數(shù)據(jù)采集時(shí),所采集下來(lái)的數(shù)據(jù)就是各種亂碼,法整合成一段完整的文字。
  • 反饋虛假數(shù)據(jù),這種防止采集的方案是把虛假的數(shù)據(jù)傳遞給爬蟲(chóng)工具,從而防止數(shù)據(jù)被采集。
  • 禁止訪問(wèn)網(wǎng)頁(yè),主要還是看網(wǎng)站的防采機(jī)制設(shè)計(jì),如果觸發(fā)了,通常的結(jié)果就是全面封鎖和禁止。比如封你的賬號(hào)、封你的IP地址。一旦被封鎖,網(wǎng)站會(huì)自動(dòng)給你錯(cuò)誤頁(yè)面或無(wú)法讓你正常瀏覽。

如何利用HTML和自定義字體(web-font)來(lái)實(shí)現(xiàn)數(shù)據(jù)防采集

web-font是CSS3中的一種標(biāo)記 @font-face,在@font-face聲明里,你可以聲明一種字體,指定這種字體字體庫(kù)文件從網(wǎng)絡(luò)某個(gè)地址下載或直接引用本地的自定義字體文件。例如在css中做如下聲明:

@font-face {
    font-family: "icomoon";
    src: url("fonts/icomoon.woff") format("woff"),
             url("fonts/icomoon.ttf") format("truetype"),
             url("fonts/icomoon.eot") format("embedded-opentype"),
             url("fonts/icomoon.svg") format("svg");
}

這樣就成功引入了icomoon這個(gè)自定義字體。

防采集原理:

使用web-font可以從網(wǎng)絡(luò)加載字體,因此我們可以自己創(chuàng)建一套字體,設(shè)置自定義的字符映射關(guān)系表。
例如設(shè)置1f345是映射字符9,1f371是映射字符2,以此類推。
當(dāng)需要顯示字符9時(shí),網(wǎng)頁(yè)的源碼只會(huì)是1f345,被采集的也只會(huì)是1f345,并不是9,使采集者采集不到正確的數(shù)據(jù)。而對(duì)于正常訪問(wèn)的用戶則沒(méi)有影響。對(duì)于中文的防采集不適合使用web-font這種方法,因?yàn)橹形牡淖煮w庫(kù)太大。而對(duì)于數(shù)字,英文則適合使用此方法實(shí)現(xiàn)防采集。

實(shí)例流程

1.創(chuàng)建指定字符的自定義字體
首先選擇一款字體(免費(fèi)且不受版權(quán)影響的字體),下載好字體可以去FONTEK這個(gè)網(wǎng)站快捷轉(zhuǎn)格式上傳ttf文件,點(diǎn)擊下方的生成,將字體文件轉(zhuǎn)為svg格式。

制作svg.png

2.選擇需要使用的字符及設(shè)置字體映射關(guān)系
打開(kāi)網(wǎng)址:icomoon,選擇左上角“import icons”上傳剛剛生成的svg字體,然后選擇要加密的字符進(jìn)行加密,這里我選擇0-9數(shù)字進(jìn)行加密,選擇完成后點(diǎn)擊右下角Generate Font按鈕。
選擇加密字符.png

修改映射.png

把名字也按映射關(guān)系修改,設(shè)置映射關(guān)系后,點(diǎn)擊右下角download下載字體。然后將字體文件放到項(xiàng)目中,并在css中聲明引入的字體。

@font-face {
    font-family: "icomoon";
    src: url("fonts/icomoon.woff") format("woff"),
             url("fonts/icomoon.ttf") format("truetype"),
             url("fonts/icomoon.eot") format("embedded-opentype"),
             url("fonts/icomoon.svg") format("svg");
}

然后需要定義一個(gè)css的class,font-family使用這個(gè)web-font

.number{
    font-family: icomoon;
}

然后根據(jù)之前修改的映射表在HTML中使用各自數(shù)字對(duì)應(yīng)的映射如下

<div class="number">
    &#x1f345 &#x1f371 &#x1f30f &#x1f3c6
</div>

完整HTML代碼如下:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
        <style type="text/css">
            @font-face {
                font-family: "icomoon";
                src: url("fonts/icomoon.woff") format("woff"),
                         url("fonts/icomoon.ttf") format("truetype"),
                         url("fonts/icomoon.eot") format("embedded-opentype"),
                         url("fonts/icomoon.svg") format("svg");
            }
.number{
    font-family: icomoon !important;
}
        </style>
    </head>
    <body>
        <div class="number">
            &#x1f345 &#x1f371 &#x1f30f &#x1f3c6
        </div>
    </body>
</html>

運(yùn)行結(jié)果如下:


加密結(jié)果.png

采集者只能獲取到類似&#x1f345的數(shù)據(jù),并不能知道&#x1f345映射的字符是什么,實(shí)現(xiàn)了數(shù)據(jù)防采集。當(dāng)然采集者可以通過(guò)分析,知道每一個(gè)映射代表的意思,從而進(jìn)行采集后轉(zhuǎn)換處理。 我們可以創(chuàng)建多個(gè)不同的字體文件和映射表。每次訪問(wèn)都隨機(jī)使用一種,并定期更新一批字體文件和映射表,加大采集的難度。 這樣采集者需要把所有的字體文件和映射表都分析并做轉(zhuǎn)換處理,才可能采集到數(shù)據(jù),這樣采集的成本將會(huì)大大增加。(這里前端所展示的數(shù)據(jù)一般都是從后端接口獲取的,所以可以把映射關(guān)系放到后端進(jìn)行處理,前端只負(fù)責(zé)展示編碼即可)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容