“放下你手里的代碼,小心被抓。”
最近程序員圈子不乏這樣的戲謔調(diào)侃。
原因是最近發(fā)生的多起涉及爬蟲技術(shù)的公司被司法部門調(diào)查。近日,51信用卡被查,更是將暴力催收背后非法使用爬蟲技術(shù)爬取個(gè)人隱私數(shù)據(jù)的丑行,暴露在陽(yáng)光之下。
一時(shí)間,“爬蟲”成為眾矢之的,一些公司緊急下架了爬蟲相關(guān)的招聘信息,給大數(shù)據(jù)風(fēng)控、人工智能從業(yè)者帶來(lái)些許恐慌,頭發(fā)又多落了幾根。
實(shí)際上,大部分人都聽(tīng)說(shuō)過(guò)爬蟲,認(rèn)為爬蟲就是到人家網(wǎng)站上去爬東西、偷數(shù)據(jù),有些人甚至認(rèn)為只要有爬蟲,什么數(shù)據(jù)都可以搞到。
今天,我們就打開(kāi)爬蟲這個(gè)“工具箱”,把涉及到的技術(shù)盲區(qū)放到燈光下,讓大家可以清楚地看下。下面,本文就從這個(gè)角度來(lái)聊聊爬蟲這個(gè)熟悉而又陌生的技術(shù)。
爬蟲的技術(shù)原理
搜索引擎收集網(wǎng)上信息的主要手段就是網(wǎng)絡(luò)爬蟲(也叫網(wǎng)頁(yè)蜘蛛、網(wǎng)絡(luò)機(jī)器人)。它是一種“自動(dòng)化瀏覽網(wǎng)絡(luò)”的程序,按照一定的規(guī)則,自動(dòng)抓取互聯(lián)網(wǎng)信息,比如:網(wǎng)頁(yè)、各類文檔、圖片、音頻、視頻等。搜索引擎通過(guò)索引技術(shù)組織這些信息,根據(jù)用戶的查詢,快速地提供搜索結(jié)果。
設(shè)想一下,我們平時(shí)瀏覽網(wǎng)頁(yè)的時(shí)候會(huì)怎么做?
一般情況下,首先,會(huì)用瀏覽器打開(kāi)一個(gè)網(wǎng)站的主頁(yè),在頁(yè)面上尋找感興趣的內(nèi)容,然后點(diǎn)擊本站或其它網(wǎng)站在該網(wǎng)頁(yè)上的鏈接,跳轉(zhuǎn)到新的網(wǎng)頁(yè),閱讀內(nèi)容,如此循環(huán)往復(fù)。如下圖所示:
圖中的虛線圓角矩形代表一個(gè)網(wǎng)站,每個(gè)實(shí)線矩形表示一個(gè)網(wǎng)頁(yè)。可以看到,每個(gè)網(wǎng)站一般以首頁(yè)為入口,該首頁(yè)鏈接到幾個(gè)、幾萬(wàn)個(gè)、甚至上千萬(wàn)個(gè)的內(nèi)部網(wǎng)頁(yè)。同時(shí),這些網(wǎng)頁(yè)往往又鏈接了很多外部網(wǎng)站。
例如,用戶從蘇寧金融的網(wǎng)頁(yè)為起點(diǎn),瀏覽發(fā)現(xiàn)了PP視頻的鏈接,點(diǎn)擊后跳轉(zhuǎn)到了PP視頻主頁(yè),作為體育愛(ài)好者,在體育頻道中找到了相關(guān)的新浪微博的內(nèi)容,再次點(diǎn)擊后又來(lái)到微博的頁(yè)面繼續(xù)閱讀,從而形成了一條路徑。如果把所有的可能路徑呈現(xiàn)出來(lái),就會(huì)看到一個(gè)網(wǎng)絡(luò)結(jié)構(gòu)。
網(wǎng)絡(luò)爬蟲模擬了人們?yōu)g覽網(wǎng)頁(yè)的行為,只是用程序代替了人類的操作,在廣度和深度上遍歷網(wǎng)頁(yè)。如果把互聯(lián)網(wǎng)上的網(wǎng)頁(yè)或網(wǎng)站理解為一個(gè)個(gè)節(jié)點(diǎn),大量的網(wǎng)頁(yè)或網(wǎng)站通過(guò)超鏈接形成網(wǎng)狀結(jié)構(gòu)。
爬蟲通過(guò)遍歷網(wǎng)頁(yè)上的鏈接,從一個(gè)節(jié)點(diǎn)跳轉(zhuǎn)到下一個(gè)節(jié)點(diǎn),就像是在一張巨大的網(wǎng)上爬行,但是比人類的速度更快,跳轉(zhuǎn)的節(jié)點(diǎn)更全面,所以被形象地稱為網(wǎng)絡(luò)爬蟲或網(wǎng)絡(luò)蜘蛛。
爬蟲的發(fā)展歷史
網(wǎng)絡(luò)爬蟲最早的用途是服務(wù)于搜索引擎的數(shù)據(jù)收集,而現(xiàn)代意義上的搜索引擎的鼻祖是1990年由加拿大麥吉爾大學(xué)(University of McGill)學(xué)生Alan Emtage發(fā)明的的Archie。
人們使用FTP服務(wù)器共享交流資源,大量的文件散布在各個(gè)FTP主機(jī)上,查詢起來(lái)非常不方便。因此,他開(kāi)發(fā)了一個(gè)可以按照文件名查找文件的系統(tǒng),能定期搜集并分析FTP服務(wù)器上的文件名信息,自動(dòng)索引這些文件。工作原理與現(xiàn)在的搜索引擎已經(jīng)非常接近,依靠腳本程序自動(dòng)搜索分散在各處FTP主機(jī)中的文件,然后對(duì)有關(guān)信息進(jìn)行索引,供使用者以一定的表達(dá)式查詢。
世界上第一個(gè)網(wǎng)絡(luò)爬蟲“互聯(lián)網(wǎng)漫游者”(“www wanderer”)是由麻省理工學(xué)院(MIT)的學(xué)生馬休·格雷(Matthew Gray)在1993年寫成。剛開(kāi)始,它只用來(lái)統(tǒng)計(jì)互聯(lián)網(wǎng)上的服務(wù)器數(shù)量,后來(lái)則發(fā)展為能夠通過(guò)它檢索網(wǎng)站域名。
隨著互聯(lián)網(wǎng)的迅速發(fā)展,使得檢索所有新出現(xiàn)的網(wǎng)頁(yè)變得越來(lái)越困難,因此,在“互聯(lián)網(wǎng)漫游者”基礎(chǔ)上,一些編程者將傳統(tǒng)的“蜘蛛”程序工作原理作了些改進(jìn)。其設(shè)想是,既然所有網(wǎng)頁(yè)都可能有連向其他網(wǎng)站的鏈接,那么從跟蹤一個(gè)網(wǎng)站的鏈接開(kāi)始,就有可能檢索整個(gè)互聯(lián)網(wǎng)。
其后,無(wú)數(shù)的搜索引擎促使了爬蟲越寫越復(fù)雜,并逐漸向多策略、負(fù)載均衡及大規(guī)模增量抓取等方向發(fā)展。爬蟲的工作成果是搜索引擎能夠遍歷鏈接的網(wǎng)頁(yè),甚至被刪除的網(wǎng)頁(yè)也可以通過(guò)“網(wǎng)頁(yè)快照”的功能訪問(wèn)。
網(wǎng)絡(luò)爬蟲的禮儀
禮儀一:robots.txt文件
每個(gè)行業(yè)都有其Code of Conduct,成為行為準(zhǔn)則或行為規(guī)范。比如,你是某個(gè)協(xié)會(huì)中的成員,那就必須遵守這個(gè)協(xié)會(huì)的行為準(zhǔn)則,破壞了行為準(zhǔn)則是要被踢出去的。
最簡(jiǎn)單的例子,你加入的很多微信群,一般群主都會(huì)要求不可以私自發(fā)廣告,如果未經(jīng)允許發(fā)了廣告,會(huì)被立刻踢出群,但是發(fā)紅包就沒(méi)事,這就是行為準(zhǔn)則。
爬蟲也有行為準(zhǔn)則。早在1994年,搜索引擎技術(shù)剛剛興起。那時(shí)的初創(chuàng)搜索引擎公司,比如AltaVista和DogPile,通過(guò)爬蟲技術(shù)來(lái)采集整個(gè)互聯(lián)網(wǎng)的資源,與Yahoo這樣的資源分類網(wǎng)站激烈競(jìng)爭(zhēng)。隨著互聯(lián)網(wǎng)搜索規(guī)模的增長(zhǎng),爬蟲收集信息的能力快速進(jìn)化,網(wǎng)站開(kāi)始考慮對(duì)于搜索引擎爬取信息做出限制,于是robots.txt應(yīng)運(yùn)而生,成為爬蟲界的“君子協(xié)定”。
robots.txt文件是業(yè)內(nèi)慣用做法,不是強(qiáng)制性的約束。robots.txt的形式如下:
在上面這個(gè)robots.txt例子中,所有的爬蟲都被禁止訪問(wèn)網(wǎng)站的任意內(nèi)容。但是Google的爬蟲機(jī)器人,可以訪問(wèn)除了private位置的所有內(nèi)容。如果一個(gè)網(wǎng)站上沒(méi)有robots.txt,是被認(rèn)為默許爬蟲爬取所有信息。如果robots.txt做了訪問(wèn)的限制,但是爬蟲卻沒(méi)有遵守,那就不是技術(shù)實(shí)現(xiàn)這么簡(jiǎn)單的事情了。
禮儀二:爬取吞吐量的控制
曾經(jīng)出現(xiàn)假冒Google搜索引擎的爬蟲去對(duì)網(wǎng)站進(jìn)行DDoS攻擊,讓網(wǎng)站癱瘓的事情。近年來(lái),惡意爬蟲造成的DDoS攻擊行為有增無(wú)減,給大數(shù)據(jù)行業(yè)蒙上了爬蟲的陰影。因?yàn)槠浔澈蟮膼阂夤粽?,往往具備更為?fù)雜和專業(yè)的技術(shù),能繞過(guò)各種防御機(jī)制,讓防范這樣攻擊行為難上加難。
禮儀三:做一個(gè)優(yōu)雅的爬蟲
優(yōu)雅的爬蟲背后,一定站著一個(gè)文明人或者一個(gè)文明團(tuán)隊(duì)。他們會(huì)考慮自己寫的爬蟲程序是否符合robots.txt協(xié)議,是否會(huì)對(duì)被爬網(wǎng)站的性能造成影響,如何才能不侵害知識(shí)產(chǎn)權(quán)所有者的權(quán)益以及非常重要的個(gè)人隱私數(shù)據(jù)等問(wèn)題。
出于能力的差別,并不是每個(gè)爬蟲團(tuán)隊(duì)都能考慮到這些問(wèn)題。2018年,歐盟出臺(tái)的《General Data Protection Regulation》(通用數(shù)據(jù)保護(hù)條例)中對(duì)數(shù)據(jù)的保護(hù)做出了嚴(yán)格的說(shuō)明。2019年5月28日,國(guó)家互聯(lián)網(wǎng)信息辦公室發(fā)布的《數(shù)據(jù)安全管理辦法》(征求意見(jiàn)稿)對(duì)爬蟲和個(gè)人信息安全做出了非常嚴(yán)格的規(guī)定。比如:
(1)第十六條網(wǎng)絡(luò)運(yùn)營(yíng)者采取自動(dòng)化手段訪問(wèn)收集網(wǎng)站數(shù)據(jù),不得妨礙網(wǎng)站正常運(yùn)行;此類行為嚴(yán)重影響網(wǎng)站運(yùn)行,如自動(dòng)化訪問(wèn)收集流量超過(guò)網(wǎng)站日均流量三分之一,網(wǎng)站要求停止自動(dòng)化訪問(wèn)收集時(shí),應(yīng)當(dāng)停止。
(2)第二十七條網(wǎng)絡(luò)運(yùn)營(yíng)者向他人提供個(gè)人信息前,應(yīng)當(dāng)評(píng)估可能帶來(lái)的安全風(fēng)險(xiǎn),并征得個(gè)人信息主體同意。
其實(shí),我國(guó)2017年6月1日施行的《中華人民共和國(guó)網(wǎng)絡(luò)安全法》第四章第四十一條和四十四條就已經(jīng)對(duì)個(gè)人隱私信息數(shù)據(jù)的收集和使用做出明文規(guī)定,這也與爬蟲直接相關(guān)。
法律制度的出臺(tái),給技術(shù)的邊界做出了明確的限定,技術(shù)無(wú)罪并不能作為技術(shù)實(shí)施者為自己開(kāi)脫的理由。爬蟲在實(shí)現(xiàn)自己需求的同時(shí),必須做到嚴(yán)格遵守行為準(zhǔn)則和法律條例。
各類反爬蟲技術(shù)介紹
為了保護(hù)自己合法權(quán)益不被惡意侵害,不少網(wǎng)站和應(yīng)用APP應(yīng)用了大量的反爬技術(shù)。這使得爬蟲技術(shù)中又衍生出反反爬蟲技術(shù),比如各類滑動(dòng)拼圖、文字點(diǎn)選、圖標(biāo)點(diǎn)選等驗(yàn)證碼的破解,它們相互促進(jìn)、相互發(fā)展、相互傷害著。
反爬蟲的關(guān)鍵在于阻止被爬蟲批量爬取網(wǎng)站內(nèi)容,反爬蟲技術(shù)的核心在于不斷變更規(guī)則,變換各類驗(yàn)證手段。
這類技術(shù)的發(fā)展甚至讓人癡迷,比DOTA對(duì)戰(zhàn)還讓人熱血沸騰。從那晃動(dòng)如波浪的文字驗(yàn)證碼圖形的偽裝色里彷佛都能看得見(jiàn)程序員的頭發(fā)。
1、圖片/Flash
這是比較常見(jiàn)的反爬手段,將關(guān)鍵數(shù)據(jù)轉(zhuǎn)為圖片,并添加上水印,即使使用了OCR(Optical Character Recognition,文字識(shí)別)也無(wú)法識(shí)別出來(lái),讓爬蟲端獲取了圖片也得不到信息。早期一些電商的價(jià)格標(biāo)簽中經(jīng)常見(jiàn)到這種方式。
2、JavaScript混淆技術(shù)
這是爬蟲程序員遇到最多的一種反爬方式,簡(jiǎn)單來(lái)說(shuō)其實(shí)就是一種障眼法,本質(zhì)上還是一種加密技術(shù)。很多網(wǎng)頁(yè)中的數(shù)據(jù)是使用JavaScript程序來(lái)動(dòng)態(tài)加載的,爬蟲在抓取這樣的網(wǎng)頁(yè)數(shù)據(jù)時(shí),需要了解網(wǎng)頁(yè)是如何加載該數(shù)據(jù)的,這個(gè)過(guò)程被稱為逆向工程。為了防止被逆向工程,就用到JavaScript混淆技術(shù),加JavaScript代碼進(jìn)行加密,讓別人看不懂。不過(guò)這種方式屬于比較簡(jiǎn)單的反爬方式,屬于爬蟲工程師練級(jí)的初級(jí)階段。
3、驗(yàn)證碼
驗(yàn)證碼是一種區(qū)分用戶是計(jì)算機(jī)還是人的公共全自動(dòng)程序,也是我們經(jīng)常遇到的一種網(wǎng)站訪問(wèn)驗(yàn)證方式,主要分為以下幾種:
(1)輸入式驗(yàn)證碼
這是最最常見(jiàn)的,通過(guò)用戶輸入圖片中的字母、數(shù)字、漢子等字符進(jìn)行驗(yàn)證。
圖中CAPTCHA的全名是(Completely Automated Public Turing test to tell Computers and Humans Apart),中文翻譯為:全自動(dòng)區(qū)分計(jì)算機(jī)與人類的圖靈測(cè)試。實(shí)現(xiàn)的方式很簡(jiǎn)單,就是問(wèn)一個(gè)電腦答不出來(lái)但人類答得出來(lái)的問(wèn)題。不過(guò),現(xiàn)在的爬蟲往往會(huì)用深度學(xué)習(xí)技術(shù)對(duì)這樣的驗(yàn)證碼進(jìn)行破解,這樣的圖靈測(cè)試已經(jīng)失效。
(2)滑塊式驗(yàn)證碼
鑒于輸入式的圖形驗(yàn)證碼的缺點(diǎn),容易被破解,而且有時(shí)候人類都識(shí)別不了?;瑝K驗(yàn)證碼橫空出世,這種驗(yàn)證碼操作簡(jiǎn)便,破解難度大,很快就流行起來(lái)了。破解滑塊驗(yàn)證碼存在兩大難點(diǎn):一是必須知道圖形缺口在哪里,也就是得知道滑塊滑到哪;二是要模仿出人類滑動(dòng)的手勢(shì)。這樣的驗(yàn)證碼增加了一定的難度,也給爬蟲界增加了很多樂(lè)趣,一時(shí)間大量破解滑塊驗(yàn)證碼的技術(shù)出現(xiàn)。
(3)點(diǎn)擊式的圖文驗(yàn)證和圖標(biāo)選擇
圖文驗(yàn)證,是通過(guò)文字提醒用戶點(diǎn)擊圖中相同字的位置進(jìn)行驗(yàn)證。
圖標(biāo)選擇,是給出一組圖片,按要求點(diǎn)擊其中一張或者多張。
這兩種原理相似,只不過(guò)是一個(gè)給出文字,點(diǎn)擊圖片中的文字;一個(gè)給出圖片,點(diǎn)出符合內(nèi)容的圖片。這兩種方法的共同點(diǎn)就是體驗(yàn)差,被廣為詬病。
(4)手機(jī)驗(yàn)證碼
對(duì)于一些重要的敏感信息訪問(wèn),網(wǎng)站或APP端一般會(huì)提供填寫手機(jī)驗(yàn)證碼的要求,通過(guò)手機(jī)接受網(wǎng)站發(fā)送的驗(yàn)證碼來(lái)進(jìn)一步訪問(wèn),這種方式對(duì)于數(shù)據(jù)隱私的保護(hù)比較好。
4、賬號(hào)密碼登陸
網(wǎng)站可以通過(guò)賬號(hào)登陸來(lái)限制爬蟲的訪問(wèn)權(quán)限,個(gè)人在使用很多網(wǎng)站服務(wù)的時(shí)候一般是需要進(jìn)行賬號(hào)注冊(cè)的,使用的時(shí)候需要通過(guò)賬號(hào)密碼登陸才能繼續(xù)使用服務(wù)。網(wǎng)站可以利用用戶瀏覽器的Cookie來(lái)對(duì)用戶的身份進(jìn)行識(shí)別,通過(guò)保存在用戶本地瀏覽器中加密的Cookie數(shù)據(jù)來(lái)進(jìn)行用戶訪問(wèn)會(huì)話的跟蹤。這一般作為前面幾種反爬方式的補(bǔ)充。
爬蟲技術(shù)的發(fā)展方向
傳統(tǒng)網(wǎng)絡(luò)爬蟲最大的應(yīng)用場(chǎng)景是搜索引擎,普通的企業(yè)更多是做網(wǎng)站或應(yīng)用。后來(lái)隨著網(wǎng)絡(luò)數(shù)據(jù)分析的需要,以及互聯(lián)網(wǎng)上的輿情事件層出不窮,針對(duì)網(wǎng)絡(luò)爬蟲有了大量的需求,采集的對(duì)象主要是些新聞資訊。
近些年,由于大數(shù)據(jù)處理和數(shù)據(jù)挖掘技術(shù)的發(fā)展,數(shù)據(jù)資產(chǎn)價(jià)值的概念深入人心,爬蟲技術(shù)得到更加廣泛和深入的發(fā)展,采集對(duì)象也更豐富,高性能、并發(fā)式的技術(shù)指標(biāo)也更高。
圍繞網(wǎng)絡(luò)爬蟲合法性的討論仍然存在,情況也比較復(fù)雜。目前的趨勢(shì)下,許多法律問(wèn)題還處于模糊地帶,往往取決于具體的案例影響。然而,可以肯定的是,只要有互聯(lián)網(wǎng),就會(huì)有網(wǎng)絡(luò)爬蟲。只有網(wǎng)絡(luò)爬蟲讓體量巨大的互聯(lián)網(wǎng)變得可以搜索,使爆炸式增長(zhǎng)的互聯(lián)網(wǎng)變得更加容易訪問(wèn)和獲取,在可預(yù)見(jiàn)的未來(lái),互聯(lián)網(wǎng)爬蟲技術(shù)將繼續(xù)得到發(fā)展。
互聯(lián)網(wǎng)作為人類歷史最大的知識(shí)倉(cāng)庫(kù),是非結(jié)構(gòu)化或非標(biāo)準(zhǔn)化的?;ヂ?lián)網(wǎng)上聚集了大量的文本、圖片、多媒體等數(shù)據(jù),內(nèi)容雖然非常有價(jià)值,但是知識(shí)提取的難度仍然非常巨大。語(yǔ)義互聯(lián)網(wǎng)、知識(shí)共享等概念越來(lái)越普及,真正語(yǔ)義上的互聯(lián)網(wǎng)將是網(wǎng)絡(luò)爬蟲的目標(biāo)。此外,物聯(lián)網(wǎng)技術(shù)的發(fā)展,將是互聯(lián)網(wǎng)的升級(jí)形式,也將是爬蟲技術(shù)未來(lái)發(fā)展的方向。