舉個例子,這個世界存在3家公司,售賣相同的電商產(chǎn)品。三家公司的名字分別是A,B,C。
這個時候,客戶去A公司查詢了下某商品的價格,看了下發(fā)現(xiàn)價格不好。于是他不打算買了。他對整個行業(yè)的訂單貢獻(xiàn)為0。
然而A公司的后臺會檢測到,我們有個客戶流失了,原因是他來查詢了一個商品,這個商品我們的價格不好。沒關(guān)系,我去爬爬別人試試。
于是他分別爬取了B公司和C公司。
B公司的后臺檢測到有人來查詢價格,但是呢,最終沒有下單。他會認(rèn)為,嗯,我們流失了一個客戶。怎么辦呢?
我可以爬爬看,別人什么價格。于是他爬取了A和C。
C公司的后臺檢測到有人來查詢價格。。。。。
過了一段時間,三家公司的服務(wù)器分別報(bào)警,訪問量過高。三家公司的CTO也很納悶,沒有生成任何訂單啊,怎么訪問量這么高? 一定是其他兩家禽獸寫的爬蟲沒有限制好頻率。媽的,老子要報(bào)仇。于是分別做反爬蟲,不讓對方抓自己的數(shù)據(jù)。然后進(jìn)一步強(qiáng)化自己的爬蟲團(tuán)隊(duì)抓別人的數(shù)據(jù)。一定要做到:寧叫我抓天下人,休叫天下人抓我。
然后,做反爬蟲的就要加班天天研究如何攔截爬蟲。做爬蟲的被攔截了,就要天天研究如何破解反爬蟲策略。大家就這么把資源全都浪費(fèi)在沒用的地方了。直到大家合并了,才會心平氣和的坐下來談?wù)?,都少抓點(diǎn)。
最近國內(nèi)的公司有大量的合并,我猜這種“心平氣和”應(yīng)該不少吧?
二、爬蟲反爬蟲技術(shù)現(xiàn)狀
下面我們談?wù)劊老x和反爬蟲分別都是怎么做的。
1、為python平反
首先是爬蟲。爬蟲教程你到處都可以搜的到,大部分是python寫的。我曾經(jīng)在一篇文章提到過:用python寫的爬蟲是最薄弱的,因?yàn)樘焐⒉贿m合破解反爬蟲邏輯,因?yàn)榉磁老x都是用javascript來處理。然而慢慢的,我發(fā)現(xiàn)這個理解有點(diǎn)問題(當(dāng)然我如果說我當(dāng)時是出于工作需要而有意黑python你們信嗎。。。)。
Python的確不適合寫反爬蟲邏輯,但是python是一門膠水語言,他適合捆綁任何一種框架。而反爬蟲策略經(jīng)常會變化的翻天覆地,需要對代碼進(jìn)行大刀闊斧的重構(gòu),甚至重寫。這種情況下,python不失為一種合適的解決方案。
舉個例子,你之前是用selenium爬取對方的站點(diǎn),后來你發(fā)現(xiàn)自己被封了,而且封鎖方式十分隱蔽,完全搞不清到底是如何封的,你會怎么辦?你會跟蹤selenium的源碼來找到出錯的地方嗎?
你不會。你只會換個框架,用另一種方式來爬取。然后你就把兩個框架都淺嘗輒止地用了下,一個都沒有深入研究過。因?yàn)闆]等你研究好,也許人家又換方式了。你不得不再找個框架來爬取。畢竟,老板等著明天早上開會要數(shù)據(jù)呢。老板一般都是早上八九點(diǎn)開會,所以你七點(diǎn)之前必須搞定。等你厭倦了,打算換個工作的時候,簡歷上又只能寫“了解n個框架的使用”,僅此而已。
這就是爬蟲工程師的宿命,爬蟲工程師比外包還可憐。外包雖然不容易積累技術(shù),但是好歹有正常上下班時間,爬蟲工程師連這個權(quán)利都沒有。
然而反爬蟲工程師就不可憐了嗎?也不是的。反爬蟲有個天生的死穴,就是:誤傷率。
2、無法繞開的誤傷率
我們首先談?wù)?,面對對方的爬蟲,你的第一反應(yīng)是什么?
如果限定時間的話,大部分人給我的答案都是:封殺對方的IP。
然而,問題就出在,IP不是每人一個的。大的公司有出口IP,ISP有的時候會劫持流量讓你們走代理,有的人天生喜歡掛代理,有的人為了翻墻24小時掛vpn,最坑的是,現(xiàn)在是移動互聯(lián)網(wǎng)時代,你如果封了一個IP?不好意思,這是中國聯(lián)通的4G網(wǎng)絡(luò),5分鐘之前還是別人,5分鐘之后就換人了哦!
因此,封IP的誤傷指數(shù)最高。并且,效果又是最差的。因?yàn)楝F(xiàn)在即使是最菜的新手,也知道用代理池了。你們可以去淘寶看下,幾十萬的代理價值多少錢。我們就不談到處都有的免費(fèi)代理了。
也有人說:我可以掃描對方端口,如果開放了代理端口,那就意味著是個代理,我就可以封殺了呀。
事實(shí)是殘酷的。我曾經(jīng)封殺過一個IP,因?yàn)樗_放了一個代理端口,而且是個很小眾的代理端口。不出一天就有人來報(bào)事件,說我們一個分公司被攔截了。我一查IP,還真是我封的IP。我就很郁悶地問他們IT,開這個端口干什么?他說做郵件服務(wù)器啊。我說為啥要用這么奇怪的端口?他說,這不是怕別人猜出來么?我就隨便取了個。