Nginx防爬虫配置

互联网上,正常情况下的搜索引擎爬取网站,都会遵守robots协议,robots协议的作用是告诉爬虫本网站那些内容可以爬取,那些内容不能爬取。但是有一些恶意的爬虫,不遵守爬虫协议,恶意爬取网站。此时就需要去封禁这些恶意爬虫,下面将介绍如何封禁这些恶意爬虫。

1、爬虫对网站的影响

(1)会对网站造成很大压力,如果服务器性能不好,可能会导致正常用户无法访问。笔者就遇到过恶意爬虫爬取网站导致网站挂掉的情况;

(2)新发布的一些网络资源,如果在搜索引擎爬虫未收录的情况下,就被恶意爬虫爬走,可能会导致搜索引擎爬虫在爬取的时候过滤掉这些内容,对网站流量造成影响。

2、区分恶意爬虫和搜索引擎爬虫

区分搜索引擎爬虫和恶意爬虫主要可以通过user_agent字段,该字段表示用户代理。即:在访问网站的时候用的浏览器版本等信息,如果是搜索引擎爬虫,一般都有正规的名字。如果是恶意爬虫,user_agent可能是一些其他名字,下面列举一下常见的搜索引擎爬虫和恶意爬虫的名称:

(1)常见的搜索引擎爬虫名称

Baiduspider:百度蜘蛛
Googlebot:谷歌蜘蛛
Bingbot:bing蜘蛛
360Spider:360蜘蛛
Yisouspider:神马蜘蛛
Sogouspider:搜狗蜘蛛

如果要屏蔽这些蜘蛛,直接在网站根目录上创建robotx.txt文件,然后指定爬取范围,就可以。

(2)恶意爬虫

恶意爬虫通常没有user_agent或者user_agent包括以下内容中的一个或者多个,中间是|隔开的:

“Wget|WinHttp|Go-http-client|Zeep|Apache-HttpClient|Yakuza|masscan|WebZip|node-superagent|JikeSpider|CrawlDaddy|Apache-HttpAsyncClient|UniversalFeedParser|jaunty|Microsoft URL Control|heritrix|EasouSpider|FlightDeckReports|Swiftbot|ZmEu|DigExt|Indy Library|Alexa Toolbar|LinkpadBot|Ezooms|MJ12bot|Scrapy|curl|HttpClient|Java|YYSpider|ApacheBench|Python-urllib|CPython|python-requests|HTMLParser|^$”

3、分析网站的恶意爬虫

通过nginx的访问日志可以分析出网站是否被恶意爬虫爬取过,具体的步骤如下:

(1)找到nginx的访问日志,即: access.log,可以在nginx.conf中查看访问日志名称及位置

(2)使用如下命令分析日志中的user_agent信息

[root@web-server logs] cat access.log | awk -F\” ‘{A[$(NF-1)]++}END{for(k in A)print A[k],k}’ | sort -n

上述命令可以统计到同一个user_agent出现的次数,如下:

(3)查找特殊的user_agent,如下图中所标注的,可能就是一些恶意的爬虫

python-requests,Apache-HttpClient,Java,wget,curl这些,根据经验就是别人写的恶意爬取别人网站的爬虫,所以网站已经被别人爬取过。

4、封禁恶意爬虫

封禁恶意爬虫,此处介绍一种简单的,直接根据访问网站时的user_agent判断,如果改标识为空,或者为黑名单中的某一个,则直接返回403 Forbidden错误页面。如果别人伪造另外一种user_agent,则这种方法就不能防止了。可能需要实时分析日志并动态修改爬虫黑名单了,比较复杂,此处不讨论。

(1)修改nginx.conf配置文件

在nginx.conf的server段下面添加如下内容:

server {
  listen 80;
  listen 443 ssl;
  server_name www.jinnianshizhunian.vip jinnianshizhunian.vip;

  #如果user_agent中包含以下的某一个,直接返回403
  if ($http_user_agent ~ "Wget|WinHttp|Go-http-client|Zeep|Apache-HttpClient|Yakuza|masscan|WebZip|node-superagent|JikeSpider|CrawlDaddy|Apache-HttpAsyncClient|UniversalFeedParser|jaunty|Microsoft URL Control|heritrix|EasouSpider|FlightDeckReports|Swiftbot|ZmEu|DigExt|Indy Library|Alexa Toolbar|LinkpadBot|Ezooms|MJ12bot|Scrapy|curl|HttpClient|Java|YYSpider|ApacheBench|Python-urllib|CPython|python-requests|HTMLParser|^$") {
    return 403;
  }
  #...其他配置省略
}

(2)重启nginx,然后验证wget命令是否可以使用

[root@web-server conf]# /u01/app/web/nginx/sbin/nginx -s reload

[root@web-server conf]# wget http://www.domain.com

返回内容:

onnecting to www.domain.com|39.96.102.11|:80… connected.
HTTP request sent, awaiting response… 403 Forbidden
2019-05-26 22:02:42 ERROR 403: Forbidden.

以上表示,已经封禁了user_agent为wget的请求,其他在以上黑名单中的请求也会同样被封禁,返回403错误。

注:文章属原创,如果转发,请标注出处。