爬蟲和反爬蟲及其原理_第1頁
爬蟲和反爬蟲及其原理_第2頁
爬蟲和反爬蟲及其原理_第3頁
爬蟲和反爬蟲及其原理_第4頁
爬蟲和反爬蟲及其原理_第5頁
已閱讀5頁,還剩8頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

成果名稱:爬蟲和反爬蟲及其原理實(shí)踐活動(dòng)題目一、實(shí)踐目的爬蟲和反爬蟲及其原理實(shí)踐內(nèi)容Web是一個(gè)開放的平臺(tái),這也奠定了Web從90年代初誕生直至今日將近30年來蓬勃的發(fā)展。然而,正所謂成也蕭何敗也蕭何,開放的特型、搜索引擎以及簡(jiǎn)單易學(xué)的HTML、CSS技術(shù)使得Web成為了互聯(lián)網(wǎng)領(lǐng)域里最為流行和成熟的信息傳播媒介;但如今作為商業(yè)化軟件,Web這個(gè)平臺(tái)上的內(nèi)容信息的版權(quán)卻毫無保證,因?yàn)橄啾溶浖蛻舳硕?,你的網(wǎng)頁中的內(nèi)容可以被很低成本、很低的技術(shù)門檻實(shí)現(xiàn)出的一些抓取程序獲取到,這也就是這一系列文章將要探討的話題——網(wǎng)絡(luò)爬蟲。有很多人認(rèn)為Web應(yīng)當(dāng)始終遵循開放的精神,呈現(xiàn)在頁面中的信息應(yīng)當(dāng)毫無保留地分享給整個(gè)互聯(lián)網(wǎng)。然而我認(rèn)為,在IT行業(yè)發(fā)展至今天,Web已經(jīng)不再是當(dāng)年那個(gè)和PDF一爭(zhēng)高下的所謂

“超文本”信息載體

了,它已經(jīng)是以一種

輕量級(jí)客戶端軟件

的意識(shí)形態(tài)的存在了。而商業(yè)軟件發(fā)展到今天,Web也不得不面對(duì)知識(shí)產(chǎn)權(quán)保護(hù)的問題,試想如果原創(chuàng)的高質(zhì)量?jī)?nèi)容得不到保護(hù),抄襲和盜版橫行網(wǎng)絡(luò)世界,這其實(shí)對(duì)Web生態(tài)的良性發(fā)展是不利的,也很難鼓勵(lì)更多的優(yōu)質(zhì)原創(chuàng)內(nèi)容的生產(chǎn)。實(shí)踐過程、什么是爬蟲?如何工作?1.爬蟲開始先要搞清楚什么是爬蟲。其實(shí)本質(zhì)上來說爬蟲就是一段程序代碼。任何程序語言都可以做爬蟲,只是繁簡(jiǎn)程度不同而已。從定義上來說,爬蟲就是模擬用戶自動(dòng)瀏覽并且保存網(wǎng)絡(luò)數(shù)據(jù)的程序,當(dāng)然,大部分的爬蟲都是爬取網(wǎng)頁信息(文本,圖片,媒體流)。但是人家維護(hù)網(wǎng)站的人也不是傻的,大量的用戶訪問請(qǐng)求可以視為對(duì)服務(wù)器的攻擊,這時(shí)候就要采取一些反爬機(jī)制來及時(shí)阻止人們的不知道是善意的還是惡意的大量訪問請(qǐng)求。2.如何工作要做一只爬蟲,首先就得知道他會(huì)干些什么,是怎樣工作的。所以得有一些關(guān)于HTML的前置知識(shí),這一點(diǎn)做過網(wǎng)頁的應(yīng)該最清楚了。HTML(超文本標(biāo)記語言),是一種標(biāo)記性語言,本身就是一長(zhǎng)串字符串,利用各種類似<a>,</a>這樣的標(biāo)簽來識(shí)別內(nèi)容,然后通過瀏覽器的實(shí)現(xiàn)標(biāo)準(zhǔn)來翻譯成精彩的頁面。當(dāng)然,一個(gè)好看的網(wǎng)頁并不僅僅只有HTML,畢竟字符串是靜態(tài)的,只能實(shí)現(xiàn)靜態(tài)效果,要作出漂亮的網(wǎng)頁還需要能美化樣式的CSS和實(shí)現(xiàn)動(dòng)態(tài)效果的JavaScipt,只要是瀏覽器都是支持這些玩意兒的。嗯,我們做爬蟲不需要了解太多,只需要了解HTML是基于文檔對(duì)象模型(DOM)的,以樹的結(jié)構(gòu),存儲(chǔ)各種標(biāo)記,3、個(gè)人爬蟲實(shí)踐示例見到花花綠綠的HTML代碼不要害怕,一個(gè)一個(gè)點(diǎn),直到找到需要的信息就行了,可以看到所有電影名都是在這樣:<divclass="pl2">(一)、爬蟲的角度最簡(jiǎn)單的爬蟲,是幾乎所有服務(wù)端、客戶端編程語言都支持的http請(qǐng)求,只要向目標(biāo)頁面的url發(fā)起一個(gè)httpget請(qǐng)求,即可獲得到瀏覽器加載這個(gè)頁面時(shí)的完整html文檔,這被我們稱之為“同步頁”。作為防守的一方,服務(wù)端可以根據(jù)http請(qǐng)求頭中的User-Agent來檢查客戶端是否是一個(gè)合法的瀏覽器程序,亦或是一個(gè)腳本編寫的抓取程序,從而決定是否將真實(shí)的頁面信息內(nèi)容下發(fā)給你。這當(dāng)然是最小兒科的防御手段,爬蟲作為進(jìn)攻的一方,完全可以偽造User-Agent字段,甚至,只要你愿意,http的get方法里,requestheader的

