全國(guó)服務(wù)熱線:400-080-4418

您現(xiàn)在的位置是:首頁(yè) > 新聞資訊 > 網(wǎng)站建設(shè)常識(shí)

關(guān)于網(wǎng)絡(luò)爬蟲(chóng)的那些事:干掉偽裝的爬蟲(chóng)2009/8/13 13:05:00 瀏覽:87

在關(guān)于網(wǎng)絡(luò)爬蟲(chóng)的那些事(一)提到,如果爬蟲(chóng)偽裝自己的User-Agent信息,就必須尋找新的辦法來(lái)封殺爬蟲(chóng)了。事實(shí)上對(duì)網(wǎng)站來(lái)說(shuō),大的挑戰(zhàn)就是如何準(zhǔn)確的甄別一個(gè)IP發(fā)起的請(qǐng)求,究竟是真實(shí)用戶訪問(wèn)還是爬蟲(chóng)訪問(wèn)呢?

先說(shuō)點(diǎn)題外話,在很多年以前(2000年),我就做過(guò)網(wǎng)站流量統(tǒng)計(jì)系統(tǒng)。主流的網(wǎng)站流量統(tǒng)計(jì)系統(tǒng)不外乎兩種策略:一種策略是在網(wǎng)頁(yè)里面嵌入一段js,這段js會(huì)向特定的統(tǒng)計(jì)服務(wù)器發(fā)送請(qǐng)求的方式記錄訪問(wèn)量;另一種策略是直接分析服務(wù)器日志,來(lái)統(tǒng)計(jì)網(wǎng)站訪問(wèn)量。

在理想的情況下,嵌入js的方式統(tǒng)計(jì)的網(wǎng)站流量應(yīng)該高于分析服務(wù)器日志,這是因?yàn)橛脩魹g覽器會(huì)有緩存,不一定每次真實(shí)用戶訪問(wèn)都會(huì)觸發(fā)服務(wù)器的處理。但實(shí)際情況是,分析服務(wù)器日志得到的網(wǎng)站訪問(wèn)量遠(yuǎn)遠(yuǎn)高于嵌入js方式,極端情況下,甚至要高出10倍以上。

現(xiàn)在很多網(wǎng)站喜歡采用awstats來(lái)分析服務(wù)器日志,來(lái)計(jì)算網(wǎng)站的訪問(wèn)量,但是當(dāng)他們一旦采用Google Analytics來(lái)統(tǒng)計(jì)網(wǎng)站流量的時(shí)候,卻發(fā)現(xiàn)GA統(tǒng)計(jì)的流量遠(yuǎn)遠(yuǎn)低于awstats,所以開(kāi)始懷疑GA的準(zhǔn)確性。其實(shí)GA的統(tǒng)計(jì)確實(shí)會(huì)略低于真實(shí)的用戶訪問(wèn)量,但數(shù)據(jù)的真實(shí)性比較靠譜,不會(huì)偏差特別大。之所以略低是因?yàn)镚A的服務(wù)器有時(shí)候用戶訪問(wèn)不到,還有一種情況是訪問(wèn)JavaEye的用戶所在公司使用了白名單,他能訪問(wèn)JavaEye卻無(wú)法訪問(wèn)GA服務(wù)器,此外也有可能用戶還沒(méi)有等到GA加載就跳轉(zhuǎn)到下一頁(yè)了,所以統(tǒng)計(jì)量沒(méi)有被GA計(jì)算。

那么為什么GA和awstats統(tǒng)計(jì)會(huì)有這么大差異呢? 罪魁禍?zhǔn)拙褪前炎约簜窝b成瀏覽器的網(wǎng)絡(luò)爬蟲(chóng)。一些網(wǎng)絡(luò)爬蟲(chóng)為了避免被網(wǎng)站以識(shí)別User-Agent的方式封殺,就修改了自己的User-Agent信息,通常偽裝成WindowsXP上的IE6瀏覽器,也有偽裝成Firefox瀏覽器的。這種情況下awstats無(wú)法有效的識(shí)別了,所以awstats的統(tǒng)計(jì)數(shù)據(jù)會(huì)虛高。不過(guò)說(shuō)句公道話,這也怪不了awstats,只怪爬蟲(chóng)太狡猾,不但awstats無(wú)法有效識(shí)別,就算我們?nèi)庋廴ゲ榭慈罩荆餐鶡o(wú)法有效識(shí)別。

