今天早上查看服务器,发现昨天发布的一个在线解析充电桩协议的网页工具有大量的访问记录,应该是爬虫在爬api接口数据。该工具api接口后台用的是python写的,和大多数项目一样也采用nginx反向代理,由于采用nginx,可以利用nginx配置限制小部分小爬虫。
一 Nginx 防爬虫配置手段
通过在 Nginx 中配置防爬虫通常需要结合 IP 限制、UA(User-Agent)过滤、访问频率限制等手段配置防爬虫。
nginx 防爬配置
1 nginx主配置如下图:
2 nginx 指定域名配置如下图:
图中配置说明:
nginx主配置是 在http部分是针对全局的,如果不配置子配置域名的server则会对所有站点会生效,在nginx 指定域名的server配置则只会对该域名生效。
测试效果如下:
1 频率限制:连续快速点击,超过频率时报429错误如下图:
2 基于 Referer 的过滤效果图:
以下针对上面所采用了三种防爬策略详细说明:
1 基于 User-Agent 的过滤
有些爬虫会使用特定的 User-Agent,可以通过配置拒绝这些 User-Agent。
server {
listen 80;
server_name example.com;
location / {
if ($http_user_agent ~* (curl|wget|python|scrapy)) {
return 403; # 禁止常见爬虫工具
}
# 允许正常访问
}
}
2 基于 Referer 的过滤
防止爬虫通过非当前站点域名发出的访问请求。
server {
listen 80;
server_name example.com;
location / {
#只允许来自指定域名的请求
valid_referers none blocked example.com;
if ($invalid_referer) {
return 403;
}
}
}
3 限制ip访问频率
由于爬虫访问与人工访问频繁完全不相同,可通过 limit_req
模块限制每个 IP 的访问频率。
http {
limit_req_zone $binary_remote_addr zone=one:10m rate=5r/s; # 每秒限制 5 次请求
server {
listen 80;
server_name example.com;
location / {
limit_req zone=one burst=10; # 突发允许 10 次请求
try_files $uri $uri/ =404;
}
}
}
小结
nginx功能非常强大,仅通过简单的配置可以防止一部分小爬虫,这一点非常方便,但需要注意的是只是防住小部分,要想进一步做防爬,一般还要在接口层拦截器配合前端调整。