大家都知道网络上的爬虫非常多,爬虫有利也有弊,爬虫可以让我们的网站容易被其他人搜到,比如百度蜘蛛(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,说明生效!