因此作為一個(gè)網(wǎng)站來(lái)說(shuō),如果希望了解自己的網(wǎng)站真實(shí)訪問(wèn)量,希望精確了解網(wǎng)站每個(gè)頻道的訪問(wèn)量和訪問(wèn)用戶,開(kāi)發(fā)自己的網(wǎng)站流量統(tǒng)計(jì)系統(tǒng)就顯得非常有必要性。JavaEye網(wǎng)站就開(kāi)發(fā)了自己的網(wǎng)站流量統(tǒng)計(jì)系統(tǒng),采用在頁(yè)面里面嵌入js的方式來(lái)實(shí)現(xiàn)網(wǎng)站流量統(tǒng)計(jì)。因此我們可以精確的掌握登錄用戶和非登錄用戶的比例,不同的訪問(wèn)偏好,JavaEye每個(gè)頻道精確的流量和比例,真實(shí)的用戶數(shù)量和分布等GA無(wú)法提供的有價(jià)值的信息。

JavaEye自己的流量統(tǒng)計(jì)系統(tǒng)盡管并不是為了甄別爬蟲(chóng)而編寫(xiě)的,但是他可以幫助甄別網(wǎng)絡(luò)爬蟲(chóng)。我們知道只有用戶使用瀏覽器訪問(wèn)頁(yè)面的時(shí)候才會(huì)執(zhí)行js,而爬蟲(chóng)并不會(huì)執(zhí)行頁(yè)面里面的js,所以rails的production.log里面出現(xiàn)的IP地址,卻并沒(méi)有相應(yīng)的流量統(tǒng)計(jì)系統(tǒng)記錄這個(gè)IP地址,我們可以99%的斷定這個(gè)IP是個(gè)爬蟲(chóng)。如果爬蟲(chóng)編寫(xiě)者專門偽裝真實(shí)IP向流量統(tǒng)計(jì)服務(wù)器發(fā)起請(qǐng)求的話,流量統(tǒng)計(jì)系統(tǒng)也有自己的防范作弊的機(jī)制,以及數(shù)據(jù)分析機(jī)制來(lái)甄別異常的訪問(wèn)請(qǐng)求,這點(diǎn)就不展開(kāi)討論了。

總之有了JavaEye流量統(tǒng)計(jì)系統(tǒng)提供的真實(shí)IP作為參考標(biāo)準(zhǔn),我們就可以拿日志里面出現(xiàn)的IP地址進(jìn)行比較,如果日志里面某個(gè)IP發(fā)起了大量的請(qǐng)求,在流量統(tǒng)計(jì)系統(tǒng)里面卻根本找不到,或者即使找得到,可訪問(wèn)量卻只有寥寥幾個(gè),那么這無(wú)疑就是一個(gè)網(wǎng)絡(luò)爬蟲(chóng),我們可以直接用iptables封殺該C段地址了。

根據(jù)這種策略,我們可以重新調(diào)整封殺方案。首先統(tǒng)計(jì)production.log,統(tǒng)計(jì)訪問(wèn)多的200個(gè)C段地址,這僅僅需要一條shell命令:

grep Processing production.log | awk ‘{print $4}’ | awk -F‘! ‘{print $1“!$2“。”$3“.0”}’ | sort | uniq -c | sort -r -n | head -n 200 》 stat_ip.log


這200個(gè)C段地址就是我們需要重點(diǎn)考察的對(duì)象,網(wǎng)絡(luò)爬蟲(chóng)就混跡在這200個(gè)C段地址之內(nèi)。它的格式大致如下,顯示訪問(wèn)請(qǐng)求多的C段IP地址和請(qǐng)求次數(shù):[Page]

99650 203.208.60.0

55813 123.125.66.0

21131 221.235.58.0

18360 72.14.199.0

14632 121.0.29.0

11789 202.165.185.0

10539 61.135.216.0

10153 65.55.106.0

7001 65.55.211.0

4240 65.55.207.0

3789 219.133.0.0

3721 194.8.74.0

然后我們還需要流量統(tǒng)計(jì)系統(tǒng)提供的真實(shí)IP地址的C段地址作為參考,這已經(jīng)由流量統(tǒng)計(jì)系統(tǒng)提供給我們了。

