今天想對一個問題進行分析和討論,就是關於爬蟲對網站頁面爬取的問題,有些網站通過爬蟲去採集其它的網站頁面資訊作為己用,大量的爬取行為會對web伺服器有比較效能有影響,主要的表現就是會變得很慢。
對於如何防止網站被爬取,我想從以下幾種方法去分析:
1.基於程式本身去防止爬取:作為爬蟲程式,爬取行為是對頁面的源檔案爬取,如爬取靜態頁面的html代碼,可以用jquery去模仿寫html,這種方法偽裝的頁面就很難被爬取了,不過這種方法對程式員的要求很高。
2.基於iptables和shell指令碼:可以對nginx的access.log進行策略定義,例如定義在1分鐘內並發串連數超過30個ip為非法,如ip不在白名單內,則加入iptables策略封掉,當然這種的缺點是會有“誤傷”,策略細粒度越小就會有更多的“誤傷”,細粒度大就會使效果變差,另外還有類似的第三方工具fail2ban,利用做filter和actor對一些有危害的操作記錄或是封ip。但是對於某個特定的爬蟲地址例如網易、有道)的爬取行為拒絕也很難準確做到,因為你無法準確知道這些特定的爬蟲ip地址例如網易、有道),以下是我的定位方式,不過發現由於ip庫不準確造成錯誤的屏蔽。注意:建議不要用封ip條目的方式,iptables列表長度是65535時就會封滿,伺服器也就會死機。
650) this.width=650;" title="zhi.jpg" alt="111812892.jpg" src="http://www.bkjia.com/uploads/allimg/131227/1620594N1-0.jpg" />
指令碼如下:
#! /bin/bashLOGFILE=/var/log/nginx/access.logPREFIX=/etc/spiders#日誌中大部分蜘蛛都有spider的關鍵字,但是百度的不能封,所以過濾掉百度grep 'spider' $LOGFILE |grep -v 'Baidu' |awk '{print $1}' >$PREFIX/ip1.txt# 封掉網易的有道grep 'YoudaoBot' $LOGFILE | awk '{print $1}' >>$PREFIX/ip1.txt#封掉雅虎grep 'Yahoo!' $LOGFILE | awk '{print $1}' >>$PREFIX/ip1.txt# 過濾掉信任IPsort -n $PREFIX/ip1.txt |uniq |sort |grep -v '192.168.0.' |grep -v '127.0.0.1'>$PREFIX/ip2.txt# 如果一小時內,發包不超過30個就要解鎖/sbin/iptables -nvL |awk '$1 <= 30 {print $8}' >$PREFIX/ip3.txtfor ip in `cat $PREFIX/ip3.txt`; do /sbin/iptables -D INPUT -s $ip -j DROP ; done/sbin/iptables -Z // 將iptables計數器置為0for ip in `cat $PREFIX/ip2.txt`; do /sbin/iptables -I INPUT -s $ip -j DROP ; done
3.使用robots.txt檔案:例如阻止所有的爬蟲爬取,但是這種效果不是很明顯。
User-agent: *Disallow: /
4.使用nginx的內建功能:通過對httpuseragent阻塞來實現,包括GET/POST方式的請求,以nginx為例,具體步驟如下:
編輯nginx.conf
#vim /usr/local/nginx/conf/nginx.conf
拒絕以wget方式的httpuseragent,增加如下內容
## Block http user agent - wget ##if ($http_user_agent ~* (Wget) ) {return 403;}## Block Software download user agents ##if ($http_user_agent ~* LWP::Simple|BBBike|wget) {return 403;}
平滑啟動
# /usr/local/nginx/sbin/nginx -s reload
如何拒絕多種httpuseragent,內容如下:
if ($http_user_agent ~ (agent1|agent2|Foo|Wget|Catall Spider|AcoiRobot) ) {return 403;}
大小寫敏感匹配
### 大小寫敏感http user agent拒絕###if ($http_user_agent ~ (Catall Spider|AcoiRobot) ) {return 403;}### 大小寫不敏感http user agent拒絕###if ($http_user_agent ~* (foo|bar) ) {return 403;}
注意文法:~*表示是大小寫不敏感,~表示是大小寫敏感
本文出自 “老徐的私房菜” 部落格,謝絕轉載!