自己開發一套反爬蟲系統難嗎?看過來,手把手教你

2021-01-09 王二狗的程序人生

爬蟲,網絡安全最大的威脅之一!

根據爬取數據類型而分,爬蟲有不少種類,比如爬取Email地址的、爬取商品價格的、爬取圖片的,而最多的是爬取內容的,內容數據爬蟲是為泛濫的!

爬蟲讓很多人對其深感苦惱,今天將用Node.JS實現一種防護性能很強的反爬蟲系統。

首先展示防護效果,然後付上完整代碼,以了解實現方法。

防護效果展示

根據兩個核心思路進行效果展示如下:

1、字體加密

創建自定義字體庫,將字體進行加密。

舉一個最直白的例子:

比如要在網頁中顯示文字:「我是我,你是你,她是她」,在正常的情況下,網頁中就是存在這幾個字,爬蟲當然可以爬取。

我們要實現的效果是,讓這幾個字不存在,網頁源碼中可能是:

但是在網頁中可以正常顯示:

但是卻不可複製,複製後,全部或部分內容將不能正常顯示:

2、字體防破解

單純的字體加密,是不太難被破解的,因為上述的「密文亂碼符號」,其實也就是一種對應關係,例如:「A」對應「啊」,「B」對應「不」。只要獲得足夠的對應關係,替換就可以破解還原出原內容。

具體實施時,可以從網頁中獲取字體文件。

如TTF,通過格式轉換,化為TTX,即可得到對應關係。

也可以手動記錄對應關係。

那麼對於這兩種破解,我們也需要進行防護。

1、防止字體文件被下載;

動態字體路徑:

注意以下兩圖,不同的字體路徑:

即:每次訪問都是不同的字體路徑,而且,此動態路徑文件是不可下載的:

當然,文件的正常使用是不受影響的。

2、使用動態對應關係,防止字體對應被獲取。

我們內置一套系統,自動或手動實現編碼變化:

以下兩圖,兩種不同的編碼展示,前面部分是編碼,後面是對應的字:

源碼展示

實現以上功能的代碼並不複雜,本例由兩個文件,一個目錄組成:

acs.js是主文件,內容如下:

/**

* Anti Content Splider

* Auther:WangLiwen

* www.ShareWAF.com

*/

var fs = require('fs')

var font_carrier = require("font-carrier")

var body_parser = require("body-parser")

var mime = require("mime");

//變碼矩陣,存放字和unicode的對應關係

var transfer_result = require("./config").tramsform_matrix;

/**

* TTF變碼

* 基於一種字體,生成另一種新字體

* 參數:ttf,原始字體

* 參數:words,要變碼的字

* 參數:new_ttf,新的字體

* 返回值:新字體中,unicode和字的對應關係

*/

function transform_ttf(ttf,words,new_ttf){

//創建新的空字體

var font = font_carrier.create()

//從ttf字體中獲取文字

var font_transfer = font_carrier.transfer(ttf)

if(words.length==0){

return{};

}

var result={};

var key,value,word;

//遍歷傳入的參數:要變碼的字體

for(var i=0;i<words.length;i++){

//新的unicode

key=""+i;

//unicode對應的字

value=words[i];

//字形

word=font_transfer.getGlyph(words[i]);

//加入到新字體中

font.setGlyph(key,word);

//輸出信息

result[key]=value;

}

//輸出各種字體文件

font.output({

path:new_ttf

})

//返回值

return result;

}

/**

* express web

*/

var express = require('express');

var app = express();

app.use(body_parser.urlencoded({extended: true}));

var port = 8000;

var verstion = "0.0.1";

app.listen(port);

console.log("anti content splider");

console.log("v",verstion);

console.log("server at port:",port);

console.log("auther:","wangliwen");

console.log("copyleft","http://www.sharewaf.com");

//變型url特徵池,存放要保護的ttf路徑,使ttf路徑不洩露

var transform_url = [];

//express中間件

