然而這就是程序員的宿命。不管這個(gè)行業(yè)有多么的不陽(yáng)光,依然無(wú)法阻擋大量的人進(jìn)入這個(gè)行業(yè),因?yàn)橛泄镜男枨蟆?/div>
反爬蟲(chóng)很好理解,有了爬蟲(chóng)我們自然要反爬蟲(chóng)。對(duì)于程序員來(lái)說(shuō),哪怕僅僅是出于“我就是要證明我技術(shù)比你好”的目的,也會(huì)去做。
對(duì)于公司來(lái)說(shuō),意義更加重大,最少,也能降低服務(wù)器負(fù)載,光憑這一點(diǎn),反爬蟲(chóng)就有充足的生存價(jià)值。
那么爬蟲(chóng)呢?最早的爬蟲(chóng)起源于搜索引擎。搜索引擎是善意的爬蟲(chóng),可以檢索你的一切信息,并提供給其他用戶訪問(wèn)。為此他們還專門(mén)定義了 robots.txt 文件,作為君子協(xié)定,這是一個(gè)雙贏的局面。
然而事情很快被一些人破壞了,爬蟲(chóng)很快就變的不再“君子”了。后來(lái)有了“大數(shù)據(jù)”,無(wú)數(shù)的媒體鼓吹大數(shù)據(jù)是未來(lái)的趨勢(shì),吸引了一批又一批的炮灰去創(chuàng)辦大數(shù)據(jù)公司。
這些人手頭根本沒(méi)有大數(shù)據(jù),他們的數(shù)據(jù)只要用一個(gè) U 盤(pán)就可以裝的下,怎么好意思叫大數(shù)據(jù)呢?
這么點(diǎn)數(shù)據(jù)根本忽悠不了投資者,于是他們開(kāi)始寫(xiě)爬蟲(chóng),拼命地爬取各個(gè)公司的數(shù)據(jù)。很快他們的數(shù)據(jù),就無(wú)法用一個(gè) U 盤(pán)裝下了。這個(gè)時(shí)候終于可以休息休息,然后出去吹噓融資啦。
爬蟲(chóng)反爬蟲(chóng)運(yùn)行現(xiàn)狀
電子商務(wù)行業(yè)的爬蟲(chóng)與反爬蟲(chóng)更有趣一些,最初的爬蟲(chóng)需求來(lái)源于比價(jià)。
這是某些電商網(wǎng)站的核心業(yè)務(wù),大家買(mǎi)商品的時(shí)候,是一個(gè)價(jià)格敏感型用戶的話,很可能用過(guò)網(wǎng)上的比價(jià)功能(真心很好用啊)。
毫無(wú)懸念,他們會(huì)使用爬蟲(chóng)技術(shù)來(lái)爬取所有相關(guān)電商的價(jià)格。他們的爬蟲(chóng)還是比較溫柔的,對(duì)大家的服務(wù)器不會(huì)造成太大的壓力。
然而,這并不意味著大家喜歡被他爬取,畢竟這對(duì)其他電商是不利的,于是需要通過(guò)技術(shù)手段來(lái)做反爬蟲(chóng)。
按照技術(shù)人員的想法,對(duì)方用技術(shù)懟過(guò)來(lái),我們就要用技術(shù)懟回去,不能慫啊。這個(gè)想法是很好的,但是實(shí)際應(yīng)用起來(lái)根本不是這么回事。
誠(chéng)然,技術(shù)是很重要的,但是實(shí)際操作上,更重要的是套路。誰(shuí)的套路更深,誰(shuí)就能玩弄對(duì)方于鼓掌之中。
誰(shuí)的套路不行,有再好的技術(shù),也只能被耍的團(tuán)團(tuán)轉(zhuǎn)。這個(gè)雖然有點(diǎn)傷技術(shù)人員的自尊,然而,我們也不是第一天被傷自尊了。大家應(yīng)該早就習(xí)慣了吧。
真實(shí)世界的爬蟲(chóng)比例
大家應(yīng)該聽(tīng)過(guò)一句話吧,大概意思是說(shuō),整個(gè)互聯(lián)網(wǎng)上大概有 50% 以上的流量其實(shí)是爬蟲(chóng)。
第一次聽(tīng)這句話的時(shí)候,我還不是很相信,我覺(jué)得這個(gè)說(shuō)法實(shí)在是太夸張了。怎么可能爬蟲(chóng)比人還多呢? 爬蟲(chóng)畢竟只是個(gè)輔助而已。
現(xiàn)在做了這么久的反爬蟲(chóng),我依然覺(jué)得這句話太夸張了。50%?你在逗我?就這么少的量?
舉個(gè)例子,某公司,某個(gè)頁(yè)面的接口,每分鐘訪問(wèn)量是 1.2 萬(wàn)左右,這里面有多少是正常用戶呢?50%?60%?還是?
正確答案是:500 以下。也就是說(shuō),一個(gè)單獨(dú)的頁(yè)面,12000 的訪問(wèn)量里,有 500 是正常用戶,其余是爬蟲(chóng)。
注意,統(tǒng)計(jì)爬蟲(chóng)的時(shí)候,考慮到你不可能識(shí)別出所有的爬蟲(chóng),因此,這 500 個(gè)用戶里面,其實(shí)還隱藏著一些爬蟲(chóng)。
那么爬蟲(chóng)率大概是:(12000-500)/12000=95.8%。
這個(gè)數(shù)字你猜到了嗎?這么大的爬蟲(chóng)量,這么少的用戶量,大家到底是在干什么?是什么原因?qū)е铝嗣髅魇前偃思?jí)別的生意,卻需要萬(wàn)級(jí)別的爬蟲(chóng)來(lái)做輔助? 95% 以上,19 保 1?
答案可能會(huì)相當(dāng)令人噴飯,這些爬蟲(chóng)大部分是由于決策失誤導(dǎo)致的。
哭笑不得的決策思路
舉個(gè)例子,這個(gè)世界存在 3 家公司,售賣(mài)相同的電商產(chǎn)品,三家公司的名字分別是 A,B,C。
這個(gè)時(shí)候,客戶去 A 公司查詢了下某商品的價(jià)格,看了下發(fā)現(xiàn)價(jià)格不好,于是他不打算買(mǎi)了,他對(duì)整個(gè)行業(yè)的訂單貢獻(xiàn)為 0。
然而 A 公司的后臺(tái)會(huì)檢測(cè)到,我們有個(gè)客戶流失了,原因是他來(lái)查詢了一個(gè)商品,這個(gè)商品我們的價(jià)格不好,沒(méi)關(guān)系,我去爬爬別人試試。
于是他分別爬取了 B 公司和 C 公司,B 公司的后臺(tái)檢測(cè)到有人來(lái)查詢價(jià)格,但是呢,最終沒(méi)有下單。
他會(huì)認(rèn)為,嗯,我們流失了一個(gè)客戶。怎么辦呢?我可以爬爬看,別人什么價(jià)格。
于是他爬取了 A 和 C,C 公司的后臺(tái)檢測(cè)到有人來(lái)查詢價(jià)格。。。。。
過(guò)了一段時(shí)間,三家公司的服務(wù)器分別報(bào)警,訪問(wèn)量過(guò)高。三家公司的 CTO 也很納悶,沒(méi)有生成任何訂單啊,怎么訪問(wèn)量這么高?
一定是其他兩家禽獸寫(xiě)的爬蟲(chóng)沒(méi)有限制好頻率。媽的,老子要報(bào)仇!于是分別做反爬蟲(chóng),不讓對(duì)方抓自己的數(shù)據(jù)。
然后進(jìn)一步強(qiáng)化自己的爬蟲(chóng)團(tuán)隊(duì)抓別人的數(shù)據(jù)。一定要做到:寧叫我抓天下人,休叫天下人抓我。
然后,做反爬蟲(chóng)的就要加班天天研究如何攔截爬蟲(chóng),做爬蟲(chóng)的被攔截了,就要天天研究如何破解反爬蟲(chóng)策略。
大家就這么把資源全都浪費(fèi)在沒(méi)用的地方了,直到大家合并了,才會(huì)心平氣和的坐下來(lái)談?wù)劊忌僮c(diǎn)。
最近國(guó)內(nèi)的公司有大量的合并,我猜這種“心平氣和”應(yīng)該不少吧?
爬蟲(chóng)反爬蟲(chóng)技術(shù)現(xiàn)狀
下面我們談?wù)劊老x(chóng)和反爬蟲(chóng)分別都是怎么做的。
為 Python 平反
首先是爬蟲(chóng),爬蟲(chóng)教程你到處都可以搜的到,大部分是 Python 寫(xiě)的。
我曾經(jīng)在一篇文章提到過(guò):用 Python 寫(xiě)的爬蟲(chóng)是最薄弱的,因?yàn)樘焐⒉贿m合破解反爬蟲(chóng)邏輯,因?yàn)榉磁老x(chóng)都是用 JavaScript 來(lái)處理。
然而慢慢的,我發(fā)現(xiàn)這個(gè)理解有點(diǎn)問(wèn)題(當(dāng)然我如果說(shuō)我當(dāng)時(shí)是出于工作需要而有意黑 Python,你們信嗎。。。)。
Python 的確不適合寫(xiě)反爬蟲(chóng)邏輯,但是 Python 是一門(mén)膠水語(yǔ)言,他適合捆綁任何一種框架。
而反爬蟲(chóng)策略經(jīng)常會(huì)變化的翻天覆地,需要對(duì)代碼進(jìn)行大刀闊斧的重構(gòu),甚至重寫(xiě)。這種情況下,Python 不失為一種合適的解決方案。
舉個(gè)例子,你之前是用 selenium 爬取對(duì)方的站點(diǎn),后來(lái)你發(fā)現(xiàn)自己被封了,而且封鎖方式十分隱蔽,完全搞不清到底是如何封的,你會(huì)怎么辦?你會(huì)跟蹤 selenium 的源碼來(lái)找到出錯(cuò)的地方嗎?
你不會(huì),你只會(huì)換個(gè)框架,用另一種方式來(lái)爬取,然后你就把兩個(gè)框架都淺嘗輒止地用了下,一個(gè)都沒(méi)有深入研究過(guò)。
因?yàn)闆](méi)等你研究好,也許人家又換方式了,你不得不再找個(gè)框架來(lái)爬取。畢竟,老板等著明天早上開(kāi)會(huì)要數(shù)據(jù)呢。
老板一般都是早上八九點(diǎn)開(kāi)會(huì),所以你七點(diǎn)之前必須搞定。等你厭倦了,打算換個(gè)工作的時(shí)候,簡(jiǎn)歷上又只能寫(xiě)“了解 n 個(gè)框架的使用”,僅此而已。
這就是爬蟲(chóng)工程師的宿命,爬蟲(chóng)工程師比外包還可憐。外包雖然不容易積累技術(shù),但是好歹有正常上下班時(shí)間,爬蟲(chóng)工程師連這個(gè)權(quán)利都沒(méi)有。
然而反爬蟲(chóng)工程師就不可憐了嗎?也不是的,反爬蟲(chóng)有個(gè)天生的死穴,就是:誤傷率。
無(wú)法繞開(kāi)的誤傷率
我們首先談?wù)劊鎸?duì)對(duì)方的爬蟲(chóng),你的第一反應(yīng)是什么?
如果限定時(shí)間的話,大部分人給我的答案都是:封殺對(duì)方的 IP。
然而,問(wèn)題就出在,IP 不是每人一個(gè)的,大的公司有出口 IP,ISP 有的時(shí)候會(huì)劫持流量讓你們走代理,有的人天生喜歡掛代理,有的人為了翻墻 24 小時(shí)掛 VPN。
最坑的是,現(xiàn)在是移動(dòng)互聯(lián)網(wǎng)時(shí)代,你如果封了一個(gè) IP?不好意思,這是中國(guó)聯(lián)通的 4G 網(wǎng)絡(luò),5 分鐘之前還是別人,5 分鐘之后就換人了哦!
因此,封 IP 的誤傷指數(shù)高,并且,效果又是最差的,因?yàn)楝F(xiàn)在即使是最菜的新手,也知道用代理池了。
你們可以去淘寶看下,幾十萬(wàn)的代理價(jià)值多少錢(qián)?我們就不談到處都有的免費(fèi)代理了。
也有人說(shuō):我可以掃描對(duì)方端口,如果開(kāi)放了代理端口,那就意味著是個(gè)代理,我就可以封殺了呀。
事實(shí)是殘酷的,我曾經(jīng)封殺過(guò)一個(gè) IP,因?yàn)樗_(kāi)放了一個(gè)代理端口,而且是個(gè)很小眾的代理端口。
不出一天就有人來(lái)報(bào)事件,說(shuō)我們一個(gè)分公司被攔截了,我一查 IP,還真是我封的 IP。
我就很郁悶地問(wèn)他們 IT,開(kāi)這個(gè)端口干什么?他說(shuō)做郵件服務(wù)器啊。我說(shuō)為啥要用這么奇怪的端口?他說(shuō),這不是怕別人猜出來(lái)么?我就隨便取了個(gè)。
掃描端口的進(jìn)階版,還有一種方式,就是去訂單庫(kù)查找這個(gè) IP 是否下過(guò)訂單,如果沒(méi)有,那么就是安全的;如果有,那就不安全,有很多網(wǎng)站會(huì)使用這個(gè)方法。
然而這只是一種自欺欺人的辦法而已,只需要下一單,就可以永久洗白自己的 IP,天下還有比這更便宜的生意嗎?
因此,封 IP,以及封 IP 的進(jìn)階版:掃描端口再封 IP,都是沒(méi)用的。根本不要考慮從 IP 下手,因?yàn)閷?duì)手會(huì)用大量的時(shí)間考慮如何躲避 IP 封鎖,你干嘛和人家硬碰呢?這沒(méi)有任何意義。
那么,下一步你會(huì)考慮到什么?很多站點(diǎn)的工程師會(huì)考慮:既然沒(méi)辦法阻止對(duì)方,那我就讓它變的不可讀吧。我會(huì)用圖片來(lái)渲染關(guān)鍵信息,比如價(jià)格。這樣,人眼可見(jiàn),機(jī)器識(shí)別不出來(lái)。
這個(gè)想法曾經(jīng)是正確的,然而,坑爹的技術(shù)發(fā)展,帶給我們一個(gè)坑爹的技術(shù),叫機(jī)器學(xué)習(xí)。順便帶動(dòng)了一個(gè)行業(yè)的迅猛發(fā)展,叫 OCR。
很快,識(shí)別圖像就不再是任何難題了,甚至連人眼都很難識(shí)別的驗(yàn)證碼,有的 OCR 都能搞定,比我肉眼識(shí)別率都高。更何況,現(xiàn)在有了打碼平臺(tái),用資本都可以搞定,都不需要技術(shù)。
那么,下一步你會(huì)考慮什么?這個(gè)時(shí)候,后端工程師已經(jīng)沒(méi)有太多的辦法可以搞了。
不過(guò)后端搞不定的事情,一般都推給前端啊,前端從來(lái)都是后端搞不定問(wèn)題時(shí)的背鍋俠。
多少年來(lái)我們都是這么過(guò)來(lái)的,前端工程師這個(gè)時(shí)候就要勇敢地站出來(lái)了:“都不要得瑟了,來(lái)比比誰(shuí)的前端知識(shí)牛逼,你牛逼我就讓你爬。”
我不知道這篇文章的讀者里有多少前端工程師,我只是想順便提一下:你們以后將會(huì)是更加搶手的人才。
前端工程師的逆襲
我們知道,一個(gè)數(shù)據(jù)要顯示到前端,不僅僅是后端輸出就完事了,前端要做大量的事情,比如取到 json 之后,至少要用 template 轉(zhuǎn)成 html 吧?
這已經(jīng)是步驟最少最簡(jiǎn)單的了,然后你總要用 css 渲染下吧? 這也不是什么難事。
等等,你還記得自己第一次做這個(gè)事情的時(shí)候的經(jīng)歷嗎?真的,不是什么難事嗎?
有沒(méi)有經(jīng)歷過(guò),一個(gè) html 標(biāo)簽拼錯(cuò),或者沒(méi)有閉合,導(dǎo)致頁(yè)面錯(cuò)亂?一個(gè) css 沒(méi)弄好,導(dǎo)致整個(gè)頁(yè)面都不知道飄到哪去了?
這些事情,你是不是很想讓別人再經(jīng)歷一次?
這件事情充分說(shuō)明了:讓一個(gè)資深的前端工程師來(lái)把事情搞復(fù)雜一點(diǎn),對(duì)方如果配備了資深前端工程師來(lái)破解,也需要耗費(fèi) 3 倍以上的時(shí)間。
畢竟是讀別人的代碼,別人寫(xiě)代碼用了一分鐘,你總是要讀兩分鐘,然后罵一分鐘吧?這已經(jīng)算很少的了。如果對(duì)方?jīng)]有配備前端工程師。。。那么經(jīng)過(guò)一段時(shí)間,他們會(huì)成長(zhǎng)為前端工程師。
之后,由于前端工程師的待遇比爬蟲(chóng)工程師稍好一些,他們很快會(huì)離職做前端,既緩解了前端人才缺口,又可以讓對(duì)方缺人,重招。
而他們一般是招后端做爬蟲(chóng),這些人需要再接受一次折磨,再次成長(zhǎng)為前端工程師,這不是很好的事情嗎?
所以,如果你手下的爬蟲(chóng)工程師離職率很高,請(qǐng)仔細(xì)思考下,是不是自己的招聘方向有問(wèn)題。
那么前端最坑爹的技術(shù)是什么呢?前端最坑爹的,也是最強(qiáng)大的,就是我們的:JavaScript。
JavaScript 有大量的花樣可以玩,毫不夸張的說(shuō),一周換一個(gè) feature(Bug)給對(duì)方學(xué)習(xí),一年不帶重樣的。這個(gè)時(shí)候你就相當(dāng)于一個(gè)面試官,對(duì)方要通過(guò)你的面試才行。
舉個(gè)例子,在 Array.prototyp e里,有沒(méi)有 map 啊?什么時(shí)候有啊?你說(shuō)你是 xx 瀏覽器,那你這個(gè)應(yīng)該是有還是應(yīng)該沒(méi)有啊?你說(shuō)這個(gè)可以有啊?可是這個(gè)真沒(méi)有啊。
那[]能不能在 string 里面獲取字符啊?哪個(gè)瀏覽器可以哪個(gè)不行啊?咦!你為什么支持 WebKit 前綴啊?等等,剛剛你還支持怎么現(xiàn)在不支持了啊?你聲明的不對(duì)啊。
這些對(duì)于前端都是簡(jiǎn)單的知識(shí),已經(jīng)習(xí)以為常了,但是對(duì)于后端來(lái)說(shuō)簡(jiǎn)直就是噩夢(mèng)。
然而,前端人員自己作死,研究出了一個(gè)東西,叫:Nodejs。基于 V8,秒殺所有的 js 運(yùn)行。
不過(guò) Nodejs 實(shí)現(xiàn)了大量的 feature,都是瀏覽器不存在的,你隨隨便便訪問(wèn)一些東西(比如你為什么會(huì)支持 process.exit),都會(huì)把 node 坑的好慘好慘。
而且瀏覽器里的 js,你拉到后臺(tái)用 Nodejs 跑,你是不是想到了什么安全漏洞?這個(gè)是不是叫,代碼與數(shù)據(jù)混合?如果他在 js 里跑點(diǎn)惡心的代碼,瀏覽器不支持但是 node 支持怎么辦?
還好,爬蟲(chóng)工程師還有 phantomjs。但是,你怎么沒(méi)有定位啊? 哈哈,你終于模擬出了定位。
但是不對(duì)啊,根據(jù)我當(dāng)前設(shè)置的安全策略你現(xiàn)在不應(yīng)該能定位啊?你是怎么定出來(lái)的?連 phantomjs 的作者自己都維護(hù)不下去了,你真的愿意繼續(xù)用嗎?
當(dāng)然了,最終,所有的反爬蟲(chóng)策略都逃不脫被破解的命運(yùn)。但是這需要時(shí)間,反爬蟲(chóng)需要做的就是頻繁發(fā)布,拖垮對(duì)方。
如果對(duì)方兩天可以破解你的系統(tǒng),你就一天一發(fā)布,那么你就是安全的。這個(gè)系統(tǒng)甚至可以改名叫做“每天一道反爬題,輕輕松松學(xué)前端”。
誤傷,還是誤傷
這又回到了我們開(kāi)始提到的“誤傷率”的問(wèn)題了。我們知道,發(fā)布越頻繁,出問(wèn)題的概率越高。那么,如何在頻繁發(fā)布的情況下,還能做到少出問(wèn)題呢?
此外還有一個(gè)問(wèn)題,我們寫(xiě)了大量的“不可讀代碼”給對(duì)方,的確能給對(duì)方造成大量的壓力,但是,這些代碼我們自己也要維護(hù)啊。
如果有一天忽然說(shuō),沒(méi)人爬我們了,你們把代碼下線掉吧。這個(gè)時(shí)候?qū)懘a的人已經(jīng)不在了,你們?cè)趺粗廊绾蜗戮€這些代碼呢?
這兩個(gè)問(wèn)題我暫時(shí)不能公布我們的做法,但是大家都是聰明人,應(yīng)該都是有自己的方案的,軟件行業(yè)之所以忙的不得了,無(wú)非就是在折騰兩件事,一個(gè)是如何將代碼拆分開(kāi),一個(gè)是如何將代碼合并起來(lái)。
關(guān)于誤傷率,我只提一個(gè)小的 tip:你可以只開(kāi)啟反爬蟲(chóng),但是不攔截,先放著,發(fā)統(tǒng)計(jì)信息給自己,相當(dāng)于模擬演練。
等統(tǒng)計(jì)的差不多了,發(fā)現(xiàn)真的開(kāi)啟了也不會(huì)有什么問(wèn)題,那就開(kāi)啟攔截或者開(kāi)啟造假。
這里就引發(fā)了一個(gè)問(wèn)題,往往一個(gè)公司的各個(gè)頻道,爬取難度是不一樣的。原因就是,誤傷檢測(cè)這種東西與業(yè)務(wù)相關(guān),公司的基礎(chǔ)部門(mén)很難做出通用的,只能各個(gè)部門(mén)自己做,甚至有的部門(mén)做了有的沒(méi)做。
因此引發(fā)了爬蟲(chóng)界一個(gè)奇葩的通用做法:如果 PC 頁(yè)面爬不到,就去 H5 試試,如果 H5 很麻煩,就去 PC 碰碰運(yùn)氣。

