Nginx禁止某些User Agent抓取网站

大家都知道网络上的爬虫非常多,爬虫有利也有弊,爬虫可以让我们的网站容易被其他人搜到,比如百度蜘蛛(Baiduspider)

问题是有些爬虫不遵循robots规则对服务器造成压力,或者是恶意爬取网页、采集数据。不好的爬虫会耗费大量的服务器资源

影响正常的用户使用。有些服务器是按流量计费,被爬虫耗费很多流量要交这些额外产生的费用,比如:七牛


Nginx反爬虫

Nginx安装目录下的conf目录创建个spider目录,spider下新建个agent_deny.conf

cd /usr/local/nginx/conf         # 进入nginx配置文件目录
mkdir spider                     # 新建spider目录
cd spider                        # 进入spider目录
vim agent_deny.conf              # vim创建并编辑agent_deny.conf文件

agent_deny.conf配置如下

# 禁止Scrapy等工具的抓取
if ($http_user_agent ~* (Scrapy|Curl|HttpClient)) {
     return 403;
}

# 禁止指定UA及UA为空的访问
if ($http_user_agent ~* "FeedDemon|YisouSpider|Indy Library|Alexa Toolbar|AskTbFXTV|AhrefsBot|CrawlDaddy|CoolpadWebkit|Java|Feedly|UniversalFeedParser|ApacheBench|Microsoft URL Control|Swiftbot|ZmEu|oBot|jaunty|Python-urllib|lightDeckReports Bot|YYSpider|DigExt|HttpClient|MJ12bot|heritrix|EasouSpider|Ezooms|^$" ) {
     return 403;
}

# 禁止非GET|HEAD|POST方式的抓取
if ($request_method !~ ^(GET|HEAD|POST)$) {
    return 403;
}

注:这里设置是排除指定的User-Agent头和空User-Agaent头

下面是网络上常见的垃圾UA列表,仅供参考

FeedDemon                      # 内容采集
BOT/0.1 (BOT for JCE)          # sql注入
CrawlDaddy                     # sql注入
Java                           # 内容采集
Jullo                          # 内容采集
Feedly                         # 内容采集
UniversalFeedParser            # 内容采集
ApacheBench                    # cc攻击器
Swiftbot                       # 无用爬虫
YandexBot                      # 无用爬虫
AhrefsBot                      # 无用爬虫
YisouSpider                    # 无用爬虫(已被UC神马搜索收购,此蜘蛛可以放开!)
MJ12bot                        # 无用爬虫
ZmEu phpmyadmin                # 漏洞扫描
WinHttp                        # 采集cc攻击
EasouSpider                    # 无用爬虫
HttpClient                     # tcp攻击
Microsoft URL Control          # 扫描
YYSpider                       # 无用爬虫
jaunty                         # wordpress爆破扫描器
oBot                           # 无用爬虫
Python-urllib                  # 内容采集
Indy Library                   # 扫描
FlightDeckReports Bot          # 无用爬虫
Linguee Bot                    # 无用爬虫

然后,在网站相关配置中的  location / {  之后插入如下代码:

include /etc/nginx/conf.d/spider/agent_deny.conf;

如sitven博客的配置:

location / {
        add_header Content-Security-Policy upgrade-insecure-requests;
        uwsgi_pass mysite_server;
        include /etc/nginx/uwsgi_params;
        # 新增如下一行
        include /etc/nginx/conf.d/spider/agent_deny.conf;
    }

保存后,reload配置平滑重启nginx即可

/usr/local/nginx/sbin/nginx -s reload

Apache和PHP配置可以参考张戈的博文:服务器反爬虫攻略

测试效果

使用curl -A 模拟抓取,比如:

模拟宜搜蜘蛛抓取:

curl -I -A 'YisouSpider' sitven.cn

模拟UA为空的抓取:

curl -I -A '' sitven.cn

模拟百度蜘蛛的抓取:

curl -I -A 'Baiduspider' sitven.cn

三次抓取结果截图如下:

可以看到,宜搜蜘蛛和UA为空的返回是403禁止访问标识,而百度蜘蛛则成功返回200,说明生效!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章