Nginx反爬蟲: 禁止某些User Agent抓取網站


一、概述

網站反爬蟲的原因

  • 不遵守規范的爬蟲會影響網站的正常使用
  • 網站上的數據是公司的重要資產
  • 爬蟲對網站的爬取會造成網站統計數據的污染

 

常見反爬蟲手段

1. 根據 IP 訪問頻率封禁 IP

2. 設置賬號登陸時長,賬號訪問過多封禁
設置賬號的登錄限制,只有登錄才能展現內容
設置賬號登錄的時長,時間一到則自動退出

3. 彈出數字驗證碼和圖片確認驗證碼
爬蟲訪問次數過多,彈出驗證碼要求輸入

4. 對 API 接口的限制
每天限制一個登錄賬戶后端 api 接口的調用次數
對后台 api 返回信息進行加密處理

 

二、nginx反爬設置

站點配置文件

因為user-agent帶有Bytespider爬蟲標記,這可以通過Nginx規則來限定流氓爬蟲的訪問,直接返回403錯誤。
修改對應站點配置文件(注意是在server里面)

添加紅色部分

server {
  listen 80 default_server;
  listen [::]:80 default_server;

  index index.html index.htm index.nginx-debian.html;

  server_name _;

  location / {
    try_files $uri $uri/ =404;
  }
 #forbidden Scrapy if ($http_user_agent ~* (Scrapy|Curl|HttpClient)) {
    return 403;
  }

  #forbidden UA
  if ($http_user_agent ~ "Bytespider|FeedDemon|JikeSpider|Indy Library|Alexa Toolbar|AskTbFXTV|AhrefsBot|CrawlDaddy|CoolpadWebkit|Java|Feedly|UniversalFeedParser|ApacheBench|Microsoft URL Control|Swiftbot|ZmEu|oBot|jaunty|Python-urllib|python-requests|lightDeckReports Bot|YYSpider|DigExt|YisouSpider|HttpClient|MJ12bot|heritrix|EasouSpider|Ezooms|^$" ) {

    return 403;
  }
  #forbidden not GET|HEAD|POST method access
  if ($request_method !~ ^(GET|HEAD|POST)$) {
    return 403; }
}

 

附錄:UA收集

FeedDemon             內容采集
BOT/0.1 (BOT for JCE) sql注入
CrawlDaddy            sql注入
Java                  內容采集
Jullo                 內容采集
Feedly                內容采集
UniversalFeedParser   內容采集
ApacheBench           cc攻擊器
Swiftbot              無用爬蟲
YandexBot             無用爬蟲
AhrefsBot             無用爬蟲
YisouSpider           無用爬蟲(已被UC神馬搜索收購,此蜘蛛可以放開!)
jikeSpider            無用爬蟲
MJ12bot               無用爬蟲
ZmEu phpmyadmin       漏洞掃描
WinHttp               采集cc攻擊
EasouSpider           無用爬蟲
HttpClient            tcp攻擊
Microsoft URL Control 掃描
YYSpider              無用爬蟲
jaunty                wordpress爆破掃描器
oBot                  無用爬蟲
Python-urllib         內容采集
Python-requests       內容采集
Indy Library          掃描
FlightDeckReports Bot 無用爬蟲
Linguee Bot           無用爬蟲
使用python驗證
View Code

 

python驗證

使用requests模塊

import requests
# 最基本的不帶參數的get請求
r = requests.get('http://192.168.28.229')
print(r.content)

 

使用urllib模塊

import urllib.request
response = urllib.request.urlopen('http://192.168.28.229/')
print(response.read().decode('utf-8'))

 

返回403就表示起作用了。

b'<html>\r\n<head><title>403 Forbidden</title></head>\r\n<body>\r\n<center><h1>403 Forbidden</h1></center>\r\n<hr><center>nginx</center>\r\n</body>\r\n</html>\r\n'

 

三、整站防護設置

示意圖

 

 

 

第一層

robots.txt

robots是網站跟爬蟲間的協議,用簡單直接的txt格式文本方式告訴對應的爬蟲被允許的權限,也就是說robots.txt是搜索引擎中訪問網站的時候要查看的第一個文件。

注意:它只是做了協議規定,是否允許將爬取的數據收錄,不影響網頁訪問。

備注:對於手動寫爬蟲技術人員而言,一般都是直接忽略掉的。

 

如果不允許所有的爬蟲蜘蛛訪問,內容如下:

User-agent: *
Disallow: /

 

第二層

useragent特征攔截

因為user-agent帶有Bytespider爬蟲標記,這可以通過Nginx規則來限定流氓爬蟲的訪問,直接返回403錯誤。

具體操作,請查看上面的nginx配置。

備注:這樣可以防止一部分爬蟲訪問,以及初級爬蟲人員。

 

第三層

JS發送鼠標點擊事件

有些網站,你從瀏覽器可以打開正常的頁面,而在requests里面卻被要求輸入驗證碼或者是重定向到其他的頁面。
原理:當點擊登錄時,觸發js加密代碼,復雜的加密算法參數+時間戳+sig值,后台進行 參數+時間的限制。驗證成功后,才可以登錄。

 

備注:爬蟲高手需要模擬瀏覽器行為,加載js代碼以及圖片識別,才能正常登陸。

 

第四層

后台接口限制

1. 根據 IP 訪問頻率封禁 IP(注意:頻率要控制好,否則容易誤傷。)
2. 設置賬號登陸時長,賬號訪問過多封禁。
    設置賬號的登錄限制,只有登錄才能展現內容 設置賬號登錄的時長,時間一到則自動退出
3.彈出數字驗證碼和圖片確認驗證碼
    爬蟲訪問次數過多,前端彈出驗證碼要求輸入
4.對 API 接口的限制
    每天的登錄賬戶,請求后端 api 接口時,做調用次數限制。對后台 api 返回信息進行加密處理

 

通過這4層設置,就可以有效的保護數據的安全了。

 

本文參考鏈接:

https://www.cnblogs.com/itsharehome/p/11114588.html
https://www.cnblogs.com/tulintao/p/11616640.html
https://www.cnblogs.com/JinZL/p/11738245.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM