激情五月婷婷综合网_奇米精品一区二区三区四区_91在线码无精品_国产精品久久久久一区二区三区_日韩一区二区在线看_99国产欧美另类久久久精品_日韩电影免费一区_亚洲欧美在线另类_9色porny自拍视频一区二区_久久一区二区三区四区_日本在线不卡视频_欧美日韩三级一区二区_亚洲欧美日韩国产综合在线_国产精品影视网_欧美中文字幕一区_制服.丝袜.亚洲.中文.综合

0712-2888027 189-8648-0214
微信公眾號

孝感風信網絡科技有限公司微信公眾號

當前位置:主頁 > 技術支持 > Linux > 互聯網網站的反爬蟲策略淺析

互聯網網站的反爬蟲策略淺析

時間:2016-05-18來源:風信官網 點擊: 1072次

因為搜索引擎的流行,網絡爬蟲已經成了很普及網絡技術,除了專門做搜索的Google,Yahoo,微軟,百度以外,幾乎每個大型 門戶網站都有自己的搜索引擎,大大小小叫得出來名字得就幾十種,還有各種不知名的幾千幾萬種,對于一個內容型驅動的網站來說,受到網絡爬蟲的光顧是不可避 免的。

一些智能的搜索引擎爬蟲的爬取頻率比較合理,對網站資源消耗比較少,但是很多糟糕的網絡爬蟲,對網頁爬取能力很差,經常并發幾十上百個請求循環重復 抓取,這種爬蟲對中小型網站往往是毀滅性打擊,特別是一些缺乏爬蟲編寫經驗的程序員寫出來的爬蟲破壞力極強,造成的網站訪問壓力會非常大,會導致網站訪問 速度緩慢,甚至無法訪問。

手工識別和拒絕爬蟲的訪問

相當多的爬蟲對網站會造成非常高的負載,因此識別爬蟲的來源IP是很容易的事情。最簡單的辦法就是用netstat檢查80端口的連接:

netstat -nt | grep youhostip:80 | awk '{print $5}' | awk -F":" '{print $1}'| sort | uniq -c | sort -r -n 

這行shell可以按照80端口連接數量對來源IP進行排序,這樣可以直觀的判斷出來網頁爬蟲。一般來說爬蟲的并發連接非常高。

如果使用lighttpd做Web Server,那么就更簡單了。lighttpd的mod_status提供了非常直觀的并發連接的信息,包括每個連接的來源IP,訪問的URL,連接狀 態和連接時間等信息,只要檢查那些處于handle-request狀態的高并發IP就可以很快確定爬蟲的來源IP了。

拒絕爬蟲請求既可以通過內核防火墻來拒絕,也可以在web server拒絕,比方說用iptables拒絕:

iptables -A INPUT -i eth0 -j DROP -p tcp --dport 80 -s 84.80.46.0/24  

直接封鎖爬蟲所在的C網段地址。這是因為一般爬蟲都是運行在托管機房里面,可能在一個C段里面的多臺服務器上面都有爬蟲,而這個C段不可能是用戶寬帶上網,封鎖C段可以很大程度上解決問題。

通過識別爬蟲的User-Agent信息來拒絕爬蟲

有很多爬蟲并不會以很高的并發連接爬取,一般不容易暴露自己;有些爬蟲的來源IP分布很廣,很難簡單的通過封鎖IP段地址來解決問題;另外還有很多 各種各樣的小爬蟲,它們在嘗試Google以外創新的搜索方式,每個爬蟲每天爬取幾萬的網頁,幾十個爬蟲加起來每天就能消耗掉上百萬動態請求的資源,由于 每個小爬蟲單獨的爬取量都很低,所以你很難把它從每天海量的訪問IP地址當中把它準確的挖出來。

這種情況下我們可以通過爬蟲的User-Agent信息來識別。每個爬蟲在爬取網頁的時候,會聲明自己的User-Agent信息,因此我們就可以 通過記錄和分析User-Agent信息來挖掘和封鎖爬蟲。我們需要記錄每個請求的User-Agent信息,對于Rails來說我們可以簡單的在 app/controllers/application.rb里面添加一個全局的before_filter,來記錄每個請求的User-Agent信 息:

logger.info "HTTP_USER_AGENT #{request.env["HTTP_USER_AGENT"]}"  

然后統計每天的production.log,抽取User-Agent信息,找出訪問量最大的那些User-Agent。要注意的是我們只關注那 些爬蟲的User-Agent信息,而不是真正瀏覽器User-Agent,所以還要排除掉瀏覽器User-Agent,要做到這一點僅僅需要一行 shell:

grep HTTP_USER_AGENT production.log | grep -v -E 'MSIE|Firefox|Chrome|Opera|Safari|Gecko' | sort | uniq -c | sort -r -n | head -n 100 > bot.log

統計結果類似這樣:

  57335 HTTP_USER_AGENT Baiduspider+(+http://www.baidu.com/search/spider.htm)
  56639 HTTP_USER_AGENT Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)
  42610 HTTP_USER_AGENT Mediapartners-Google
  19131 HTTP_USER_AGENT msnbot/2.0b (+http://search.msn.com/msnbot.htm)    

從日志就可以直觀的看出每個爬蟲的請求次數。要根據User-Agent信息來封鎖爬蟲是件很容易的事情,lighttpd配置如下:

$HTTP["useragent"] =~ "qihoobot|^Java|Commons-HttpClient|Wget|^PHP|Ruby|Python" {
  url.rewrite = ( "^/(.*)" => "/crawler.html" )
}

使用這種方式來封鎖爬蟲雖然簡單但是非常有效,除了封鎖特定的爬蟲,還可以封鎖常用的編程語言和HTTP類庫的User-Agent信息,這樣就可以避免很多無謂的程序員用來練手的爬蟲程序對網站的騷擾。

還有一種比較常見的情況,就是某個搜索引擎的爬蟲對網站爬取頻率過高,但是搜索引擎給網站帶來了很多流量,我們并不希望簡單的封鎖爬蟲,僅僅是希望降低爬蟲的請求頻率,減輕爬蟲對網站造成的負載,那么我們可以這樣做:

$HTTP["user-agent"] =~ "Baiduspider+" {
    connection.delay-seconds = 10
}    

對百度的爬蟲請求延遲10秒鐘再進行處理,這樣就可以有效降低爬蟲對網站的負載了。

通過網站流量統計系統和日志分析來識別爬蟲

有些爬蟲喜歡修改User-Agent信息來偽裝自己,把自己偽裝成一個真實瀏覽器的User-Agent信息,讓你無法有效的識別。這種情況下我們可以通過網站流量系統記錄的真實用戶訪問IP來進行識別。

主流的網站流量統計系統不外乎兩種實現策略:一種策略是在網頁里面嵌入一段js,這段js會向特定的統計服務器發送請求的方式記錄訪問量;另一種策 略是直接分析服務器日志,來統計網站訪問量。在理想的情況下,嵌入js的方式統計的網站流量應該高于分析服務器日志,這是因為用戶瀏覽器會有緩存,不一定 每次真實用戶訪問都會觸發服務器的處理。但實際情況是,分析服務器日志得到的網站訪問量遠遠高于嵌入js方式,極端情況下,甚至要高出10倍以上。

現在很多網站喜歡采用awstats來分析服務器日志,來計算網站的訪問量,但是當他們一旦采用Google Analytics來統計網站流量的時候,卻發現GA統計的流量遠遠低于awstats,為什么GA和awstats統計會有這么大差異呢?罪魁禍首就是 把自己偽裝成瀏覽器的網絡爬蟲。這種情況下awstats無法有效的識別了,所以awstats的統計數據會虛高。

其實作為一個網站來說,如果希望了解自己的網站真實訪問量,希望精確了解網站每個頻道的訪問量和訪問用戶,應該用頁面里面嵌入js的方式來開發自己 的網站流量統計系統。自己做一個網站流量統計系統是件很簡單的事情,寫段服務器程序響應客戶段js的請求,分析和識別請求然后寫日志的同時做后臺的異步統 計就搞定了。

通過流量統計系統得到的用戶IP基本是真實的用戶訪問,因為一般情況下爬蟲是無法執行網頁里面的js代碼片段的。所以我們可以拿流量統計系統記錄的 IP和服務器程序日志記錄的IP地址進行比較,如果服務器日志里面某個IP發起了大量的請求,在流量統計系統里面卻根本找不到,或者即使找得到,可訪問量 卻只有寥寥幾個,那么無疑就是一個網絡爬蟲。

分析服務器日志統計訪問最多的IP地址段一行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

然后把統計結果和流量統計系統記錄的IP地址進行對比,排除真實用戶訪問IP,再排除我們希望放行的網頁爬蟲,比方Google,百度,微軟msn爬蟲等等。最后的分析結果就就得到了爬蟲的IP地址了。以下代碼段是個簡單的實現示意:

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)