Referrer

、

Cookie

等等所有字段爬蟲都可以輕而易舉的偽造。此時(shí)服務(wù)端可以利用瀏覽器http頭指紋,根據(jù)你聲明的自己的瀏覽器廠商和版本(來自

User-Agent

),來鑒別你的httpheader中的各個(gè)字段是否符合該瀏覽器的特征,如不符合則作為爬蟲程序?qū)Υ?。這個(gè)技術(shù)有一個(gè)典型的應(yīng)用,就是

PhantomJS

1.x版本中,由于其底層調(diào)用了Qt框架的網(wǎng)絡(luò)庫(kù),因此http頭里有明顯的Qt框架網(wǎng)絡(luò)請(qǐng)求的特征,可以被服務(wù)端直接識(shí)別并攔截。除此之外,還有一種更加變態(tài)的服務(wù)端爬蟲檢測(cè)機(jī)制,就是對(duì)所有訪問頁面的http請(qǐng)求,在

httpresponse

中種下一個(gè)

cookietoken

,然后在這個(gè)頁面內(nèi)異步執(zhí)行的一些ajax接口里去校驗(yàn)來訪請(qǐng)求是否含有cookietoken,將token回傳回來則表明這是一個(gè)合法的瀏覽器來訪,否則說明剛剛被下發(fā)了那個(gè)token的用戶訪問了頁面html卻沒有訪問html內(nèi)執(zhí)行js后調(diào)用的ajax請(qǐng)求,很有可能是一個(gè)爬蟲程序。如果你不攜帶token直接訪問一個(gè)接口,這也就意味著你沒請(qǐng)求過html頁面直接向本應(yīng)由頁面內(nèi)ajax訪問的接口發(fā)起了網(wǎng)絡(luò)請(qǐng)求,這也顯然證明了你是一個(gè)可疑的爬蟲。知名電商網(wǎng)站amazon就是采用的這種防御策略。以上則是基于服務(wù)端校驗(yàn)爬蟲程序,可以玩出的一些套路手段。(二)、基于客戶端js運(yùn)行時(shí)的檢測(cè)現(xiàn)代瀏覽器賦予了JavaScript強(qiáng)大的能力,因此我們可以把頁面的所有核心內(nèi)容都做成js異步請(qǐng)求

