那么,下一步你會考慮到什么?很多站點的工程師會考慮:既然沒辦法阻止對方,那我就讓它變的不可讀吧。我會用圖片來渲染關(guān)鍵信息,比如價格。這樣,人眼可見,機器識別不出來?!?/div>
這個想法曾經(jīng)是正確的,然而,坑爹的技術(shù)發(fā)展,帶給我們一個坑爹的技術(shù),叫機器學(xué)習(xí)。順便帶動了一個行業(yè)的迅猛發(fā)展,叫 OCR。
很快,識別圖像就不再是任何難題了,甚至連人眼都很難識別的驗證碼,有的 OCR 都能搞定,比我肉眼識別率都高。更何況,現(xiàn)在有了打碼平臺,用資本都可以搞定,都不需要技術(shù)。
那么,下一步你會考慮什么?這個時候,后端工程師已經(jīng)沒有太多的辦法可以搞了?!?/div>
不過后端搞不定的事情,一般都推給前端啊,前端從來都是后端搞不定問題時的背鍋俠。
多少年來我們都是這么過來的,前端工程師這個時候就要勇敢地站出來了:“都不要得瑟了,來比比誰的前端知識牛逼,你牛逼我就讓你爬。”
我不知道這篇文章的讀者里有多少前端工程師,我只是想順便提一下:你們以后將會是更加搶手的人才。
前端工程師的逆襲
我們知道,一個數(shù)據(jù)要顯示到前端,不僅僅是后端輸出就完事了,前端要做大量的事情,比如取到 json 之后,至少要用 template 轉(zhuǎn)成 html 吧?
這已經(jīng)是步驟最少最簡單的了,然后你總要用 css 渲染下吧? 這也不是什么難事。
等等,你還記得自己第一次做這個事情的時候的經(jīng)歷嗎?真的,不是什么難事嗎?
有沒有經(jīng)歷過,一個 html 標(biāo)簽拼錯,或者沒有閉合,導(dǎo)致頁面錯亂?一個 css 沒弄好,導(dǎo)致整個頁面都不知道飄到哪去了?
這些事情,你是不是很想讓別人再經(jīng)歷一次?
這件事情充分說明了:讓一個資深的前端工程師來把事情搞復(fù)雜一點,對方如果配備了資深前端工程師來破解,也需要耗費 3 倍以上的時間。
畢竟是讀別人的代碼,別人寫代碼用了一分鐘,你總是要讀兩分鐘,然后罵一分鐘吧?這已經(jīng)算很少的了。如果對方?jīng)]有配備前端工程師。。。那么經(jīng)過一段時間,他們會成長為前端工程師。
之后,由于前端工程師的待遇比爬蟲工程師稍好一些,他們很快會離職做前端,既緩解了前端人才缺口,又可以讓對方缺人,重招。
而他們一般是招后端做爬蟲,這些人需要再接受一次折磨,再次成長為前端工程師,這不是很好的事情嗎?
所以,如果你手下的爬蟲工程師離職率很高,請仔細思考下,是不是自己的招聘方向有問題。
那么前端最坑爹的技術(shù)是什么呢?前端最坑爹的,也是最強大的,就是我們的:JavaScript。
JavaScript 有大量的花樣可以玩,毫不夸張的說,一周換一個 feature(Bug)給對方學(xué)習(xí),一年不帶重樣的。這個時候你就相當(dāng)于一個面試官,對方要通過你的面試才行。
舉個例子,在 Array.prototyp e里,有沒有 map ?。渴裁磿r候有???你說你是 xx 瀏覽器,那你這個應(yīng)該是有還是應(yīng)該沒有???你說這個可以有啊?可是這個真沒有啊。
那[]能不能在 string 里面獲取字符???哪個瀏覽器可以哪個不行?。窟?!你為什么支持 WebKit 前綴???等等,剛剛你還支持怎么現(xiàn)在不支持了啊?你聲明的不對啊。
這些對于前端都是簡單的知識,已經(jīng)習(xí)以為常了,但是對于后端來說簡直就是噩夢。
然而,前端人員自己作死,研究出了一個東西,叫:Nodejs?;?V8,秒殺所有的 js 運行。
不過 Nodejs 實現(xiàn)了大量的 feature,都是瀏覽器不存在的,你隨隨便便訪問一些東西(比如你為什么會支持 process.exit),都會把 node 坑的好慘好慘。
而且瀏覽器里的 js,你拉到后臺用 Nodejs 跑,你是不是想到了什么安全漏洞?這個是不是叫,代碼與數(shù)據(jù)混合?如果他在 js 里跑點惡心的代碼,瀏覽器不支持但是 node 支持怎么辦?
還好,爬蟲工程師還有 phantomjs。但是,你怎么沒有定位啊? 哈哈,你終于模擬出了定位。
但是不對啊,根據(jù)我當(dāng)前設(shè)置的安全策略你現(xiàn)在不應(yīng)該能定位???你是怎么定出來的?連 phantomjs 的作者自己都維護不下去了,你真的愿意繼續(xù)用嗎?
當(dāng)然了,最終,所有的反爬蟲策略都逃不脫被破解的命運。但是這需要時間,反爬蟲需要做的就是頻繁發(fā)布,拖垮對方。
如果對方兩天可以破解你的系統(tǒng),你就一天一發(fā)布,那么你就是安全的。這個系統(tǒng)甚至可以改名叫做“每天一道反爬題,輕輕松松學(xué)前端”。
誤傷,還是誤傷
這又回到了我們開始提到的“誤傷率”的問題了。我們知道,發(fā)布越頻繁,出問題的概率越高。那么,如何在頻繁發(fā)布的情況下,還能做到少出問題呢?
此外還有一個問題,我們寫了大量的“不可讀代碼”給對方,的確能給對方造成大量的壓力,但是,這些代碼我們自己也要維護啊。
如果有一天忽然說,沒人爬我們了,你們把代碼下線掉吧。這個時候?qū)懘a的人已經(jīng)不在了,你們怎么知道如何下線這些代碼呢?
這兩個問題我暫時不能公布我們的做法,但是大家都是聰明人,應(yīng)該都是有自己的方案的,軟件行業(yè)之所以忙的不得了,無非就是在折騰兩件事,一個是如何將代碼拆分開,一個是如何將代碼合并起來。
關(guān)于誤傷率,我只提一個小的 tip:你可以只開啟反爬蟲,但是不攔截,先放著,發(fā)統(tǒng)計信息給自己,相當(dāng)于模擬演練。
等統(tǒng)計的差不多了,發(fā)現(xiàn)真的開啟了也不會有什么問題,那就開啟攔截或者開啟造假。
這里就引發(fā)了一個問題,往往一個公司的各個頻道,爬取難度是不一樣的。原因就是,誤傷檢測這種東西與業(yè)務(wù)相關(guān),公司的基礎(chǔ)部門很難做出通用的,只能各個部門自己做,甚至有的部門做了有的沒做。
因此引發(fā)了爬蟲界一個奇葩的通用做法:如果 PC 頁面爬不到,就去 H5 試試,如果 H5 很麻煩,就去 PC 碰碰運氣。
爬蟲反爬蟲套路現(xiàn)狀
那么一旦有發(fā)現(xiàn)對方數(shù)據(jù)造假怎么辦?
早期的時候,大家都是要抽查數(shù)據(jù),通過數(shù)據(jù)來檢測對方是否有造假,這個需要人工核對,成本非常高。
可是那已經(jīng)是洪荒時代的事情了。如果你們公司還在通過這種方式來檢測,說明你們的技術(shù)還比較落伍。
之前我們的競爭對手是這么干的:他們會抓取我們兩次,一次是他們解密出來 key 之后,用正經(jīng)方式來抓取,這次的結(jié)果定為 A。
一次是不帶 key,直接來抓,這次的結(jié)果定為 B。根據(jù)前文描述,我們可以知道,B 一定是錯誤的。那么如果 A 與 B 相等,說明自己中招了,這個時候會停掉爬蟲,重新破解。
不要回應(yīng)
所以之前有一篇關(guān)于爬蟲的文章,說如何破解我們的。一直有人要我回復(fù)下,我一直覺得沒什么可以回復(fù)的。
第一,反爬蟲被破解了是正常的。這個世界上有個萬能的爬蟲手段,叫“人肉爬蟲”。
假設(shè)我們就是有錢,在印度開個分公司,每天雇便宜的勞動力用鼠標(biāo)直接來點,你能拿我怎么辦?
第二,我們真正關(guān)心的是后續(xù)的這些套路。而我讀了那篇文章,發(fā)現(xiàn)只是調(diào)用了selenium并且拿到了結(jié)果,就認為自己成功了。
我相信你讀到這里,應(yīng)該已經(jīng)明白為什么我不愿意回復(fù)了。我們最重要的是工作,而不是誰打誰的臉。
大家如果經(jīng)常混技術(shù)社區(qū)就會發(fā)現(xiàn),每天熱衷于打別人臉的,一般技術(shù)都不是很好。
當(dāng)然這并不代表我們技術(shù)天下第一什么的,我們每天面對大量的爬蟲,還是遇到過很多高手的。
就如同武俠小說里一樣,高手一般都比較低調(diào),他們默默地拿走數(shù)據(jù),很難被發(fā)現(xiàn),而且頻率極低,不會影響我們的考評。你們應(yīng)該明白,這是智商與情商兼具的高手了。
我們還碰到拉走我們 js,砍掉無用的部分直接解出 key,相當(dāng)高效不拖泥帶水的爬蟲,一點廢請求都沒有(相比某些爬蟲教程,總是教你多訪問,寫沒用的 url 免得被發(fā)現(xiàn),真的不知道高到哪里去了。這樣做除了會導(dǎo)致機器報警,導(dǎo)致對方加班封鎖以外,對你自己沒有任何好處)。
而我們能發(fā)現(xiàn)這一點僅僅是是因為他低調(diào)地寫了一篇博客,通篇只介紹技術(shù),沒有提任何沒用的東西。
這里我只是順便發(fā)了點小牢騷,就是希望后續(xù)不要總是有人讓我回應(yīng)一些關(guān)于爬蟲的文章。
線下我認識很多爬蟲工程師,水平真的很好,也真的很低調(diào)(不然你以為我是怎么知道如何對付爬蟲的。。。),大家都是一起混的,不會產(chǎn)生“一定要互相打臉”的情緒。
進化
早期我們和競爭對手打的時候,雙方的技術(shù)都比較初級。后來慢慢的,爬蟲在升級,反爬蟲也在升級,這個我們稱為“進化”。
我們曾經(jīng)給對方放過水,來試圖拖慢他們的進化速度,然而,效果不是特別理想。爬蟲是否進化,取決于爬蟲工程師自己的 KPI,而不是反爬蟲的進化速度。
后期打到白熱化的時候,用的技術(shù)越來越匪夷所思。舉個例子,很多人會提,做反爬蟲會用到 canvas 指紋,并認為是高境界。
其實這個對于反爬蟲來說也只是個輔助,canvas 指紋的含義是,因為不同硬件對 canvas 支持不同,因此你只要畫一個很復(fù)雜的 canvas,那么得出的 image,總是存在像素級別的誤差。
考慮到爬蟲代碼都是統(tǒng)一的,就算起 selenium,也是 Ghost 的,因此指紋一般都是一致的,因此繞過幾率非常低。
但是!這個東西天生有兩個缺陷。
第一是,無法驗證合法性。當(dāng)然了,你可以用非對稱加密來保證合法,但是這個并不靠譜。
其次,canvas 的沖突概率非常高,遠遠不是作者宣稱的那樣,沖突率極低。也許在國外沖突是比較低,因為國外的語言比較多。但是國內(nèi)公司通常是 IT 統(tǒng)一裝機,無論是軟件還是硬件都驚人的一致。
我們測試 canvas 指紋的時候,在攜程內(nèi)部隨便找了 20 多臺機器,得出的指紋都完全一樣,一丁點差別都沒有。因此,有些“高級技巧”一點都不實用。
法律途徑
此外就是大家可能都考慮過的:爬蟲違法嗎?能起訴對方讓對方不爬嗎?法務(wù)給的答案到是很干脆,可以,前提是證據(jù)。
遺憾的是,這個世界上大部分的爬蟲爬取數(shù)據(jù)是不會公布到自己網(wǎng)站的,只是用于自己的數(shù)據(jù)分析。
因此,即使有一些關(guān)于爬蟲的官司做為先例,并且已經(jīng)打完了,依然對我們沒有任何幫助。反爬蟲,在對方足夠低調(diào)的情況下,注定還是個技術(shù)活。
搞事情,立 Flag
到了后來,我們已經(jīng)不再局限于打打技術(shù)了,反爬蟲的代碼里我們經(jīng)常埋點小彩蛋給對方,比如寫點注釋給對方。雙方通過互相交戰(zhàn),頻繁發(fā)布,居然聊的挺 high 的。
比如問問對方,北京房價是不是很高???對方回應(yīng),歐巴,我可是憑本事吃飯哦。繼續(xù)問,搖到號了嗎?諸如此類等等。
這樣的事情你來我往的,很容易動搖對方的軍心,還是很有作用的。試想一下,如果你的爬蟲工程師在大年三十還苦逼加班的時候,看到對方留言說自己拿到了 n 個月的年終獎,你覺得你的工程師,離辭職還遠嗎?
最后,我們終于搞出了大動作,覺得一定可以坑對方很久了。我們還特意去一家小火鍋店吃了一頓,慶祝一下,準(zhǔn)備明天上線。
大家都知道,一般立 Flag 的下場都比較慘的,兩個小時的自助火鍋,我們剛吃五分鐘,就得到了我們投資競爭對手的消息。
后面的一個多小時,團隊氣氛都很尷尬,誰也說不出什么話。我們組有個實習(xí)生,后來鼓足勇氣問了我一個問題:“我還能留下來嗎?”
畢竟,大部分情況下,技術(shù)還是要屈服于資本的力量。
爬蟲反爬蟲的未來
與競爭對手和解之后,我們?nèi)グ菰L對方,大家坐在了一起。之前網(wǎng)上自稱妹子的,一個個都是五大三粗的漢子,這讓我們相當(dāng)絕望。
在場唯一的一個妹子還是我們自己帶過去的(就是上面提到的實習(xí)生),感覺套路了這么久,最終還是被對方套路了。
好在,吃的喝的都很好,大家玩的還是比較 high 的。后續(xù)就是和平年代啦,大家不打仗了,反爬蟲的邏輯扔在那做個防御,然后就開放白名單允許對方爬取了。
群里經(jīng)常叫的就是:xxx 你怎么頻率這么高,xxx 你為什么這個接口沒給我開放,為什么我爬的東西不對我靠你是不是把我封了啊,諸如此類的。
和平年代的反爬蟲比戰(zhàn)爭年代還難做,因為戰(zhàn)爭年代,誤傷率只要不是太高,公司就可以接受。
和平年代大家不能搞事情,誤傷率稍稍多一點,就會有人叫:好好的不賺錢,瞎搞什么搞。
此外,戰(zhàn)爭年代只要不攔截用戶,就不算誤傷。和平年代還要考慮白名單,攔截了合作伙伴也是誤傷,因此各方面會更保守一些。
不過,總體來說還是和平年代比較 happy,畢竟,誰會喜歡沒事加班玩呢。
然而和平持續(xù)的不是很久,很快就有了新的競爭對手選擇爬蟲來與我們打,畢竟,這是一個利益驅(qū)使的世界。
只要有大量的利潤,資本家就會殺人放火,這不是我們這些技術(shù)人員可以決定的,我們希望天下無蟲,但是我們又有什么權(quán)利呢。
好在,這樣可以催生更多的職位,順便提高大家的身價,也算是個好事情吧。