2012年3月5日 星期一

如何抵擋網路蜘蛛(How To Block Web Spider or Crawler)

自從網路突然成了大家每天必需的基礎工具之後,無論是雲端SEO網路行銷或各種能夠讓你在網路上被人知道的動作,似乎都能了一門潛學問,大家都有些門道、方法,或是小撇步能夠達到自己想要達到的效果,不過,若是對於網站的經營面來說,有很多看似應該欣喜的東西,最後很有可能會成為另外一種沉重的壓力,例:網站流量看似有明顯的成長,實際上卻消耗在許多非預期的動作上。

這時候別忘記在台灣弄一個網站,除了需要花在網站上的設計、程式和必要人力之外,最昂貴的代價就是花在網站經營的頻寬及系統資源(我手上也有不少個網站就是...昏),大家可以回頭想想,如果Youtube沒有被Google接下的話,有辦法發展成現在的模樣嗎?雖然拿Youtube當例子有點不妥,畢竟它是自身內容,產生出相當可觀的流量。

但是,對於其它類型的網站來說,卻很有可能,被那些提供搜尋結果的網站給打趴,因為這些網站大多都會放出自己的自動化搜尋程式(俗稱:網路蜘蛛機器人爬蟲),雖然自己的網站能夠被愈多人知道愈好,但是,如果在還沒長大之前,就先因為這些潛在的宣傳者(機器人、蜘蛛)打趴的話,或許你連長大的機會都沒有,既然在網路世界有這個工具存在,其實它也有它的運行規則,不過,並非每一個參加者都會遵守(尤其是對岸的搜尋引擎),如此一來,或許我們也只能見招拆招,不然就可能是跟自己白花花的銀子過不去了。

針對網路機器人、爬蟲這一類的程式,對於網站本身來說,應該可以分為消極和積極的兩種處理方式,我也就簡單的描述一下方法吧!或許多於很多前輩來說,那已經是相當熟稔的技能,對我自己來說也算是一些記錄。

消極方式:

1.透過Robots.txt來抵擋:

基本上這個應該最常用來給Google看吧?因為這個的設定,基本上對GoogleBot來說,它就會乖乖的依據這個來爬你的網站,Google也有針對這個有說明 ,簡單地說就是,告訴搜尋蜘蛛什麼路徑、檔案不要進來爬,當然你也可以直接設定直接跳過我,例:
User-Agent: Googlebot
Disallow: /
雖然這種方式一樣有它的風險,因為針對資安來說,有些人會很仔細地把自己網站那邊有機敏資料的資料夾都列上去,這時候就會有種:此地無銀三百兩的感覺,但是為了避免因為某些蜘蛛,可能把你系統資源或是頻寬吃完,這個檔案還是不得不設呀!只是要怎麼設就見仁見智了,如果你只是要抵擋某些可能對你網站來說,不是主要族群的搜尋引擎的話(例:百度、搜狗),或許就直接下個:
User-Agent: Buiduspider
Disallow: /

User-Agent: Sogou web spider
Disallow: /
至於全部開放的方式應該就不用特別說了(直接不要設就好了吧?),當你設置好了之後,如果你會害怕自己設錯,就可以透過檢查網站(例:Robots.txt Checker)來測試一下,或是仔細閱讀一下這一篇的說明,應該也不會太難才對。

2.透過頁面宣告來抵擋:

雖然可以透過Robots.txt來設置規則,但是這有個先決條件,那就是你要有辦法編寫那個檔案,在根目錄(/)之下,像我這個Blog就沒有辦法自己編寫那個檔案,位置應該是:http://indeepnight.blogspot.com/robots.txt ,基本上只要是免費的BSP應該都不允許你能夠直接到根目錄底下加油添醋才是,這時候你可能就只能夠在頁面上加上中繼資料(說明)來處理這個問題,例:
<meta name="Sogou web spider" content="nofollow">
<meta name="Sogou web spider" content="noarchive">
照理說,你只要加上這些標籤,這些Web Robot或Crawler就應該直接會跳過這個頁面上產生的內容,但是實際的狀況,還是得依實際運作之後才會得知。

