對于我們這種數據量很大的網站,面臨的一個麻煩是總有人來采集,以前多使用過人工檢查、屏蔽的辦法,這種辦法有效果但太費精力,前段時間也找了插件來自動限制最大連接數,但存在誤屏蔽搜索引擎的問題,最近老夫下決定親自操刀寫程序,把這些采集者都斬草除根,雖然編程麻煩但效果好。
思路是在Drupal的模闆文件中嵌入PHP程序代碼,讀取$_SERVER參數并記錄到數據庫中,通過對參數及訪問頻率的判斷來決定是否要訪問者提交驗證碼,如果驗證碼錯誤或者不填寫的次數過多則屏蔽,可以通過host反向dns查找來判别常見搜索引擎。
這個程序還稍微有點複雜,以前修改開源PHP程序都是直接上手,這個程序還編寫了流程圖,數據庫表結構也是自己規劃的,為了避免拉慢速度,MySQL中采用了Memory引擎,對于多是臨時訪問記錄已經夠用了。程序寫得很爛,就不放在博客中了。
這個程序anti-scraping.php上周調試了幾天,本周剛剛投入試用,已經可以從日志中看到效果,還需要不斷改進,例如增加黑名單、白名單、嘗試改用Drupal标準第三方模塊的方式等。因為完成采用自己編程實現,所以可以對判别标準、屏蔽方式做各種修改嘗試,應對各種采集者。
版本曆史:
- 2013-7-05 17:16 開始編寫本程序,作為一個單獨程序,數據表采用memory類型
- 2013-7-16 16:10 增加黑白名單、500次驗證碼以上标記為采集者、給驗證碼的同時延時5秒
- 2013-8-05 16:00 改函數、判别t函數是否存在、考慮proxy情況、bad表添加時間字段、bad超過10天的記錄删除
- 2013-11-14 17:19 獲取逗号前第一個IP,避免php函數報錯
- 2013-12-8 23:50 XX次/X分鐘改XXX次/XX分鐘,驗證碼回答對一次後累計清零,添加白名單IP,bad表添加3個字段,每日發郵件報告發現的采集IP
- 2013-12-26 15:00 定時運行報告anti-scraping-report.php,服務器名稱查詢,發送到專門的郵箱
- 2014-4-9 設立專門的反采集庫anti_scraping,在log/limit/bad三個表中都增加一個字段request_time1用于存放正常格式時間數據,添加新服務器到白名單,增加對數據庫連接失敗的判斷;anti-scraping-report.php修改數據庫名稱、增加連接不上數據庫的判斷處理、remote_host的value替換半角句号為全角句号避免郵件被當作垃圾郵件;新增anti-scraping-delay.php 反采集程序之延時版本,将驗證碼改為延時,用于file cache的情況,避免驗證碼内容被緩存到頁面文件中,可用于MediaWiki的FileCache和Drupal的Boost緩存
- 2014-8-8 對googlebot等搜索引擎爬蟲進行host反查可能臨時出錯,所以對于反查是IP的全部放行;添加360Spider和Sogou;更新國外服務器IP
To Do List:
- 更詳細的定期統計報告(三個表的記錄數、統計分析)
- 精确調整延時及優化程序來減少對已經知道的搜索引擎和正常訪問者的影響
- Bad中一個IP出現多次的問題
评论2
James, 這個程序還有更新嗎?最近也遇到這個問題
James, 這個程序還有更新嗎?最近也遇到這個問題,可以把這個程序放出來嗎?謝謝。Rex, 你好!這個程序我自己還在用,但基于各種考慮
Rex, 你好!這個程序我自己還在用,但基于各種考慮,還不适合放出來,抱歉。其實我自己的水平還算不上程序員,也是根據别人的提示瞎編寫的,上面寫了思路,隻要有一定水平,花些時間可以自己做出來更适合自己的。