“放下你手里的代碼”:爬蟲技術的善與惡、罪與罰
“放下你手里的代碼,小心被抓。”
最近程序員圈子不乏這樣的戲謔調侃。
原因是最近發(fā)生的多起涉及爬蟲技術的公司被司法部門調查。近日,51信用卡被查,更是將暴力催收背后非法使用爬蟲技術爬取個人隱私數(shù)據(jù)的丑行,暴露在陽光之下。
一時間,“爬蟲”成為眾矢之的,一些公司緊急下架了爬蟲相關的招聘信息,給大數(shù)據(jù)風控、人工智能從業(yè)者帶來些許恐慌,頭發(fā)又多落了幾根。
實際上,大部分人都聽說過爬蟲,認為爬蟲就是到人家網(wǎng)站上去爬東西、偷數(shù)據(jù),有些人甚至認為只要有爬蟲,什么數(shù)據(jù)都可以搞到。
今天,我們就打開爬蟲這個“工具箱”,把涉及到的技術盲區(qū)放到燈光下,讓大家可以清楚地看下。下面,本文就從這個角度來聊聊爬蟲這個熟悉而又陌生的技術。
爬蟲的技術原理
搜索引擎收集網(wǎng)上信息的主要手段就是網(wǎng)絡爬蟲(也叫網(wǎng)頁蜘蛛、網(wǎng)絡機器人)。它是一種“自動化瀏覽網(wǎng)絡”的程序,按照一定的規(guī)則,自動抓取互聯(lián)網(wǎng)信息,比如:網(wǎng)頁、各類文檔、圖片、音頻、視頻等。搜索引擎通過索引技術組織這些信息,根據(jù)用戶的查詢,快速地提供搜索結果。
設想一下,我們平時瀏覽網(wǎng)頁的時候會怎么做?
一般情況下,首先,會用瀏覽器打開一個網(wǎng)站的主頁,在頁面上尋找感興趣的內容,然后點擊本站或其它網(wǎng)站在該網(wǎng)頁上的鏈接,跳轉到新的網(wǎng)頁,閱讀內容,如此循環(huán)往復。如下圖所示:

圖中的虛線圓角矩形代表一個網(wǎng)站,每個實線矩形表示一個網(wǎng)頁??梢钥吹?,每個網(wǎng)站一般以首頁為入口,該首頁鏈接到幾個、幾萬個、甚至上千萬個的內部網(wǎng)頁。同時,這些網(wǎng)頁往往又鏈接了很多外部網(wǎng)站。例如,用戶從蘇寧金融的網(wǎng)頁為起點,瀏覽發(fā)現(xiàn)了PP視頻的鏈接,點擊后跳轉到了PP視頻主頁,作為體育愛好者,在體育頻道中找到了相關的新浪微博的內容,再次點擊后又來到微博的頁面繼續(xù)閱讀,從而形成了一條路徑。如果把所有的可能路徑呈現(xiàn)出來,就會看到一個網(wǎng)絡結構。
網(wǎng)絡爬蟲模擬了人們?yōu)g覽網(wǎng)頁的行為,只是用程序代替了人類的操作,在廣度和深度上遍歷網(wǎng)頁。如果把互聯(lián)網(wǎng)上的網(wǎng)頁或網(wǎng)站理解為一個個節(jié)點,大量的網(wǎng)頁或網(wǎng)站通過超鏈接形成網(wǎng)狀結構。爬蟲通過遍歷網(wǎng)頁上的鏈接,從一個節(jié)點跳轉到下一個節(jié)點,就像是在一張巨大的網(wǎng)上爬行,但是比人類的速度更快,跳轉的節(jié)點更全面,所以被形象地稱為網(wǎng)絡爬蟲或網(wǎng)絡蜘蛛。
爬蟲的發(fā)展歷史
網(wǎng)絡爬蟲最早的用途是服務于搜索引擎的數(shù)據(jù)收集,而現(xiàn)代意義上的搜索引擎的鼻祖是1990年由加拿大麥吉爾大學(University of McGill)學生Alan Emtage發(fā)明的的Archie。
人們使用FTP服務器共享交流資源,大量的文件散布在各個FTP主機上,查詢起來非常不方便。因此,他開發(fā)了一個可以按照文件名查找文件的系統(tǒng),能定期搜集并分析FTP服務器上的文件名信息,自動索引這些文件。工作原理與現(xiàn)在的搜索引擎已經(jīng)非常接近,依靠腳本程序自動搜索分散在各處FTP主機中的文件,然后對有關信息進行索引,供使用者以一定的表達式查詢。
世界上第一個網(wǎng)絡爬蟲“互聯(lián)網(wǎng)漫游者”(“www wanderer”)是由麻省理工學院(MIT)的學生馬休·格雷(Matthew Gray)在 1993 年寫成。剛開始,它只用來統(tǒng)計互聯(lián)網(wǎng)上的服務器數(shù)量,后來則發(fā)展為能夠通過它檢索網(wǎng)站域名。
隨著互聯(lián)網(wǎng)的迅速發(fā)展,使得檢索所有新出現(xiàn)的網(wǎng)頁變得越來越困難,因此,在“互聯(lián)網(wǎng)漫游者”基礎上,一些編程者將傳統(tǒng)的“蜘蛛”程序工作原理作了些改進。其設想是,既然所有網(wǎng)頁都可能有連向其他網(wǎng)站的鏈接,那么從跟蹤一個網(wǎng)站的鏈接開始,就有可能檢索整個互聯(lián)網(wǎng)。
其后,無數(shù)的搜索引擎促使了爬蟲越寫越復雜,并逐漸向多策略、負載均衡及大規(guī)模增量抓取等方向發(fā)展。爬蟲的工作成果是搜索引擎能夠遍歷鏈接的網(wǎng)頁,甚至被刪除的網(wǎng)頁也可以通過“網(wǎng)頁快照”的功能訪問。
網(wǎng)絡爬蟲的禮儀 禮儀一:robots.txt文件
每個行業(yè)都有其Code of Conduct,成為行為準則或行為規(guī)范。比如,你是某個協(xié)會中的成員,那就必須遵守這個協(xié)會的行為準則,破壞了行為準則是要被踢出去的。
最簡單的例子,你加入的很多微信群,一般群主都會要求不可以私自發(fā)廣告,如果未經(jīng)允許發(fā)了廣告,會被立刻踢出群,但是發(fā)紅包就沒事,這就是行為準則。
爬蟲也有行為準則。早在1994年,搜索引擎技術剛剛興起。那時的初創(chuàng)搜索引擎公司,比如AltaVista和DogPile,通過爬蟲技術來采集整個互聯(lián)網(wǎng)的資源,與Yahoo這樣的資源分類網(wǎng)站激烈競爭。隨著互聯(lián)網(wǎng)搜索規(guī)模的增長,爬蟲收集信息的能力快速進化,網(wǎng)站開始考慮對于搜索引擎爬取信息做出限制,于是robots.txt應運而生,成為爬蟲界的“君子協(xié)定”。
robots.txt文件是業(yè)內慣用做法,不是強制性的約束。robots.txt的形式如下:

在上面這個robots.txt例子中,所有的爬蟲都被禁止訪問網(wǎng)站的任意內容。但是Google的爬蟲機器人,可以訪問除了private位置的所有內容。如果一個網(wǎng)站上沒有robots.txt,是被認為默許爬蟲爬取所有信息。如果robots.txt做了訪問的限制,但是爬蟲卻沒有遵守,那就不是技術實現(xiàn)這么簡單的事情了。
禮儀二:爬取吞吐量的控制
曾經(jīng)出現(xiàn)假冒Google搜索引擎的爬蟲去對網(wǎng)站進行DDoS攻擊,讓網(wǎng)站癱瘓的事情。近年來,惡意爬蟲造成的DDoS攻擊行為有增無減,給大數(shù)據(jù)行業(yè)蒙上了爬蟲的陰影。因為其背后的惡意攻擊者,往往具備更為復雜和專業(yè)的技術,能繞過各種防御機制,讓防范這樣攻擊行為難上加難。
禮儀三:做一個優(yōu)雅的爬蟲
優(yōu)雅的爬蟲背后,一定站著一個文明人或者一個文明團隊。他們會考慮自己寫的爬蟲程序是否符合robots.txt協(xié)議,是否會對被爬網(wǎng)站的性能造成影響,如何才能不侵害知識產權所有者的權益以及非常重要的個人隱私數(shù)據(jù)等問題。
出于能力的差別,并不是每個爬蟲團隊都能考慮到這些問題。2018年,歐盟出臺的《General Data Protection Regulation》(通用數(shù)據(jù)保護條例)中對數(shù)據(jù)的保護做出了嚴格的說明。2019年5月28日,國家互聯(lián)網(wǎng)信息辦公室發(fā)布的《數(shù)據(jù)安全管理辦法》(征求意見稿)對爬蟲和個人信息安全做出了非常嚴格的規(guī)定。比如:
- (1)第十六條 網(wǎng)絡運營者采取自動化手段訪問收集網(wǎng)站數(shù)據(jù),不得妨礙網(wǎng)站正常運行;此類行為嚴重影響網(wǎng)站運行,如自動化訪問收集流量超過網(wǎng)站日均流量三分之一,網(wǎng)站要求停止自動化訪問收集時,應當停止。
- (2)第二十七條 網(wǎng)絡運營者向他人提供個人信息前,應當評估可能帶來的安全風險,并征得個人信息主體同意。
其實,我國2017年6月1日施行的《中華人民共和國網(wǎng)絡安全法》第四章第四十一條和四十四條就已經(jīng)對個人隱私信息數(shù)據(jù)的收集和使用做出明文規(guī)定,這也與爬蟲直接相關。


