日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

反爬虫技术整理

發布時間:2025/7/14 编程问答 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 反爬虫技术整理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

????????因為搜索引擎的流行,網絡爬蟲已經成了很普及網絡技術,除了專門做搜索的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].stripiplist?<<?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_counterRails.cache.write(request.remote_ip,?1,?:expires_in?=>?30.minutes)elsif?ip_counter?>?2000render?:template?=>?'test',?:status?=>?401?and?return?falseend

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

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

before_filter?:ip_firewall,?:except?=>?:testdef?ip_firewallrender?: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_counterRails.cache.write(request.remote_ip,?1,?:expires_in?=>?30.minutes)elsif?ip_counter?>?2000crawler_counter?=?Rails.cache.increment("crawler/#{request.remote_ip}")??if?!crawler_counterRails.cache.write("crawler/#{request.remote_ip}",?1,?:expires_in?=>?10.minutes)??elsif?crawler_counter?>?50BlackList.add(ip_sec)????render?:file?=>?"#{RAILS_ROOT}/public/403.html",?:status?=>?403?and?return?falseendrender?:template?=>?'test',?:status?=>?401?and?return?falseend

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

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

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

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

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

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

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

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

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


轉載于:https://blog.51cto.com/throb/1716304

總結

以上是生活随笔為你收集整理的反爬虫技术整理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美视频导航 | 亚洲精品无码一区二区 | 99福利视频导航 | 日本特黄| 极品女神无套呻吟啪啪 | 精品国产97 | 人人干天天干 | 男人扒女人添高潮视频 | 精品人妻无码一区二区 | 欧美图片一区二区三区 | 久久另类ts人妖一区二区 | 亚洲一页 | 欧美精产国品一二三区 | 97香蕉| 亚洲激情在线 | 欧美三区在线 | 久久在线观看 | jizz免费观看| 国产日视频 | 久久久久网站 | 性激情视频| 影音先锋久久久久av综合网成人 | 精品国产亚洲av麻豆 | 不卡视频一区 | 久久bb | 电影桑叶2在线播放完整版 222aaa | 亚洲一区 中文字幕 | 激情啪啪网站 | 午夜私人福利 | 日韩少妇高潮抽搐 | 丰满岳乱妇一区二区 | 亚洲成人一区二区三区 | 伊人焦久影院 | 影音先锋黄色资源 | aaa人片在线 | 玩偶姐姐在线看 | 久久精品丝袜 | 波多野结衣久久精品 | 波多野结衣中文字幕一区 | 性xxxx狂欢老少配o | 污污视频在线看 | 一级爱爱片 | 欧美视频你懂的 | 久久午夜一区 | a午夜| 伊伊总综合网 | 日韩毛片中文字幕 | 欧美日韩精品一区二区三区四区 | www超碰在线 | 亚洲人成免费电影 | 免费一区二区三区 | 国产欧美日韩综合精品一区二区三区 | 久久久久久久香蕉 | 黄色国产免费 | 日韩综合 | 久草精品在线观看视频 | xxxx999| 欧美aaaa视频 | 成人性免费视频 | 99re伊人| 人妻一区二区三区四区五区 | 青青草香蕉 | 国产亚洲精品码 | 红色假期黑色婚礼2 | 久久7777 | 中文字幕女优 | 99嫩草| 成人a在线 | 亚洲黄片一区 | 国产深喉视频一区二区 | 欧美日韩亚洲另类 | 已满十八岁免费观看全集动漫 | 国产精品久久久久久久久免费软件 | 一本色道久久88亚洲精品综合 | 欧美成人三级精品 | 7mav视频| 99久久网站| 国产精品又黄又爽又色无遮挡 | 午夜理伦三级做爰电影 | 日本成人午夜视频 | 在线色亚洲 | 国产精品又黄又爽又色无遮挡 | 久久久资源网 | 日日爽日日操 | 8x8ⅹ国产精品一区二区二区 | 亚洲中文一区二区三区 | 国产农村妇女精品一区二区 | 日韩美女一级片 | 国产精品一二三四 | 欧美三级网 | 日韩特级黄色片 | 高潮爽爆喷水h | 青青操av在线 | 日韩永久 | 久久婷五月天 | 黑人巨大精品欧美一区二区免费 | 国产精品久久久久久久久夜色 | 色屁屁网站 | 99久久精品一区二区三区 |