? 上一篇下一篇 ?

網絡爬蟲對服務器的危害,nginx服務器屏蔽網絡爬蟲程序采集器的辦法

   網絡上有非常多的令人厭惡的幽靈程序爬蟲,沒日沒夜地采集別人的網站,將別人勞動成果據為己有。想到要對于這些不受待見的爬蟲,相信很多站長氣得牙癢癢的,但又無計可施。

網絡爬蟲的壞處:

采集器頻繁地抓取影響了網站的正常運行了,尤其是對于低配服務器,那點可憐的虛擬空間的流量可能沒多久就被搞完了。那種經常打不開或者打開很慢的網站,除了服務器配置本身差勁外,很多時候要歸功于網絡采集器。

  每個網站通常都會遇到很多非搜索引擎的爬蟲,這些爬蟲大部分都是用于內容采集或是初學者所寫,它們和搜索引擎的爬蟲不一樣,沒有頻率控制,往往會消耗大量服務器資源,導致帶寬白白浪費了。下面介紹下怎么通過nginx來屏蔽網絡爬蟲的方法。

   經常看到網上有seo或站長朋友提到用robots.txt文件的 User-Agent配合Disallow指令來實現屏蔽。指點別人在網站根目錄創建robots.txt文件了,寫了一堆的指令,去禁止那些不受歡迎的爬蟲。滿心歡喜地以為就做到屏蔽效果了,達到目的了。其實不然,首先要明白一點,robots.txt只是網絡機器人(或者蜘蛛)的一種抓取的條約,注意,僅僅是條約,定義了哪些能抓? 哪些內容不能抓? 歡迎哪些爬蟲抓取?不歡迎哪些爬蟲抓取? 

 

  這樣的條約,其實是沒有約束力的,爬蟲是否遵守這些條約是另一回事,對于爬蟲中的正人君子(正規搜索引擎)確實有效,它們來到網站后,通常會查看一下robots.txt文件,老實地按照站長的規則來抓取網頁,然而,對那些采集爬蟲有效嗎?很確定地說:無效,它們完全無視robots.txt,它們只要網站的內容,更有甚者,看到那些明令指定不能抓取的網頁更是加大力度來采集,既然不準抓取,說不定有什么好東西呢?

 

所以說,robots.txt不是萬能鑰匙,能防君子,不能防小人。但也不是沒有辦法,作為web服務器的龍頭:Apache和nginx其實都有屏蔽策略,關鍵是要會用。下面說一種我之前的單位使用的一種禁止策略,該策略能屏蔽一部分程序的采集。現將代碼放在下面,操作方法:找到 nginx.conf配置文件,將下面的代碼放到server里。

 

1
2
3
4
#禁止爬蟲工具和不相關搜索引擎的抓取
if ($http_user_agent ~* (Scrapy|Curl|HttpClient|python|phantomjs|EtaoSpider|HuihuiSpider|WochachaSpider|GwdangSpider|YYSpider|MJ12bot|^$)) {
    return 403;
}

 

最終成這樣:

1
2
3
4
5
6
7
8
9
10
server
    {
    #禁止爬蟲工具和不相關搜索引擎的抓取
    if ($http_user_agent ~* (Scrapy|Curl|HttpClient|python|phantomjs|EtaoSpider|HuihuiSpider|WochachaSpider|GwdangSpider|YYSpider|MJ12bot|^$)) {
    return 403;
    
    }
  # 下面是其他的配置項
   
 }

 

保存配置文件,使用命令行:   

1
systemctl restart nginx

重啟nginx服務生效。

 

其他方法:

1.基于程序本身去防止爬取:作為爬蟲程序,爬取行為是對頁面的源文件爬取,如爬取靜態頁面的html代碼,可以用jquery去模仿寫html,這種方法偽裝的頁面就很難被爬取了,不過這種方法對程序員的要求很高。


2.基于iptables和shell腳本:可以對nginx的access.log進行策略定義,例如定義在1分鐘內并發連接數超過30個ip為非法,如ip不在白名單內,則加入iptables策略封掉,當然這種的缺點是會有“誤傷”,策略細粒度越小就會有更多的“誤傷”,細粒度大就會使效果變差,另外還有類似的第三方工具fail2ban,利用做filter和actor對一些有危害的操作記錄或是封ip。但是對于某個特定的爬蟲地址(例如網易、有道)的爬取行為拒絕也很難準確做到,因為你無法準確知道這些特定的爬蟲ip地址(例如網易、有道),以下是我的定位方式,不過發現由于ip庫不準確造成錯誤的屏蔽。注意:建議不要用封ip條目的方式,iptables列表長度是65535時就會封滿,服務器也就會死機。

 

本文拋磚引玉,僅可以對付一般的網絡采集程序,我們跟網絡爬蟲的斗爭才剛剛開始,更多請關注數據吧資訊