法律制度的出臺,給技術的邊界做出了明確的限定,技術無罪并不能作為技術實施者為自己開脫的理由。爬蟲在實現(xiàn)自己需求的同時,必須做到嚴格遵守行為準則和法律條例。
各類反爬蟲技術介紹
為了保護自己合法權益不被惡意侵害,不少網(wǎng)站和應用APP應用了大量的反爬技術。這使得爬蟲技術中又衍生出反反爬蟲技術,比如各類滑動拼圖、文字點選、圖標點選等驗證碼的破解,它們相互促進、相互發(fā)展、相互傷害著。
反爬蟲的關鍵在于阻止被爬蟲批量爬取網(wǎng)站內容,反爬蟲技術的核心在于不斷變更規(guī)則,變換各類驗證手段。
這類技術的發(fā)展甚至讓人癡迷,比DOTA對戰(zhàn)還讓人熱血沸騰。從那晃動如波浪的文字驗證碼圖形的偽裝色里彷佛都能看得見程序員的頭發(fā)。
1、圖片/Flash
這是比較常見的反爬手段,將關鍵數(shù)據(jù)轉為圖片,并添加上水印,即使使用了OCR(Optical Character Recognition,文字識別)也無法識別出來,讓爬蟲端獲取了圖片也得不到信息。早期一些電商的價格標簽中經(jīng)常見到這種方式。
2、JavaScript混淆技術
這是爬蟲程序員遇到最多的一種反爬方式,簡單來說其實就是一種障眼法,本質上還是一種加密技術。很多網(wǎng)頁中的數(shù)據(jù)是使用JavaScript程序來動態(tài)加載的,爬蟲在抓取這樣的網(wǎng)頁數(shù)據(jù)時,需要了解網(wǎng)頁是如何加載該數(shù)據(jù)的,這個過程被稱為逆向工程。為了防止被逆向工程,就用到JavaScript混淆技術,加JavaScript代碼進行加密,讓別人看不懂。不過這種方式屬于比較簡單的反爬方式,屬于爬蟲工程師練級的初級階段。
3、驗證碼
驗證碼是一種區(qū)分用戶是計算機還是人的公共全自動程序,也是我們經(jīng)常遇到的一種網(wǎng)站訪問驗證方式,主要分為以下幾種:
(1)輸入式驗證碼
這是最最常見的,通過用戶輸入圖片中的字母、數(shù)字、漢子等字符進行驗證。
圖中CAPTCHA 的全名是(Completely Automated Public Turing test to tell Computers and Humans Apart),中文翻譯為:全自動區(qū)分計算機與人類的圖靈測試。實現(xiàn)的方式很簡單,就是問一個電腦答不出來但人類答得出來的問題。不過,現(xiàn)在的爬蟲往往會用深度學習技術對這樣的驗證碼進行破解,這樣的圖靈測試已經(jīng)失效。
(2)滑塊式驗證碼
鑒于輸入式的圖形驗證碼的缺點,容易被破解,而且有時候人類都識別不了。滑塊驗證碼橫空出世,這種驗證碼操作簡便,破解難度大,很快就流行起來了。破解滑塊驗證碼存在兩大難點:一是必須知道圖形缺口在哪里,也就是得知道滑塊滑到哪;二是要模仿出人類滑動的手勢。這樣的驗證碼增加了一定的難度,也給爬蟲界增加了很多樂趣,一時間大量破解滑塊驗證碼的技術出現(xiàn)。
(3)點擊式的圖文驗證和圖標選擇
圖文驗證,是通過文字提醒用戶點擊圖中相同字的位置進行驗證。
圖標選擇,是給出一組圖片,按要求點擊其中一張或者多張。
這兩種原理相似,只不過是一個給出文字,點擊圖片中的文字;一個給出圖片,點出符合內容的圖片。這兩種方法的共同點就是體驗差,被廣為詬病。
(4)手機驗證碼
對于一些重要的敏感信息訪問,網(wǎng)站或APP端一般會提供填寫手機驗證碼的要求,通過手機接受網(wǎng)站發(fā)送的驗證碼來進一步訪問,這種方式對于數(shù)據(jù)隱私的保護比較好。
4、賬號密碼登陸
網(wǎng)站可以通過賬號登陸來限制爬蟲的訪問權限,個人在使用很多網(wǎng)站服務的時候一般是需要進行賬號注冊的,使用的時候需要通過賬號密碼登陸才能繼續(xù)使用服務。網(wǎng)站可以利用用戶瀏覽器的Cookie來對用戶的身份進行識別,通過保存在用戶本地瀏覽器中加密的Cookie數(shù)據(jù)來進行用戶訪問會話的跟蹤。這一般作為前面幾種反爬方式的補充。
爬蟲技術的發(fā)展方向
傳統(tǒng)網(wǎng)絡爬蟲最大的應用場景是搜索引擎,普通的企業(yè)更多是做網(wǎng)站或應用。后來隨著網(wǎng)絡數(shù)據(jù)分析的需要,以及互聯(lián)網(wǎng)上的輿情事件層出不窮,針對網(wǎng)絡爬蟲有了大量的需求,采集的對象主要是些新聞資訊。
近些年,由于大數(shù)據(jù)處理和數(shù)據(jù)挖掘技術的發(fā)展,數(shù)據(jù)資產價值的概念深入人心,爬蟲技術得到更加廣泛和深入的發(fā)展,采集對象也更豐富,高性能、并發(fā)式的技術指標也更高。
圍繞網(wǎng)絡爬蟲合法性的討論仍然存在,情況也比較復雜。目前的趨勢下,許多法律問題還處于模糊地帶,往往取決于具體的案例影響。然而,可以肯定的是,只要有互聯(lián)網(wǎng),就會有網(wǎng)絡爬蟲。只有網(wǎng)絡爬蟲讓體量巨大的互聯(lián)網(wǎng)變得可以搜索,使爆炸式增長的互聯(lián)網(wǎng)變得更加容易訪問和獲取,在可預見的未來,互聯(lián)網(wǎng)爬蟲技術將繼續(xù)得到發(fā)展。
互聯(lián)網(wǎng)作為人類歷史最大的知識倉庫,是非結構化或非標準化的?;ヂ?lián)網(wǎng)上聚集了大量的文本、圖片、多媒體等數(shù)據(jù),內容雖然非常有價值,但是知識提取的難度仍然非常巨大。語義互聯(lián)網(wǎng)、知識共享等概念越來越普及,真正語義上的互聯(lián)網(wǎng)將是網(wǎng)絡爬蟲的目標。此外,物聯(lián)網(wǎng)技術的發(fā)展,將是互聯(lián)網(wǎng)的升級形式,也將是爬蟲技術未來發(fā)展的方向。