nginx过滤爬虫访问

思路来自ai:

Nginx可以通过多种方式来限制爬虫的行为:
1. **User-Agent限制**:
   可以通过检查HTTP请求的User-Agent头部来识别并限制某些爬虫。例如,可以在Nginx配置文件中使用`if`语句来检查User-Agent,并使用`return`指令拒绝特定的User-Agent。
   ```nginx
   if ($http_user_agent ~* (BadCrawler|AnotherBadCrawler)) {
       return 403;
   }
   ```
2. **访问频率限制**:
   使用Nginx的`limit_req`模块可以限制来自单个IP地址的请求频率,这可以有效地防止爬虫快速抓取网站内容。
   ```nginx
   limit_req_zone $binary_remote_addr zone=mylimit:10m rate=1r/s;
   server {
       location / {
           limit_req zone=mylimit burst=5;
       }
   }
   ```
3. **IP地址封禁**:
   如果发现某个IP地址是爬虫,可以使用`deny`指令直接封禁该IP。
   ```nginx
   location / {
       deny 192.168.1.1;
       allow all;
   }
   ```
4. **URL重写**:
   可以通过重写规则将爬虫导向一个特定的页面或者返回错误代码。
   ```nginx
   if ($http_user_agent ~* BadCrawler) {
       rewrite ^ /crawler-detected.html last;
   }
   ```
5. **使用Nginx第三方模块**:
   例如,`ngx_http_robot_middleware`模块可以帮助识别并阻止已知的爬虫。
6. **HTTP基本认证**:
   对于某些特定的区域,可以设置HTTP基本认证,只有输入正确的用户名和密码才能访问。
   ```nginx
   location /restricted/ {
       auth_basic "Restricted Area";
       auth_basic_user_file /etc/nginx/.htpasswd;
   }
   ```
7. **设置Cookie验证**:
   只有带有特定Cookie的请求才被允许访问,这可以防止简单的爬虫。
需要注意的是,这些方法并不是百分之百有效的,因为一些高级的爬虫可以通过更改User-Agent、使用代理等方式来绕过这些限制。因此,除了配置Nginx之外,可能还需要结合其他策略和技术手段来更有效地限制爬虫。同时,也要确保不要误伤合法的用户和搜索引擎爬虫,这可能会对网站的SEO产生不利影响。


实际使用User-Agent限制的方式进行过滤

nginx配置为:

        # 通过客户端软件的类型、版本、所用操作系统等过滤爬虫
        location /captcha/code {
            if ($http_user_agent ~* "Mozilla\/5\.0 \(Windows NT 10\.0; Win64; x64\) AppleWebKit\/537\.36 \(KHTML, like Gecko\) Chrome\/114\.0\.0\.0 Safari\/537\.36 Edg\/114\.0\.1823\.51") {
                return 403;
            }
            proxy_pass http://mylocal/captcha/code;
        }
        
        location /ww/b/a/wwba_sendMobileCode.html {
            if ($http_user_agent ~* "Mozilla\/5\.0 \(Windows NT 10\.0; Win64; x64\) AppleWebKit\/537\.36 \(KHTML, like Gecko\) Chrome\/114\.0\.0\.0 Safari\/537\.36 Edg\/114\.0\.1823\.51") {
                return 403;
            }
            proxy_pass http://mylocal/ww/b/a/wwba_sendMobileCode.html;
        }

用到的技术有:

1、nginx的if判断(语法与常见的if基本相同):

Nginx配置中的if判断_nginx if判断-CSDN博客

nginx配置之if,break,return,rewrite - junffzhou - 博客园 (cnblogs.com)

2、nginx正则表达式及转义字符:

在正则表达式中,除了括号之外,以下字符也需要转义,因为它们在正则表达式中具有特殊的意义:

- `.`:匹配除换行符以外的任意单个字符。要匹配字面上的点,需要使用 `\.`。
- `*`:匹配前面的子表达式零次或多次。要匹配字面上的星号,需要使用 `\*`。
- `+`:匹配前面的子表达式一次或多次。要匹配字面上的加号,需要使用 `\+`。
- `?`:标记前面的子表达式为非贪婪的,或者匹配前面的子表达式零次或一次。要匹配字面上的问号,需要使用 `\?`。
- `^`:匹配输入字符串的开始位置。要匹配字面上的脱字符,需要使用 `\^`。
- `$`:匹配输入字符串的结束位置。要匹配字面上的美元符号,需要使用 `\$`。
- `|`:指明两项之间的一个选择。要匹配字面上的竖线,需要使用 `\|`。
- `[` 和 `]`:用于定义字符集。要匹配字面上的左方括号或右方括号,需要分别使用 `\[` 和 `\]`。
- `{` 和 `}`:用于指定重复次数的范围。要匹配字面上的大括号,需要分别使用 `\{` 和 `\}`。
以下是一个转义所有特殊字符的示例:
```regex
\a\.b\*c\+d\e?f\^g\$h\|i\[j\]k\{l\}m\n
```
在这个正则表达式中:
- `\a` 匹配字面上的字母 "a"。
- `\.` 匹配字面上的点。
- `\*` 匹配字面上的星号。
- `\+` 匹配字面上的加号。
- `\?` 匹配字面上的问号。
- `\^` 匹配字面上的脱字符。
- `\$` 匹配字面上的美元符号。
- `\|` 匹配字面上的竖线。
- `\[` 和 `\]` 分别匹配字面上的左方括号和右方括号。
- `\{` 和 `\}` 分别匹配字面上的左大括号和右大括号。
- `\n` 匹配换行符(在这里是一个转义字符,但不是正则表达式的特殊字符)。