app.use(function(req,res,next){

console.log(req.url,req.method);

if(req.method.toString().toLowerCase() == "get"){

//只處理get請求

//url

var url = req.url;

//首頁訪問

if(url == "/"){

url = "./admin/index.html"

}else{

url = "./admin" + url;

}

//變形url池

console.log(transform_url);

//把變形的url路徑還原回去

for(var i=0; i<transform_url.length; i++){

//當前url,是否包含有變形池中的某條特徵內容

if(url.indexOf(transfor

代碼中已有詳細注釋。

config.js是字體編碼與文字對應關係,源碼中稱為「變碼距陣」,內容如下:

exports.tramsform_matrix={"":"我","":"你","":"他","":"只","":"保","":"碼","":"用","":"。"}

註:當進行動態變碼操作時,此文件內容會發生變化。

admin目錄下,是幾個靜態網頁文件:

index.html內容如下:

<html>

<head>

<meta charset="utf8">

<title>anti content splider</title>

</head>

<body>

<form method="post" action="/transform_ttf" target="_blank">

原始字體:<input id="font_src" name="font_src" type="text" value="KaiGenGothicSC-Normal.ttf" /><br>

變碼字體:<input id="font_dest" name="font_dest" type="text" value="font1" /><br>

變碼文字:<input id="transform_words" name="transform_words" type="text" value="我,你,他,只,保,碼,用" /><br>

<br>

<input type="submit" value="Transform!"/>

</form>

</body>

</html>

test.html是用於測試,展示變碼效果的文件,內容如下:

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>字體測試</title>

</head>

<body>

<div>

<style>

@font-face {

font-family: "font1";

src: url("font_dest/font1.eot"); /* IE9 */

src: url("font_dest/font1.eot?#iefix") format("embedded-opentype"), /* IE6-IE8 */

url("font_dest/font1.woff2") format("woff2"),

url("font_dest/font1.woff") format("woff"),

url("font_dest/font1.ttf") format("truetype"), /* chrome、firefox、opera、Safari, Android, iOS 4.2+*/

url("font_dest/font1.svg#iconfont"); /* iOS 4.1- */

}

.font-1{

font-family:"font1";font-size:16px;font-style:normal;

}

</style>

<div>是,是,是,她是她</div>

<div>ShareWAF(sharewaf.com)不是WAF!</div>

<div>JS代護?混淆?加密,當然JShaman(jshaman.com)!</div>

</div>

</body>

</html>

以上,是完整的動態字體變碼加密反爬蟲方案,出自於ShareWAF,與ShareWAF運營的商業反爬蟲產品:ShareWAF-ACS,原理甚本一至。由此可知,本文是相當有價值的技術資料。

相關焦點

  • 牛逼,看完它,你就可以自己開發爬蟲了
    很多人問寫爬蟲用什麼語言比較好,其實就和談戀愛一樣,沒有最好的,只有最合適的,選擇你最熟悉最順手的語言就好。今年各種需求不斷,寫了幾個爬蟲,都是用的 nodejs。這裡總結一些用 nodejs 寫爬蟲的常用手段,學會了,就能爬取大部分網頁了。
  • 兩年磨一劍開發了這套爬蟲系統(附架構講解)
    做技術最忌諱雜而不精、技術的深度通常是工作驅動的,技術的廣度通常是興趣驅動的拿爬蟲領域來說根據自身面試經歷以及身邊很多爬蟲領域大佬的講述,大部分企業要求有爬蟲系統、爬蟲產品的開發經驗。這是為何呢?有過爬蟲系統及產品研發的工程師證明你在爬蟲這個領域的技術綜合能力是有深度的,從而也將導致你的待遇水漲船高!
  • 常見的反爬蟲技術有哪些?如何防止別人爬自己的網站?
    搜尋引擎可以通過爬蟲抓取網頁信息,同時也有很多企業通過爬蟲獲取其他平臺的信息用於數據分析或者內容優化,但是對於自身網站有些頁面或者信息並不希望被爬蟲抓取,那我們如何來實現反爬蟲技術呢?如何防止別人爬自己的網站呢?
  • 手把手教你打造自己的「阿法狗」
    別裝了,你根本就不懂圍棋,此前也壓根沒聽說過什麼李世石。可你最近還是到處跟人大談「阿法狗」,就好像那就是你姥姥家的旺財一樣。你當然不可能在寵物店找到這隻「阿法狗」,這套大名叫做AlphaGo的智能設備有錢你也買不到。不過,紳寶君能保證你可以輕鬆打造出屬於自己的「阿法狗」——還能到處跑的那種。
  • python開發爬蟲有門檻嗎?
    如果你不是科班出身,沒有開發經驗,初次接觸開發爬蟲這檔子事兒,相信這篇文章能幫到你。python開發爬蟲肯定是有門檻的。儘管python很簡單,上手不難,但是開發起來你會發現,開發爬蟲不只是單單會python就可以了,你還得需要下列這些技能。
  • 你的生活被這些「蟲子」包圍了嗎?爬蟲可以做哪些事?
    杭州某電商公司一位程式設計師告訴記者,我們在使用電腦或手機上的產品、App時,主動或被動留下的個人信息都會留存在網站、App的伺服器上,這些都有可能被爬蟲竊取,就看爬蟲技術高明與否。「之前一家科技公司曾經向我介紹過一個爬蟲產品,說是可以爬取支付寶數據,只需要用支付寶掃描一下二維碼,就可爬取支付寶用戶的真實姓名、手機號、收貨地址、近一年的購物信息、交易記錄等。」
  • Python破解反爬蟲:最新反爬蟲有道翻譯中英文互譯破解,附代碼
    由於爬蟲的出現,導致很多網頁都設置了反爬蟲機制:常見的反爬蟲機制就是在客戶端發出請求的時候,在請求的內容中新增一些內容,而這些內容都是經過「加密的」,每次請求都是不同的,這樣就導致了很多傳統的爬蟲失效。
  • 網站反爬蟲常見方法
    網站為了正常運營,通常會設置各種反爬機制,讓爬蟲知難而退。今天神龍代理IP就給大家盤點一下網站常見的反爬蟲機制。網站反爬蟲常見方法1.通過UA判定UA即User Agent,它是請求瀏覽器的身份標誌。反爬蟲機制通過判定訪問請求的頭部中沒有帶UA來識別爬蟲,這種判定方法很低級,通常不會將其作為唯一的判定標準,因為反反爬蟲非常容易,隨機數UA即可針對。2.通過Cookie判定Cookie就是指會員制的帳號密碼登錄驗證,通過分辨這一個帳號在短期內內爬取頻次來判定。這種方法的反反爬蟲也很費勁,需選用多帳戶的方法來爬取。
  • Python爬蟲和反爬蟲的鬥爭
    在抓取對方網站、APP 應用的相關數據時,經常會遇到一系列的方法阻止爬蟲。網站APP們這麼做的原因,一是為了保證服務的質量,降低伺服器負載,二是為了保護數據不被獲取。爬蟲與反爬蟲的鬥爭經久不衰,這裡神龍IP給大家分享一些常見的反爬蟲手段。
  • 沒人有義務手把手教你,每天到朋友圈裡吸吸氧
    沒人有義務手把手教你  很多實習生都面臨過這樣的窘境:好不容易拿到一個實習機會,心氣兒十足地去上班,可是辦公室裡的前輩既沒時間管你,也沒有耐心告訴你該怎麼做。他們只是不斷地丟事情給你做,沒有一點兒經驗的你一頭霧水,也什麼都不敢說。
  • Python爬蟲從入門到精通只需要三個月
    如何入門Python,為了能夠幫助大家更輕鬆的學好Python開發,Python爬數據,Python數據分析等相關理論知識,給大家共同分享自己一套Python學習生活資料,文章最後面的有附屬的相關資料,無論你是大牛還是小白,是想轉行還是想入行都可以來了解,一起不斷進步以及一起努力學習
  • 手把手教你做一顆氫彈
    氫彈今天小編手把手教你做一顆氫彈,來看具體操作。首先,你最好住在海邊,因為海水裡可以提煉出大量的氘和氚 ,它們都是氫元素的同位素。(氘有兩個中子,氚有三個中子,還有一個中子的氕,自然界中最多的就是氕,水分子裡的氫元素絕大部分都是氕,含有較多氘或氚元素組成的水叫做重水,極其稀少)然後把上一集教大家做好的原子彈拿過來,要是你沒看上集,沒做好原子彈就沒辦法了,趕快回去補課把原子彈做出來。
  • Python,爬蟲開發的不二選擇
    如果我們把網際網路比作一張大的蜘蛛網,數據便是存放於蜘蛛網的各個節點,而爬蟲就是一隻小蜘蛛,沿著網絡抓取自己的獵物(數據)。爬蟲指的是:向網站發起請求,獲取資源後分析並提取有用數據的程序。如今,人類社會已經進入了大數據時代,如何高效的獲取數據,已經成了各個網際網路公司的技術研發重點,掌握爬蟲技術已經成為了大數據公司技術人員不可或缺的一項技能。
  • 看不懂戶型圖?手把手教你避免被「坑」!
    第一次去看房的時候,自然是懵懂得像個青春期少男少女,在銷售的一系列追問下,比如問你是不是第一次買房啊,通過什麼渠道來了解到他們樓盤的等等。 然後就會開始向你專業地介紹樓盤了,之後甩給你一張戶型圖,而你看著圖裡五花八門的標識圖不知所措,甚至連哪裡是房子的入口都不知道!
  • 最全的 Python 反爬蟲及應對方案!
    爬蟲是 Python 的一個常見應用場景,很多練習項目就是讓大家去爬某某網站。爬取網頁的時候,你大概率會碰到一些反爬措施。這種情況下,你該如何應對呢?本文梳理了常見的反爬措施和應對方案。 1.反爬方式:創建無限深度的目錄結構HTTP://example.com/bar/foo/bar/foo/bar/foo/bar /動態頁面,為網絡爬蟲生成無限數量的文檔。如由算法生成雜亂的文章頁面。文檔中填充了大量字符,使解析文檔的詞法分析器崩潰。
  • 手把手教你使用win7電腦放大鏡
    手把手教你使用win7電腦放大鏡時間:2018-03-27 08:25   來源:系統天堂   責任編輯:沫朵 川北在線核心提示:原標題:win7放大鏡怎麼用? 手把手教你使用win7電腦放大鏡 win7放大鏡怎麼用?有時候網頁的字太小,我們會遇到看不清楚的情況,這時候我們可以藉助電腦本身的放大鏡功能,來清晰查看內容。
  • 陰陽師:手把手教你計算帳號價值,最不值錢的是SSR?
    這個遊戲對於多數玩家來講,已經玩了很久,但小夥伴們是否想過,自己玩了這麼久的帳號,能值多少錢呢?或者說,自己在遊戲中所氪的金是否回本了呢?下面就手把手教大家,怎麼計算自己帳號中的物質價值,可要收藏好哦。
  • 教你畫一款適合自己的眼線 小姐姐都看過來吧
    教你畫一款適合自己的眼線 小姐姐都看過來吧時間:2018-11-26 17:06   來源: 網   責任編輯:沫朵 川北在線核心提示:原標題:教你畫一款適合自己的眼線 小姐姐都看過來吧 眼線對於眼睛乃至整個人的氣質來說,作用可是很大的,總是在不知覺中就將眼型的缺陷修飾了,而且還能夠將眼睛放大,看起來非常的有靈氣,真的是整個人的氣質都不一樣哦
  • adobe after effects插件怎麼安裝 手把手教你ae插件怎麼安裝
    adobe after effects插件怎麼安裝 手把手教你ae插件怎麼安裝時間:2017-07-17 15:09   來源:系統天堂   責任編輯:沫朵 川北在線核心提示:原標題:adobe after effects插件怎麼安裝 手把手教你ae插件怎麼安裝 adobe after effects插件怎麼安裝
  • 數據從業者必讀:抓取了一千億個網頁後我才明白,爬蟲一點都不簡單
    當出現這些情況時,Scrapinghub會利用自己開發的基於機器學習的數據析取工具來作為後備,直到爬蟲修復好。這個基於ML的析取工具會自動識別目標網站的目標欄位(產品名稱、價格、貨幣單位、圖像、SKU等)並且返回想要的結果。我們會在未來幾周之內發布這項工具以及相關的指導文章,告訴大家如何將機器學習用到你的數據析取過程當中。