ajax

獲取數(shù)據(jù)后渲染在頁面中的,這顯然提高了爬蟲抓取內(nèi)容的門檻。依靠這種方式,我們把對(duì)抓取與反抓取的對(duì)抗戰(zhàn)場(chǎng)從服務(wù)端轉(zhuǎn)移到了客戶端瀏覽器中的js運(yùn)行時(shí),接下來說一說結(jié)合客戶端js運(yùn)行時(shí)的爬蟲抓取技術(shù)。剛剛談到的各種服務(wù)端校驗(yàn),對(duì)于普通的python、java語言編寫的http抓取程序而言,具有一定的技術(shù)門檻,畢竟一個(gè)web應(yīng)用對(duì)于未授權(quán)抓取者而言是黑盒的,很多東西需要一點(diǎn)一點(diǎn)去嘗試,而花費(fèi)大量人力物力開發(fā)好的一套抓取程序,web站作為防守一方只要輕易調(diào)整一些策略,攻擊者就需要再次花費(fèi)同等的時(shí)間去修改爬蟲抓取邏輯。此時(shí)就需要使用headlessbrowser了,這是什么技術(shù)呢?其實(shí)說白了就是,讓程序可以操作瀏覽器去訪問網(wǎng)頁,這樣編寫爬蟲的人可以通過調(diào)用瀏覽器暴露出來給程序調(diào)用的api去實(shí)現(xiàn)復(fù)雜的抓取業(yè)務(wù)邏輯。其實(shí)近年來這已經(jīng)不算是什么新鮮的技術(shù)了,從前有基于webkit內(nèi)核的PhantomJS,基于Firefox瀏覽器內(nèi)核的SlimerJS,甚至基于IE內(nèi)核的trifleJS,有興趣可以看看這里和這里是兩個(gè)headlessbrowser的收集列表。這些headlessbrowser程序?qū)崿F(xiàn)的原理其實(shí)是把開源的一些瀏覽器內(nèi)核C++代碼加以改造和封裝,實(shí)現(xiàn)一個(gè)簡(jiǎn)易的無GUI界面渲染的browser程序。但這些項(xiàng)目普遍存在的問題是,由于他們的代碼基于fork官方webkit等內(nèi)核的某一個(gè)版本的主干代碼,因此無法跟進(jìn)一些最新的css屬性和js語法,并且存在一些兼容性的問題,不如真正的release版GUI瀏覽器。這其中最為成熟、使用率最高的應(yīng)該當(dāng)屬

PhantonJS

了,對(duì)這種爬蟲的識(shí)別我之前曾寫過一篇博客,這里不再贅述。PhantomJS存在諸多問題,因?yàn)槭菃芜M(jìn)程模型,沒有必要的沙箱保護(hù),瀏覽器內(nèi)核的安全性較差。如今GoogleChrome團(tuán)隊(duì)在chrome59release版本中開放了headlessmodeapi,并開源了一個(gè)基于Node.js調(diào)用的headlesschromiumdirver庫(kù),我也為這個(gè)庫(kù)貢獻(xiàn)了一個(gè)centos環(huán)境的部署依賴安裝列表。headlesschrome可謂是headlessbrowser中獨(dú)樹一幟的大殺器,由于其自身就是一個(gè)chrome瀏覽器,因此支持各種新的css渲染特性和js運(yùn)行時(shí)語法?;谶@樣的手段,爬蟲作為進(jìn)攻的一方可以繞過幾乎所有服務(wù)端校驗(yàn)邏輯,但是這些爬蟲在客戶端的js運(yùn)行時(shí)中依然存在著一些破綻,諸如:1.基于plugin對(duì)象的檢查2.基于language的檢查3.基于webgl的檢查4.基于瀏覽器hairline特性的檢查5.基于錯(cuò)誤imgsrc屬性生成的img對(duì)象的檢查基于以上的一些瀏覽器特性的判斷,基本可以通殺市面上大多數(shù)headlessbrowser

程序。在這一點(diǎn)上,實(shí)際上是將網(wǎng)頁抓取的門檻提高,要求編寫爬蟲程序的開發(fā)者不得不修改瀏覽器內(nèi)核的C++代碼,重新編譯一個(gè)瀏覽器,并且,以上幾點(diǎn)特征是對(duì)瀏覽器內(nèi)核的改動(dòng)其實(shí)并不小。更進(jìn)一步,我們還可以基于瀏覽器的

UserAgent

字段描述的瀏覽器品牌、版本型號(hào)信息,對(duì)js運(yùn)行時(shí)、DOM和BOM的各個(gè)原生對(duì)象的屬性及方法進(jìn)行檢驗(yàn),觀察其特征是否符合該版本的瀏覽器所應(yīng)具備的特征。這種方式被稱為

瀏覽器指紋檢查

技術(shù),依托于大型web站對(duì)各型號(hào)瀏覽器api信息的收集。而作為編寫爬蟲程序的進(jìn)攻一方,則可以在headlessbrowser

運(yùn)行時(shí)里預(yù)注入一些js邏輯,偽造瀏覽器的特征。另外,在研究瀏覽器端利用jsapi進(jìn)行

robotsbrowserdetect時(shí),我們發(fā)現(xiàn)了一個(gè)有趣的小技巧,你可以把一個(gè)預(yù)注入的js函數(shù),偽裝成一個(gè)nativefunction,來看看下面代碼:爬蟲進(jìn)攻方可能會(huì)預(yù)注入一些js方法,把原生的一些api外面包裝一層proxyfunction作為hook,然后再用這個(gè)假的jsapi去覆蓋原生api。如果防御者在對(duì)此做檢查判斷時(shí)是基于把函數(shù)toString之后對(duì)[nativecode]的檢查,那么就會(huì)被繞過。所以需要更嚴(yán)格的檢查,因?yàn)閎ind(null)偽造的方法,在toString之后是不帶函數(shù)名的。(三)、反爬蟲的銀彈目前的反抓取、機(jī)器人檢查手段,最可靠的還是驗(yàn)證碼技術(shù)。但驗(yàn)證碼并不意味著一定要強(qiáng)迫用戶輸入一連串字母數(shù)字,也有很多基于用戶鼠標(biāo)、觸屏(移動(dòng)端)等行為的行為驗(yàn)證技術(shù),這其中最為成熟的當(dāng)屬GooglereCAPTCHA?;谝陨现T多對(duì)用戶與爬蟲的識(shí)別區(qū)分技術(shù),網(wǎng)站的防御方最終要做的是封禁ip地址或是對(duì)這個(gè)ip的來訪用戶施以高強(qiáng)度的驗(yàn)證碼策略。這樣一來,進(jìn)攻方不得不購(gòu)買ip代理池來抓取網(wǎng)站信息內(nèi)容,否則單個(gè)ip地址很容易被封導(dǎo)致無法抓取。抓取與反抓取的門檻被提高到了ip代理池經(jīng)濟(jì)費(fèi)用的層面。(四)、機(jī)器人協(xié)議除此之外,在爬蟲抓取技術(shù)領(lǐng)域還有一個(gè)“白道”的手段,叫做robots協(xié)議。你可以在一個(gè)網(wǎng)站的根目錄下訪問/robots.txt,比如讓我們一起來看看github的機(jī)器人協(xié)議,Allow和Disallow聲明了對(duì)各個(gè)UA爬蟲的抓取授權(quán)。不過,這只是一個(gè)君子協(xié)議,雖具有法律效益,但只能夠限制那些商業(yè)搜索引擎的蜘蛛程序,你無法對(duì)那些“野爬愛好者”加以限制。(五)、反爬蟲機(jī)制1.檢驗(yàn)數(shù)據(jù)頭User-Agent反爬蟲機(jī)制解析:當(dāng)我們使用瀏覽器訪問網(wǎng)站的時(shí)候,瀏覽器會(huì)發(fā)送一小段信息給網(wǎng)站,我們稱為RequestHeaders,在這個(gè)頭部信息里面包含了本次訪問的一些信息,例如編碼方式,當(dāng)前地址,將要訪問的地址等等。這些信息一般來說是不必要的,但是現(xiàn)在很多網(wǎng)站會(huì)把這些信息利用起來。其中最常被用到的一個(gè)信息,叫做“User-Agent”。網(wǎng)站可以通過User-Agent來判斷用戶是使用什么瀏覽器訪問。不同瀏覽器的User-Agent是不一樣的,但都有遵循一定的規(guī)則。但是如果我們使用Python的Requests直接訪問網(wǎng)站,除了網(wǎng)址不提供其他的信息,那么網(wǎng)站收到的User-Agent是空。這個(gè)時(shí)候網(wǎng)站就知道我們不是使用瀏覽器訪問的,于是它于是它就可以拒絕我們的訪問。2.訪問頻率限制或檢驗(yàn)大多數(shù)情況下,我們遇到的是訪問頻率限制。如果你訪問太快了,網(wǎng)站就會(huì)認(rèn)為你不是一個(gè)人。這種情況下需要設(shè)定好頻率的閾值,否則有可能誤傷。如果大家考過托福,或者在12306上面買過火車票,你應(yīng)該會(huì)有這樣的體會(huì),有時(shí)候即便你是真的用手在操作頁面,但是因?yàn)槟闶髽?biāo)點(diǎn)得太快了,它都會(huì)提示你:“操作頻率太快…”。另外,還可以檢驗(yàn)訪問頻率是否每一次都相同,如果都相同,那么一定是爬蟲了.3.蜜罐技術(shù)蜜罐這個(gè)詞,最早是來自于網(wǎng)絡(luò)攻防中。一方會(huì)故意設(shè)置一個(gè)或者幾個(gè)服務(wù)器,故意留下漏洞,讓另一方輕易的入侵進(jìn)來。這些被故意設(shè)置的服務(wù)器,就叫做蜜罐。里面可能安裝了監(jiān)控軟件,用來監(jiān)控入侵者。同時(shí),蜜罐還可以拖延入侵者的時(shí)間。在反爬蟲的機(jī)制中,也有一種蜜罐技術(shù)。網(wǎng)頁上會(huì)故意留下一些人類看不到或者絕對(duì)不會(huì)點(diǎn)擊的鏈接。由于爬蟲會(huì)從源代碼中獲取內(nèi)容,所以爬蟲可能會(huì)訪問這樣的鏈接。這個(gè)時(shí)候,只要網(wǎng)站發(fā)現(xiàn)了有IP訪問這個(gè)鏈接,立刻永久封禁該IP+User-Agent+Mac地址等等可以用于識(shí)別訪問者身份的所有信息。這個(gè)時(shí)候,訪問者即便是把IP換了,也沒有辦法訪問這個(gè)網(wǎng)站了。給爬蟲造成了非常大的訪問障礙。實(shí)踐體會(huì)首先我覺得很難,不是為了實(shí)踐報(bào)告,我不會(huì)學(xué)爬蟲的,爬蟲對(duì)網(wǎng)頁內(nèi)容的抓取與反制,注定是一個(gè)魔高一尺道高一丈的貓鼠游戲,你永遠(yuǎn)不可能以某一種技術(shù)徹底封死爬蟲程序的路,你能做的只是提高攻擊者的抓取成本,并對(duì)于未授權(quán)的抓取行為做到較為精確的獲悉。java當(dāng)中,爬蟲主要通過httpclient向服務(wù)器發(fā)送請(qǐng)求,然后通過Jsoup來解析對(duì)方接口給我們返回

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論