接著我們還需要準(zhǔn)備一個(gè)白名單列表,比方說(shuō)Google和百度的爬蟲(chóng)IP地址段,對(duì)于這些爬蟲(chóng),我們給予放行,究竟放行哪些爬蟲(chóng),就需要完全根據(jù)自己網(wǎng)站的情況而定了。例如JavaEye現(xiàn)在的白名單(還在不斷添加中):

60.28.204.0 抓蝦

61.135.163.0 百度

61.135.216.0 有道

65.55.106.0 微軟

65.55.207.0 微軟

65.55.211.0 微軟

66.249.66.0 Google

72.14.199.0 Google

121.0.29.0 阿里巴巴

123.125.66.0 百度

124.115.10.0 騰訊搜搜

124.115.11.0 騰訊搜搜

124.115.12.0 騰訊搜搜

203.208.60.0 Google

209.85.238.0 Google

219.239.34.0 鮮果

220.181.50.0 百度

220.181.61.0 搜狗

后我們還需要準(zhǔn)備一個(gè)IP地址庫(kù),對(duì)于那些被我們揪出來(lái)的爬蟲(chóng),我們還需要甄別一下他的身份,它究竟是一個(gè)惡意的爬蟲(chóng),還是一個(gè)未被我們放入白名單的合法爬蟲(chóng)呢?IP地址庫(kù)很容易從互聯(lián)網(wǎng)下載一份,所以也不展開(kāi)討論了?傊辛诉@些素材,我們要甄別網(wǎng)絡(luò)爬蟲(chóng)就十分簡(jiǎn)單了,僅僅十幾行ruby代碼就搞定了:

whitelist = []