不過,我也說過這些都是消極的方式,所以並非所有的搜尋引擎的蜘蛛都會乖乖地聽從你所設置的Robots.txt或是 tag(例:百度似乎就不太理),所以這兩種方式,真的是防君子,若是這些搜尋引擎的蜘蛛真的要爬,還是擋不住的,當然也有可能會有蜘蛛沒有看見你所寫的設定,所以有的搜尋引擎會提供移除的申請,例:Google(將特定網頁或網站從 Google 的搜尋結果中移除

積極方式:

1.透過權限控制:

既然消極的方式對於那些強力蜘蛛派不上用場,那也只要使出強烈一點的手段來處理,那就是可以透過你的網頁伺服器,利用權限控制的設定來阻擋這些機器人或蜘蛛的入侵,當然,這也是會消耗系統資源的,不過在取捨之下,這還是必要的動作,以Apache Server來說,你可以直接在.htaccess裡設定,當遇到某些關鍵字的User-Agent就將它導去特定的錯誤頁面,例:

適用於:Apache的.htaccess

SetEnvIfNoCase User-Agent ^Baiduspider bad_bot
SetEnvIfNoCase User-Agent ^Sogou bad_bot

<Files *>
Order Allow,Deny
Allow from all
Deny from env=bad_bot
</Files>
簡單說明一下:
SetEnvIfNoCase User-Agent:偵測使用端所用的User-Agent
^Baiduspider:以Baiduspider開頭的User-Agent
bad_bot:設置至某個群組名
<Files *>...</Files>:所有檔案
Order Allow,Deny:規則順序是先允許後抵擋
Allow from all:允許所有
Deny from env=bad_bot:阻檔設置為bad_bot群組的內容
如果是另一個現在很熱門的Nginx呢?其實也很簡單,只要在只要在nginx.conf裡找到location / { 的位置,接著加上下列判斷即可:
適用於:Nginx的nginx.conf

if ($http_user_agent ~* Baidu|Sogou) {
return 403;
}
基本上,加上這些設定,就可以主動阻擋大部分的蜘蛛,不過這裡其實一樣有些讓人難以處理的部分,可能就要用更暴力的方式,雖然不一定可以全部擋住,但是也應該我們能做的最後一道關那了!畢敬公開在網路上,別人要怎麼爬,我們也真的是無能為力。

2.直接封鎖網段:

最後一招就是,直接把那些蜘蛛的來源IP擋於門外,因為有些搜尋引擎的蜘蛛不只一隻,甚至還有各種不同的化名,例:搜狗就有好幾個不一樣的化名,例:
Sogou web spider
New-Sogou-Spider
Sogou Mobile Spider
有看出什麼端倪嗎?對!就是那個New-Sogou-Spider,如果你是設定SetEnvIfNoCase User-Agent ^Sogou bad_bot,它不是Sogou開頭的,所以就會很自然地逃過你的過濾,其實類似的問題是防不完的,更何況上面那三個User-Agent是我實際在log裡濾出來的,代表他們也真實存在(透過ip反查也的確是屬於Sogou),這時候可能就只好使出最後一招,那就是把對方的IP封鎖,直接拒絕相關IP的來存取網站,至於使用的方式有很多,無論是在httpd.conf.htaccessiptables或甚至直接在防火牆設備上擋掉都可以,例:
httpd.conf:
<Directory "/var/www/html">
Options FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
Deny from 220.181.94.234
Deny from .crawl.baidu.com
</Directory>
.htaccess:(可透過http://tools.dynamicdrive.com/userban/ 協助設置
## USER IP BANNING
<Limit GET POST>
order allow,deny
allow from all
deny from 220.181.94.234
</Limit>

## SITE REFERRER BANNING
RewriteEngine on
# Options +FollowSymlinks

RewriteCond %{HTTP_REFERER} \.crawl\.baidu\.com [NC]
RewriteRule .* - [F]
iptables:
iptables -A INPUT -s 220.181.94.0/24 -p tcp --dport 80 -j DROP
雖然這樣子封鎖IP已經是不得已的方式,但是很多搜尋引擎的蜘蛛會透過多個IP(網段)來爬,如果真的想要捨棄某些國家的流量來源,或許可以參考 http://www.countryipblocks.net/,直接把該國的IP全部封鎖,不過,在封鎖之前,最好自己也檢查一下,以免發生把自己關在門外的可能性。

我想,針對網路蜘蛛的處理方式,應該不外乎是上述幾種方式,對於網站的推廣來說,其實這些網路蜘蛛應該是利大於弊才對,但是,如果某些特定的Spider佔了你總流量30~40%,對於自行租用主機(無論海內、外)應該都是相當嚇人的一件事(尤其是燒錢的速度),這時候你可能就得自己時常去分析一下log檔(有空再來討論),才能夠得知是否有類似的情事發生。

甚至,過於頻繁的Spider甚至可能會拖跨你整個系統效能及伺服器的回應時間,雖然這些的確是可以用錢解決的問題(加機器、增加頻寬),但是對於中、小型網站來說,錢還是得花在刀口上,這些東西不得不慎,或許,這也是我跟朋友合作的 比價網站(比價小資女) 在這次搬家時學到的教訓之一,總是希望能夠把效能跟頻寬,留給真正需要的使用者身上,最後,只希望這篇能夠幫助到跟我有類似需求的人。

2 則留言:

  1. 就好幾年前的經驗,百度、搜狗完全不理,所以在 .htaccess 裡頭只要有這類 user-agent 就 band 掉,另外也常用 IP range 方式擋掉。
    iptable 沒試過,虛擬主機好像不能這樣玩… :P

    回覆刪除
  2. To Kirin:
    現在有的設User-Agent,有的都還會給你"繞"過去,所以也很難處理就是,至於IP RANGE的方式也是可以,這一點也是可以考慮。

    至於IPTABLES的部分,基本上如您所說VPS是不太能夠這麼用,除非你是直接把整台機器放在他們機房那一種才有可能,或是自己架站的。

    謎之音:好幾年前的經驗呀!所以我還太嫩嘛!

    回覆刪除