- `.`:匹配除换行符以外的任意单个字符。要匹配字面上的点,需要使用 `\.`。
- `*`:匹配前面的子表达式零次或多次。要匹配字面上的星号,需要使用 `\*`。
- `+`:匹配前面的子表达式一次或多次。要匹配字面上的加号,需要使用 `\+`。
- `?`:标记前面的子表达式为非贪婪的,或者匹配前面的子表达式零次或一次。要匹配字面上的问号,需要使用 `\?`。
- `^`:匹配输入字符串的开始位置。要匹配字面上的脱字符,需要使用 `\^`。
- `$`:匹配输入字符串的结束位置。要匹配字面上的美元符号,需要使用 `\$`。
- `|`:指明两项之间的一个选择。要匹配字面上的竖线,需要使用 `\|`。
- `[` 和 `]`:用于定义字符集。要匹配字面上的左方括号或右方括号,需要分别使用 ' \ [ ' 和 ' \ ] '。
- `{` 和 `}`:用于指定重复次数的范围。要匹配字面上的大括号,需要分别使用 `\{` 和 `\}`。
以下是一个转义所有特殊字符的示例:
```regex
\a\.b\*c\+d\e?f\^g\$h\|i\ [ j \]k\{l\}m\n
```
在这个正则表达式中:
- `\a` 匹配字面上的字母 "a"。
- `\.` 匹配字面上的点。
- `\*` 匹配字面上的星号。
- `\+` 匹配字面上的加号。
- `\?` 匹配字面上的问号。
- `\^` 匹配字面上的脱字符。
- `\$` 匹配字面上的美元符号。
- `\|` 匹配字面上的竖线。
- ' \ [ ' 和 ' \ ] ' 分别匹配字面上的左方括号和右方括号。
- `\{` 和 `\}` 分别匹配字面上的左大括号和右大括号。
- `\n` 匹配换行符(在这里是一个转义字符,但不是正则表达式的特殊字符)。
在 Nginx 配置文件中,当使用正则表达式时,通常不需要转义空格、字母和数字等非特殊字符。

3、使用proxy_pass设置跳转地址

不要使用rewrite:

rewrite ^/(.*)$ https://www.baidu.com/captcha/code permanent;

客户端会重复请求该地址

4、使用valid_referers设置防无referer的爬虫

        # 通过客户端软件的类型、版本、所用操作系统等过滤爬虫
        location /captcha/code {
            access_log logs/webaccess_sms.log main;
            valid_referers *.baidu.com; # 改成自己的服务器IP或域名
            if ($invalid_referer) {
                return 403;
            }
            if ($http_user_agent ~* "Mozilla\/5\.0 \(Windows NT 10\.0; Win64; x64\) AppleWebKit\/537\.36 \(KHTML, like Gecko\) Chrome\/114\.0\.0\.0 Safari\/537\.36 Edg\/114\.0\.1823\.51") {
                return 403;
            }
            proxy_pass http://mylocal/captcha/code;
        }
        
        location /ww/b/a/wwba_sendMobileCode.html {
            access_log logs/webaccess_sms.log main;
            valid_referers *.baidu.com;
            if ($invalid_referer) {
                return 403;
            }
            if ($http_user_agent ~* "Mozilla\/5\.0 \(Windows NT 10\.0; Win64; x64\) AppleWebKit\/537\.36 \(KHTML, like Gecko\) Chrome\/114\.0\.0\.0 Safari\/537\.36 Edg\/114\.0\.1823\.51") {
                return 403;
            }
            proxy_pass http://mylocal/ww/b/a/wwba_sendMobileCode.html;
        }

Nginx配置referers防盗链(示意图+代码举例)_nginx防盗链 referer-CSDN博客

Nginx配置referer校验,实现简单的防盗链 - 爱折腾的大臭臭 - 博客园 (cnblogs.com)

nginx配置跨域(CORS)、防盗链(valid_referers)、缓存(expires)、压缩(gzip) - sucre_tan - 博客园 (cnblogs.com)

https://www.cnblogs.com/moutory/p/17752682.html 

 

你可能感兴趣的:(nginx,爬虫,运维)