IO.foreach(“#{RAILS_ROOT}/lib/whitelist.txt”) { |line| whitelist 《《 line.split[0].strip if line }

realiplist = []

IO.foreach(“#{RAILS_ROOT}/log/visit_ip.log”) { |line| realiplist 《《 line.strip if line }

iplist = []

IO.foreach(“#{RAILS_ROOT}/log/stat_ip.log”) do |line|

ip = line.split[1].strip

iplist 《《 ip if line.split[0].to_i 》 3000 && !whitelist.include?(ip) && !realiplist.include?(ip)

end

Report.deliver_crawler(iplist)
 


代碼的實(shí)現(xiàn)很簡(jiǎn)單,就是讀入訪問(wèn)請(qǐng)求次數(shù)超過(guò)3000次的C段地址,根據(jù)經(jīng)驗(yàn)來(lái)說(shuō),超過(guò)3000次的訪問(wèn)請(qǐng)求已經(jīng)非?梢闪。然后去掉白名單里面的C段地址,再去掉出現(xiàn)在真實(shí)訪問(wèn)列表中的IP地址段,后剩下來(lái)的就是高度可疑的C段地址了。對(duì)于這些地址查詢IP地址數(shù)據(jù)庫(kù)信息,再格式化成報(bào)告自動(dòng)給我發(fā)送電子郵件。

后需要人肉的簡(jiǎn)單識(shí)別,比方說(shuō)某地址的來(lái)源信息顯示為“Google公司總部”,那么我就知道這個(gè)地址需要添加到白名單里面。除去這些可以肉眼識(shí)別的地址,剩下來(lái)的就可以統(tǒng)統(tǒng)干掉了。

另外,對(duì)于這個(gè)簡(jiǎn)單的程序還需要進(jìn)一步完善,比方說(shuō)不是簡(jiǎn)單的根據(jù)realiplist進(jìn)行比對(duì)和排除,而是給realiplist也建立一個(gè)ip段的統(tǒng)計(jì)信息,即使該段地址有真實(shí)訪問(wèn)量,仍然需要進(jìn)一步甄別,用該地址的請(qǐng)求數(shù)量除以realiplist里面的訪問(wèn)數(shù)量,如果倍數(shù)大于一個(gè)閥值比方說(shuō)1000,就可以斷定仍然是網(wǎng)絡(luò)爬蟲(chóng)。

四、使用瀏覽器內(nèi)核驅(qū)動(dòng)的網(wǎng)絡(luò)爬蟲(chóng)

有人在文章后面的評(píng)論里面提到一種新的爬蟲(chóng)的爬取方式,就是不用程序去爬取,而是編程控制一個(gè)真正的瀏覽器內(nèi)核去爬取網(wǎng)站,由于瀏覽器內(nèi)核可以真正執(zhí)行js,所以會(huì)被識(shí)別為真實(shí)用戶訪問(wèn),從而避開(kāi)網(wǎng)站的檢查機(jī)制。這種爬蟲(chóng)是難以甄別的爬蟲(chóng),如果精心編寫(xiě),甚至可以欺騙Google的服務(wù)器。由于Safari的webkit瀏覽器內(nèi)核和Firefox的Gecko瀏覽器內(nèi)核都是開(kāi)源的,因此一個(gè)水平比較高的程序員自己動(dòng)手編寫(xiě)程序驅(qū)動(dòng)一個(gè)真實(shí)的瀏覽器內(nèi)核作為爬蟲(chóng)并不是非常困難的事情。

實(shí)際上這種爬蟲(chóng)我們也遇到過(guò)幾次,但也并不難以甄別,只是需要一定的手工甄別機(jī)制,難以用程序全部自動(dòng)化甄別。我們知道一個(gè)網(wǎng)站的真實(shí)用戶訪問(wèn)量如果沒(méi)有短期的市場(chǎng)推廣活動(dòng),那么會(huì)保持一個(gè)比較穩(wěn)定的水平,如果網(wǎng)站的訪問(wèn)量出現(xiàn)一個(gè)比較大的跳躍,或者網(wǎng)站頻道之間的訪問(wèn)比例出現(xiàn)突變,就可以99%斷定有此類爬蟲(chóng)出現(xiàn)了。[Page]

那么要甄別它也很簡(jiǎn)單,對(duì)真實(shí)訪問(wèn)IP進(jìn)行統(tǒng)計(jì)和排序,挑選出來(lái)前200名C段IP地址中每天訪問(wèn)量超過(guò)3000次的IP段地址,然后去除白名單,后再用IP地址數(shù)據(jù)庫(kù)去比對(duì)。根據(jù)經(jīng)驗(yàn)來(lái)說(shuō),一個(gè)C段地址每天超過(guò)3000次訪問(wèn)已經(jīng)肯定是一個(gè)大公司在訪問(wèn)JavaEye了,可如果該來(lái)源C段并非出自像阿里巴巴,IBM中國(guó)公司,搜狐,騰訊這樣的公司地址,就可以99%斷定是網(wǎng)絡(luò)爬蟲(chóng),直接用iptables干掉該C段地址。

總之,通過(guò)這種方式目前已經(jīng)可以有效甄別偽裝的網(wǎng)絡(luò)爬蟲(chóng),以及通過(guò)n多國(guó)外代理服務(wù)器的分布式網(wǎng)絡(luò)爬蟲(chóng),不過(guò)網(wǎng)站和爬蟲(chóng)之間的戰(zhàn)爭(zhēng)永遠(yuǎn)不會(huì)結(jié)束,我們可以通過(guò)每天的日志報(bào)告來(lái)檢測(cè)網(wǎng)站的運(yùn)行狀況,一旦發(fā)現(xiàn)數(shù)據(jù)報(bào)告異常,就知道有新的爬蟲(chóng)出現(xiàn),那么就可以通過(guò)日志分析尋找封殺它的新辦法。

服務(wù)網(wǎng)絡(luò)

關(guān)于我們

網(wǎng)至普專注于網(wǎng)站建設(shè)/網(wǎng)站優(yōu)化,始終追求 “您的滿意,我的追求!”。懂您所需、做您所想!我們一直在思考如何為客戶創(chuàng)造更大的價(jià)值,讓客戶更省心!立足上海,服務(wù)全國(guó)。服務(wù):上海,北京,廣州,深圳,成都,杭州,南京,蘇州,無(wú)錫等地

查看更多 >>

聯(lián)系我們

Copyright 2008 © 上海網(wǎng)至普信息科技有限公司 All rights reserved. 滬ICP備11006570號(hào)-13 滬公網(wǎng)安備 31011402007386號(hào)


關(guān)于我們 | 聯(lián)系我們 | 網(wǎng)站建設(shè)

返回頂部