分析服務器日志里面請求次數超過3000次的IP地址段,排除白名單地址和真實訪問IP地址,最后得到的就是爬蟲IP了,然后可以發送郵件通知管理員進行相應的處理。

網站的實時反爬蟲防火墻實現策略

通過分析日志的方式來識別網頁爬蟲不是一個實時的反爬蟲策略。如果一個爬蟲非要針對你的網站進行處心積慮的爬取,那么他可能會采用分布式爬取策略, 比方說尋找幾百上千個國外的代理服務器瘋狂的爬取你的網站,從而導致網站無法訪問,那么你再分析日志是不可能及時解決問題的。所以必須采取實時反爬蟲策 略,要能夠動態的實時識別和封鎖爬蟲的訪問。

要自己編寫一個這樣的實時反爬蟲系統其實也很簡單。比方說我們可以用memcached來做訪問計數器,記錄每個IP的訪問頻度,在單位時間之內, 如果訪問頻率超過一個閥值,我們就認為這個IP很可能有問題,那么我們就可以返回一個驗證碼頁面,要求用戶填寫驗證碼。如果是爬蟲的話,當然不可能填寫驗 證碼,所以就被拒掉了,這樣很簡單就解決了爬蟲問題。

用memcache記錄每個IP訪問計數,單位時間內超過閥值就讓用戶填寫驗證碼,用Rails編寫的示例代碼如下:

ip_counter = Rails.cache.increment(request.remote_ip)
if !ip_counter
  Rails.cache.write(request.remote_ip, 1, :expires_in => 30.minutes)
elsif ip_counter > 2000
  render :template => 'test', :status => 401 and return false
end

這段程序只是最簡單的示例,實際的代碼實現我們還會添加很多判斷,比方說我們可能要排除白名單IP地址段,要允許特定的User-Agent通過,要針對登錄用戶和非登錄用戶,針對有無referer地址采取不同的閥值和計數加速器等等。

此外如果分布式爬蟲爬取頻率過高的話,過期就允許爬蟲再次訪問還是會對服務器造成很大的壓力,因此我們可以添加一條策略:針對要求用戶填寫驗證碼的 IP地址,如果該IP地址短時間內繼續不停的請求,則判斷為爬蟲,加入黑名單,后續請求全部拒絕掉。為此,示例代碼可以改進一下:

before_filter :ip_firewall, :except => :test
def ip_firewall
  render :file => "#{RAILS_ROOT}/public/403.html", :status => 403 if BlackList.include?(ip_sec)
end    

我們可以定義一個全局的過濾器,對所有請求進行過濾,出現在黑名單的IP地址一律拒絕。對非黑名單的IP地址再進行計數和統計:

ip_counter = Rails.cache.increment(request.remote_ip)
if !ip_counter
  Rails.cache.write(request.remote_ip, 1, :expires_in => 30.minutes)
elsif ip_counter > 2000
  crawler_counter = Rails.cache.increment("crawler/#{request.remote_ip}")
  if !crawler_counter
    Rails.cache.write("crawler/#{request.remote_ip}", 1, :expires_in => 10.minutes)
  elsif crawler_counter > 50
    BlackList.add(ip_sec)
    render :file => "#{RAILS_ROOT}/public/403.html", :status => 403 and return false
  end
  render :template => 'test', :status => 401 and return false
end

如果某個IP地址單位時間內訪問頻率超過閥值,再增加一個計數器,跟蹤他會不會立刻填寫驗證碼,如果他不填寫驗證碼,在短時間內還是高頻率訪問,就 把這個IP地址段加入黑名單,除非用戶填寫驗證碼激活,否則所有請求全部拒絕。這樣我們就可以通過在程序里面維護黑名單的方式來動態的跟蹤爬蟲的情況,甚 至我們可以自己寫個后臺來手工管理黑名單列表,了解網站爬蟲的情況。

關于這個通用反爬蟲的功能,我們開發一個開源的插件:https://github.com/csdn-dev/limiter

這個策略已經比較智能了,但是還不夠好!我們還可以繼續改進:

1、用網站流量統計系統來改進實時反爬蟲系統

還記得嗎?網站流量統計系統記錄的IP地址是真實用戶訪問IP,所以我們在網站流量統計系統里面也去操作memcached,但是這次不是增加計數 值,而是減少計數值。在網站流量統計系統里面每接收到一個IP請求,就相應的cache.decrement(key)。所以對于真實用戶的IP來說,它 的計數值總是加1然后就減1,不可能很高。這樣我們就可以大大降低判斷爬蟲的閥值,可以更加快速準確的識別和拒絕掉爬蟲。

