反采集一直都是我們需要進行的工作,特殊是國内互聯網行業抄襲風氣太盛,其實我們不介意這些采集者把我們原創内容采過去,反正采集者也影響不了我們自己多少,但老是導緻我們服務器資源過載就很煩了。
以前一般用“Apache中設置屏蔽IP地址和URL網址來禁止采集”,高級一些的用法記錄在“識别User Agent屏蔽一些Web爬蟲防采集”,中途還專門“自己編寫網站防采集程序”,但用起來也有些不完善。
這兩個月提交百度熊掌号、MIP/AMP後,正常的爬蟲多起來,流量也多一些,跟着來的采集爬蟲也多起來,導緻服務器總是資源不足,帶寬堵塞、服務器卡死、服務重啟等等。
除了硬件上增加帶寬、增加服務器以外,還得人工看着不斷屏蔽,現在的采集者也變得“聰明”一些了,變着ip/user-agent/referer來,與我們鬥智鬥勇。
前一陣子找了好些資料,apache的幾個模塊有些作用,例如:mod_bw、mod_limitipconn、mod_evasive20、mod_qos等,比較了一下,mod_qos最接近我們需要,隻是功能太強了一些,我們用不了那麼多,配置起來有些複雜。
官方介紹:
我們添加的qos.conf代碼:
# don't allow a client IP to access a "handler" (not a static resource like # a jpg, gif, ..) more than 20 times within two minutes: QS_ClientEventLimitCount 20 120 SlowRequest SetEnvIfPlus Request_URI / SlowRequest=1 SetEnvIfPlus Request_URI /generateReport.php SlowRequest=2 SetEnvIfPlus Request_URI .*\.(jpg)|(jpeg)|(gif)|(png)|(js)|(css)$ !SlowRequest SetEnvIfPlus Remote_Addr ^(47\.88\..*\..*|115\.28\..*\..*)$ !SlowRequest # disable any event counting if the server has less than 499 connections: QS_SetEnvIf QS_AllConn=^[1234]?[0-9]{1,2}$ !SlowRequest # Clients violating these rules may times can be blocked for an even longer period of time. This is implemented by a second counter, called SlowRepeatedlySlow in this example. # Alternatively, the QS_Block variable could be set to incremented the QS_ClientEventBlockCount counter in the case of a repeated rule violation (to block clients at a connection level extending the list of events defined above). # deny a client IP for 10 minutes if he violates the rule above 3 times: QS_ClientEventLimitCount 3 600 SlowRepeatedlySlow QS_SetEnvIf SlowRequest_Counter=20 SlowRepeatedlySlow=1 QS_ErrorResponseCode 403
剛開始這樣設置後,重啟apache報錯,沒有SetEnvIfPlus模塊,找到mod_setenvifplus官方網站,又去下載mod_setenvifplus,解壓後apxs -i -a -c mod_setenvifplus.c編譯,再修改httpd.conf添加上mod_setenvifplus。
還有一點 QS_ClientEventLimitCount directives can't be added/removed by graceful restart. A server restart is required to apply the new configuration!,需要重啟機器。
這樣設置、重啟後,可以從error.log中看到屏蔽的事情。
後續需要解決的事情:
添加白名單,放行我們自己的服務器以及搜索引擎IP;(已經解決,加一行:SetEnvIfPlus Remote_Addr ...)- 添加hostname白名單,放行DNS反向查詢是google、百度等搜索引擎爬蟲;
返回錯誤碼現在是500(内部錯誤),應該改為403(拒絕);(已經解決,加一行:QS_ErrorResponseCode 403)
2018年12月14日補充:《常見搜索引擎爬蟲IP地址段》,添加了Google、百度、MSN等幾個搜索引擎蜘蛛的IP地址段:|66\.249\..*|203\.208\.60\..*|216\.239\..*|66\.102\..*|64\.233\..*|72\.14\..*|123\.125\..*|220\.181\.108\..*|220\.181\.124\..*|220\.181\.125\..*|111\.206\..*|207\.46\.13\..*|157\.55\.39\..*|40\.77\.167\..*
评论1
<p> 下面是一個簡單的php程序
下面是一個簡單的php程序,用于驗證qos是否生效:
運行很多次循環,每次訪問指定網址的中間不加延時,可以看到當運行到超過qos限制的時候,打印出來503被拒絕的信息,證實qos的設置生效了,如果調整qos中指定的限制次數(然後重啟apache),這裡打印錯誤信息的次數也跟着變了,如果把IP加入qos的白名單(然後重啟apache),這個程序的循環中就不會打印報錯信息。