爬蟲(chóng)反爬蟲(chóng)套路現(xiàn)狀
那么一旦有發(fā)現(xiàn)對(duì)方數(shù)據(jù)造假怎么辦?
早期的時(shí)候,大家都是要抽查數(shù)據(jù),通過(guò)數(shù)據(jù)來(lái)檢測(cè)對(duì)方是否有造假,這個(gè)需要人工核對(duì),成本非常高。
可是那已經(jīng)是洪荒時(shí)代的事情了。如果你們公司還在通過(guò)這種方式來(lái)檢測(cè),說(shuō)明你們的技術(shù)還比較落伍。
之前我們的競(jìng)爭(zhēng)對(duì)手是這么干的:他們會(huì)抓取我們兩次,一次是他們解密出來(lái) key 之后,用正經(jīng)方式來(lái)抓取,這次的結(jié)果定為 A。
一次是不帶 key,直接來(lái)抓,這次的結(jié)果定為 B。根據(jù)前文描述,我們可以知道,B 一定是錯(cuò)誤的。那么如果 A 與 B 相等,說(shuō)明自己中招了,這個(gè)時(shí)候會(huì)停掉爬蟲(chóng),重新破解。
不要回應(yīng)
所以之前有一篇關(guān)于爬蟲(chóng)的文章,說(shuō)如何破解我們的。一直有人要我回復(fù)下,我一直覺(jué)得沒(méi)什么可以回復(fù)的。
第一,反爬蟲(chóng)被破解了是正常的。這個(gè)世界上有個(gè)萬(wàn)能的爬蟲(chóng)手段,叫“人肉爬蟲(chóng)”。
假設(shè)我們就是有錢(qián),在印度開(kāi)個(gè)分公司,每天雇便宜的勞動(dòng)力用鼠標(biāo)直接來(lái)點(diǎn),你能拿我怎么辦?
第二,我們真正關(guān)心的是后續(xù)的這些套路。而我讀了那篇文章,發(fā)現(xiàn)只是調(diào)用了selenium并且拿到了結(jié)果,就認(rèn)為自己成功了。
我相信你讀到這里,應(yīng)該已經(jīng)明白為什么我不愿意回復(fù)了。我們最重要的是工作,而不是誰(shuí)打誰(shuí)的臉。
大家如果經(jīng)常混技術(shù)社區(qū)就會(huì)發(fā)現(xiàn),每天熱衷于打別人臉的,一般技術(shù)都不是很好。
當(dāng)然這并不代表我們技術(shù)天下第一什么的,我們每天面對(duì)大量的爬蟲(chóng),還是遇到過(guò)很多高手的。
就如同武俠小說(shuō)里一樣,高手一般都比較低調(diào),他們默默地拿走數(shù)據(jù),很難被發(fā)現(xiàn),而且頻率極低,不會(huì)影響我們的考評(píng)。你們應(yīng)該明白,這是智商與情商兼具的高手了。
我們還碰到拉走我們 js,砍掉無(wú)用的部分直接解出 key,相當(dāng)高效不拖泥帶水的爬蟲(chóng),一點(diǎn)廢請(qǐng)求都沒(méi)有(相比某些爬蟲(chóng)教程,總是教你多訪問(wèn),寫(xiě)沒(méi)用的 url 免得被發(fā)現(xiàn),真的不知道高到哪里去了。這樣做除了會(huì)導(dǎo)致機(jī)器報(bào)警,導(dǎo)致對(duì)方加班封鎖以外,對(duì)你自己沒(méi)有任何好處)。
而我們能發(fā)現(xiàn)這一點(diǎn)僅僅是是因?yàn)樗驼{(diào)地寫(xiě)了一篇博客,通篇只介紹技術(shù),沒(méi)有提任何沒(méi)用的東西。
這里我只是順便發(fā)了點(diǎn)小牢騷,就是希望后續(xù)不要總是有人讓我回應(yīng)一些關(guān)于爬蟲(chóng)的文章。
線下我認(rèn)識(shí)很多爬蟲(chóng)工程師,水平真的很好,也真的很低調(diào)(不然你以為我是怎么知道如何對(duì)付爬蟲(chóng)的。。。),大家都是一起混的,不會(huì)產(chǎn)生“一定要互相打臉”的情緒。
進(jìn)化
早期我們和競(jìng)爭(zhēng)對(duì)手打的時(shí)候,雙方的技術(shù)都比較初級(jí)。后來(lái)慢慢的,爬蟲(chóng)在升級(jí),反爬蟲(chóng)也在升級(jí),這個(gè)我們稱為“進(jìn)化”。
我們?cè)?jīng)給對(duì)方放過(guò)水,來(lái)試圖拖慢他們的進(jìn)化速度,然而,效果不是特別理想。爬蟲(chóng)是否進(jìn)化,取決于爬蟲(chóng)工程師自己的 KPI,而不是反爬蟲(chóng)的進(jìn)化速度。
后期打到白熱化的時(shí)候,用的技術(shù)越來(lái)越匪夷所思。舉個(gè)例子,很多人會(huì)提,做反爬蟲(chóng)會(huì)用到 canvas 指紋,并認(rèn)為是高境界。
其實(shí)這個(gè)對(duì)于反爬蟲(chóng)來(lái)說(shuō)也只是個(gè)輔助,canvas 指紋的含義是,因?yàn)椴煌布?duì) canvas 支持不同,因此你只要畫(huà)一個(gè)很復(fù)雜的 canvas,那么得出的 image,總是存在像素級(jí)別的誤差。
考慮到爬蟲(chóng)代碼都是統(tǒng)一的,就算起 selenium,也是 Ghost 的,因此指紋一般都是一致的,因此繞過(guò)幾率非常低。
但是!這個(gè)東西天生有兩個(gè)缺陷。
第一是,無(wú)法驗(yàn)證合法性。當(dāng)然了,你可以用非對(duì)稱加密來(lái)保證合法,但是這個(gè)并不靠譜。
其次,canvas 的沖突概率非常高,遠(yuǎn)遠(yuǎn)不是作者宣稱的那樣,沖突率極低。也許在國(guó)外沖突是比較低,因?yàn)閲?guó)外的語(yǔ)言比較多。但是國(guó)內(nèi)公司通常是 IT 統(tǒng)一裝機(jī),無(wú)論是軟件還是硬件都驚人的一致。
我們測(cè)試 canvas 指紋的時(shí)候,在攜程內(nèi)部隨便找了 20 多臺(tái)機(jī)器,得出的指紋都完全一樣,一丁點(diǎn)差別都沒(méi)有。因此,有些“高級(jí)技巧”一點(diǎn)都不實(shí)用。
法律途徑
此外就是大家可能都考慮過(guò)的:爬蟲(chóng)違法嗎?能起訴對(duì)方讓對(duì)方不爬嗎?法務(wù)給的答案到是很干脆,可以,前提是證據(jù)。
遺憾的是,這個(gè)世界上大部分的爬蟲(chóng)爬取數(shù)據(jù)是不會(huì)公布到自己網(wǎng)站的,只是用于自己的數(shù)據(jù)分析。
因此,即使有一些關(guān)于爬蟲(chóng)的官司做為先例,并且已經(jīng)打完了,依然對(duì)我們沒(méi)有任何幫助。反爬蟲(chóng),在對(duì)方足夠低調(diào)的情況下,注定還是個(gè)技術(shù)活。
搞事情,立 Flag
到了后來(lái),我們已經(jīng)不再局限于打打技術(shù)了,反爬蟲(chóng)的代碼里我們經(jīng)常埋點(diǎn)小彩蛋給對(duì)方,比如寫(xiě)點(diǎn)注釋給對(duì)方。雙方通過(guò)互相交戰(zhàn),頻繁發(fā)布,居然聊的挺 high 的。
比如問(wèn)問(wèn)對(duì)方,北京房?jī)r(jià)是不是很高啊?對(duì)方回應(yīng),歐巴,我可是憑本事吃飯哦。繼續(xù)問(wèn),搖到號(hào)了嗎?諸如此類等等。
這樣的事情你來(lái)我往的,很容易動(dòng)搖對(duì)方的軍心,還是很有作用的。試想一下,如果你的爬蟲(chóng)工程師在大年三十還苦逼加班的時(shí)候,看到對(duì)方留言說(shuō)自己拿到了 n 個(gè)月的年終獎(jiǎng),你覺(jué)得你的工程師,離辭職還遠(yuǎn)嗎?
最后,我們終于搞出了大動(dòng)作,覺(jué)得一定可以坑對(duì)方很久了。我們還特意去一家小火鍋店吃了一頓,慶祝一下,準(zhǔn)備明天上線。
大家都知道,一般立 Flag 的下場(chǎng)都比較慘的,兩個(gè)小時(shí)的自助火鍋,我們剛吃五分鐘,就得到了我們投資競(jìng)爭(zhēng)對(duì)手的消息。
后面的一個(gè)多小時(shí),團(tuán)隊(duì)氣氛都很尷尬,誰(shuí)也說(shuō)不出什么話。我們組有個(gè)實(shí)習(xí)生,后來(lái)鼓足勇氣問(wèn)了我一個(gè)問(wèn)題:“我還能留下來(lái)嗎?”
畢竟,大部分情況下,技術(shù)還是要屈服于資本的力量。
爬蟲(chóng)反爬蟲(chóng)的未來(lái)
與競(jìng)爭(zhēng)對(duì)手和解之后,我們?nèi)グ菰L對(duì)方,大家坐在了一起。之前網(wǎng)上自稱妹子的,一個(gè)個(gè)都是五大三粗的漢子,這讓我們相當(dāng)絕望。
在場(chǎng)唯一的一個(gè)妹子還是我們自己帶過(guò)去的(就是上面提到的實(shí)習(xí)生),感覺(jué)套路了這么久,最終還是被對(duì)方套路了。
好在,吃的喝的都很好,大家玩的還是比較 high 的。后續(xù)就是和平年代啦,大家不打仗了,反爬蟲(chóng)的邏輯扔在那做個(gè)防御,然后就開(kāi)放白名單允許對(duì)方爬取了。
群里經(jīng)常叫的就是:xxx 你怎么頻率這么高,xxx 你為什么這個(gè)接口沒(méi)給我開(kāi)放,為什么我爬的東西不對(duì)我靠你是不是把我封了啊,諸如此類的。
和平年代的反爬蟲(chóng)比戰(zhàn)爭(zhēng)年代還難做,因?yàn)閼?zhàn)爭(zhēng)年代,誤傷率只要不是太高,公司就可以接受。
和平年代大家不能搞事情,誤傷率稍稍多一點(diǎn),就會(huì)有人叫:好好的不賺錢(qián),瞎搞什么搞。
此外,戰(zhàn)爭(zhēng)年代只要不攔截用戶,就不算誤傷。和平年代還要考慮白名單,攔截了合作伙伴也是誤傷,因此各方面會(huì)更保守一些。
不過(guò),總體來(lái)說(shuō)還是和平年代比較 happy,畢竟,誰(shuí)會(huì)喜歡沒(méi)事加班玩呢。
然而和平持續(xù)的不是很久,很快就有了新的競(jìng)爭(zhēng)對(duì)手選擇爬蟲(chóng)來(lái)與我們打,畢竟,這是一個(gè)利益驅(qū)使的世界。
只要有大量的利潤(rùn),資本家就會(huì)殺人放火,這不是我們這些技術(shù)人員可以決定的,我們希望天下無(wú)蟲(chóng),但是我們又有什么權(quán)利呢。
好在,這樣可以催生更多的職位,順便提高大家的身價(jià),也算是個(gè)好事情吧。