2、用時間窗口來改進實時反爬蟲系統

爬蟲爬取網頁的頻率都是比較固定的,不像人去訪問網頁,中間的間隔時間比較無規則,所以我們可以給每個IP地址建立一個時間窗口,記錄IP地址最近 12次訪問時間,每記錄一次就滑動一次窗口,比較最近訪問時間和當前時間,如果間隔時間很長判斷不是爬蟲,清除時間窗口,如果間隔不長,就回溯計算指定時 間段的訪問頻率,如果訪問頻率超過閥值,就轉向驗證碼頁面讓用戶填寫驗證碼。

最終這個實時反爬蟲系統就相當完善了,它可以很快的識別并且自動封鎖爬蟲的訪問,保護網站的正常訪問。不過有些爬蟲可能相當狡猾,它也許會通過大量 的爬蟲測試來試探出來你的訪問閥值,以低于閥值的爬取速度抓取你的網頁,因此我們還需要輔助第3種辦法,用日志來做后期的分析和識別,就算爬蟲爬的再慢, 它累計一天的爬取量也會超過你的閥值被你日志分析程序識別出來。

總之我們綜合運用上面的四種反爬蟲策略,可以很大程度上緩解爬蟲對網站造成的負面影響,保證網站的正常訪問。

熱門關鍵詞: 互聯網 網站 反爬蟲策略
欄目列表
推薦內容
熱點內容
展開
激情五月婷婷综合网_奇米精品一区二区三区四区_91在线码无精品_国产精品久久久久一区二区三区_日韩一区二区在线看_99国产欧美另类久久久精品_日韩电影免费一区_亚洲欧美在线另类_9色porny自拍视频一区二区_久久一区二区三区四区_日本在线不卡视频_欧美日韩三级一区二区_亚洲欧美日韩国产综合在线_国产精品影视网_欧美中文字幕一区_制服.丝袜.亚洲.中文.综合
日韩视频在线观看一区二区| 久久色.com| 欧美一级欧美一级在线播放| 国产精品视频免费| 久久国内精品自在自线400部| 91久久久免费一区二区| 国产亚洲精品bt天堂精选| 日本不卡中文字幕| 欧洲一区二区三区免费视频| 欧美韩国日本不卡| 韩日av一区二区| 欧美夫妻性生活| 一级精品视频在线观看宜春院| 国产91精品在线观看| 欧美一级专区免费大片| 亚洲一区二区综合| 99精品在线观看视频| 久久综合九色欧美综合狠狠| 日韩精品电影在线| 在线免费视频一区二区| 中文字幕一区二区三区四区不卡| 国产一区二区按摩在线观看| 欧美一三区三区四区免费在线看| 一区二区三区精品视频在线| 成人app软件下载大全免费| 久久久美女毛片| 免费的成人av| 欧美一区二区在线免费观看| 亚洲午夜久久久久久久久久久| 91精品91久久久中77777| 亚洲特黄一级片| 99精品一区二区| 中文字幕中文乱码欧美一区二区 | 亚洲在线视频免费观看| 99re热这里只有精品免费视频 | 蜜臀av性久久久久蜜臀aⅴ| 欧美日韩免费电影| 五月婷婷色综合| 4438x成人网最大色成网站| 婷婷综合五月天| 88在线观看91蜜桃国自产| 亚洲 欧美综合在线网络| 欧美日本一区二区在线观看| 午夜精品一区二区三区电影天堂| 欧美另类久久久品| 免费在线观看成人| 精品国产一区二区三区忘忧草| 韩国欧美国产一区| 国产婷婷色一区二区三区在线| 国产一区二区三区最好精华液| 久久久精品tv| 99re热这里只有精品免费视频 | 成人黄色小视频| 久久久精品2019中文字幕之3| 高清免费成人av| 中文字幕佐山爱一区二区免费| 99久久国产综合色|国产精品| 一区二区三区日韩| 在线不卡a资源高清| 久久国产精品99久久久久久老狼 | 亚洲国产精品人人做人人爽| 欧美日高清视频| 日本最新不卡在线| 久久久久高清精品| 91丝袜美腿高跟国产极品老师| 夜色激情一区二区| 欧美一级搡bbbb搡bbbb| 国产精品一区二区在线播放| 亚洲欧美在线视频| 欧美性猛交xxxxxxxx| 日韩和欧美一区二区| 久久噜噜亚洲综合| 色综合久久久久综合体| 日韩高清不卡在线| 国产亚洲一区字幕| 欧美性色黄大片| 激情成人综合网| 亚洲欧美日韩在线不卡| 91精品国产综合久久久久| 国产成人啪午夜精品网站男同| 亚洲美女屁股眼交| 欧美一区二区视频在线观看2022 | 欧美一区二区三区视频免费播放| 狠狠色狠狠色综合日日91app| 国产精品剧情在线亚洲| 欧美日韩精品高清| 国产在线国偷精品免费看| 亚洲欧洲精品一区二区精品久久久 | 五月激情综合婷婷| 国产亚洲成av人在线观看导航| 色综合久久中文字幕综合网| 男人操女人的视频在线观看欧美| 国产欧美精品一区aⅴ影院| 欧美视频在线播放| 国产福利一区二区三区视频在线 | 中文字幕av不卡| 欧美婷婷六月丁香综合色| 激情综合亚洲精品| 一级日本不卡的影视| 久久久无码精品亚洲日韩按摩| 91久久精品日日躁夜夜躁欧美| 国内外成人在线视频| 亚洲国产一区二区a毛片| 国产日韩精品一区二区三区| 欧美人与z0zoxxxx视频| 成人h动漫精品| 美女一区二区三区| 亚洲精品日韩综合观看成人91| 2欧美一区二区三区在线观看视频| 日本高清不卡视频| 国产999精品久久久久久绿帽| 日韩专区中文字幕一区二区| 国产精品嫩草久久久久| 欧美一级搡bbbb搡bbbb| 色久优优欧美色久优优| 国产精品白丝av| 日韩电影免费在线看| 亚洲精品国产成人久久av盗摄| 久久嫩草精品久久久久| 欧美久久久久久蜜桃| 91一区二区三区在线观看| 久久激情综合网| 亚洲成av人片观看| 亚洲人精品午夜| 日本一区二区高清| 精品成人在线观看| 欧美一区在线视频| 欧美色综合久久| 99精品国产热久久91蜜凸| 国产精品一二三区| 精品在线观看视频| 青青草97国产精品免费观看| 亚洲一区在线视频| 亚洲青青青在线视频| 日本一区二区动态图| 久久女同性恋中文字幕| 日韩欧美美女一区二区三区| 欧美日韩国产美| 欧美午夜影院一区| 99re在线精品| 不卡一区二区三区四区| 国产福利一区二区三区在线视频| 麻豆国产欧美日韩综合精品二区 | 日韩av一区二区三区四区| 一区二区三国产精华液| 国产精品福利影院| 国产精品天美传媒沈樵| 久久久777精品电影网影网| 日韩你懂的电影在线观看| 欧美精品一卡两卡| 欧美日韩精品高清| 精品视频免费看| 欧美主播一区二区三区| 色视频一区二区| 日本久久电影网| 色婷婷精品久久二区二区蜜臂av | 制服丝袜日韩国产| 欧美日韩一级二级| 欧美亚洲图片小说| 欧美优质美女网站| 日本韩国一区二区三区视频| 99久久婷婷国产综合精品| 成人激情免费电影网址| 成人三级伦理片| 波多野洁衣一区| av高清不卡在线| 成人国产一区二区三区精品| 成人夜色视频网站在线观看| 成人永久免费视频| voyeur盗摄精品| 久久综合国产精品| 久久日韩粉嫩一区二区三区| 久久久久久久精| 国产欧美日韩视频一区二区| 国产女主播视频一区二区| 中文字幕av一区 二区| 国产精品欧美综合在线| 国产精品污网站| 一区二区中文视频| 一区二区三区日韩欧美精品| 一区二区三区在线免费播放| 亚洲国产视频在线| 免费在线观看一区| 国产麻豆成人精品| 99热这里都是精品| 在线观看一区二区视频| 欧美欧美欧美欧美| 欧美xxxxxxxx| 久久精品欧美一区二区三区不卡| 久久午夜色播影院免费高清| 国产欧美久久久精品影院| 成人欧美一区二区三区白人 | 99久久精品情趣| 欧美性高清videossexo| 欧美一区二区三区四区高清| 日韩精品一区二区三区在线观看| 精品88久久久久88久久久| 日本一区二区三区dvd视频在线| 中文字幕在线不卡| 亚洲线精品一区二区三区|