WEB应用

服务器反爬虫攻略:Apache/Nginx/PHP禁止某些User Agent抓取网站

Jager · 9月25日 · 2014年 3493次已读

我们都知道网络上的爬虫非常多,有对网站收录有益的,比如百度蜘蛛(Baiduspider),也有不但不遵守 robots 规则对服务器造成压力,还不能为网站带来流量的无用爬虫,比如宜搜蜘蛛(YisouSpider)最新补充:宜搜蜘蛛已被 UC 神马搜索收购!所以本文已去掉宜搜蜘蛛的禁封!==>相关文章)。最近张戈发现 nginx 日志中出现了好多宜搜等垃圾的抓取记录,于是整理收集了网络上各种禁止垃圾蜘蛛爬站的方法,在给自己网做设置的同时,也给各位站长提供参考。

一、Apache

①、通过修改 .htaccess 文件

修改网站目录下的.htaccess,添加如下代码即可(2 种代码任选):

可用代码 (1):
RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} (^$|FeedDemon|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) [NC]
RewriteRule ^(.*)$ - [F]
 可用代码 (2):
SetEnvIfNoCase ^User-Agent$ .*(FeedDemon|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) BADBOT
Order Allow,Deny
Allow from all
Deny from env=BADBOT

②、通过修改 httpd.conf 配置文件

找到如下类似位置,根据以下代码 新增 / 修改,然后重启 Apache 即可:

DocumentRoot /home/wwwroot/xxx
<Directory "/home/wwwroot/xxx">
SetEnvIfNoCase User-Agent ".*(FeedDemon|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)" BADBOT
        Order allow,deny
        Allow from all
       deny from env=BADBOT
</Directory>

二、Nginx 代码

进入到 nginx 安装目录下的 conf 目录,将如下代码保存为 agent_deny.conf

cd /usr/local/nginx/conf

vim agent_deny.conf

#禁止 Scrapy 等工具的抓取
if ($http_user_agent ~* (Scrapy|Curl|HttpClient)) {
     return 403;
}
#禁止指定 UA 及 UA 为空的访问
if ($http_user_agent ~* "FeedDemon|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;
}

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

include agent_deny.conf;

如张戈博客的配置:

[marsge@Mars_Server ~]$ cat /usr/local/nginx/conf/zhangge.conf 
location / {
        try_files $uri $uri/ /index.php?$args;
        #这个位置新增 1 行:
        include agent_deny.conf;
        rewrite ^/sitemap_360_sp.txt$ /sitemap_360_sp.php last;
        rewrite ^/sitemap_baidu_sp.xml$ /sitemap_baidu_sp.php last;
        rewrite ^/sitemap_m.xml$ /sitemap_m.php last;

保存后,执行如下命令,平滑重启 nginx 即可:

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

 三、PHP 代码

将如下方法放到贴到网站入口文件 index.php 中的第一个 <?php 之后即可:

//获取 UA 信息
$ua = $_SERVER['HTTP_USER_AGENT'];
//将恶意 USER_AGENT 存入数组
$now_ua = array('FeedDemon ','BOT/0.1 (BOT for JCE)','CrawlDaddy ','Java','Feedly','UniversalFeedParser','ApacheBench','Swiftbot','ZmEu','Indy Library','oBot','jaunty','YandexBot','AhrefsBot','MJ12bot','WinHttp','EasouSpider','HttpClient','Microsoft URL Control','YYSpider','jaunty','Python-urllib','lightDeckReports Bot');
//禁止空 USER_AGENT,dedecms 等主流采集程序都是空 USER_AGENT,部分 sql 注入工具也是空 USER_AGENT
if(!$ua) {
    header("Content-type: text/html; charset=utf-8");
    die('请勿采集本站,因为采集的站长木有小 JJ!');
}else{
    foreach($now_ua as $value )
//判断是否是数组中存在的 UA
    if(eregi($value,$ua)) {
        header("Content-type: text/html; charset=utf-8");
        die('请勿采集本站,因为采集的站长木有小 JJ!');
    }
}

四、测试效果

如果是 vps,那非常简单,使用 curl -A 模拟抓取即可,比如:

模拟宜搜蜘蛛抓取:

curl -I -A 'YisouSpider' zhang.ge

模拟 UA 为空的抓取:

curl -I -A '' zhang.ge

模拟百度蜘蛛的抓取:

curl -I -A 'Baiduspider' zhang.ge

三次抓取结果截图如下:

服务器反爬虫攻略:Apache/Nginx/PHP禁止某些User Agent抓取网站

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

补充:第二天,查看 nginx 日志的效果截图:

①、UA 信息为空的垃圾采集被拦截:

服务器反爬虫攻略:Apache/Nginx/PHP禁止某些User Agent抓取网站

 

②、被禁止的 UA 被拦截:

服务器反爬虫攻略:Apache/Nginx/PHP禁止某些User Agent抓取网站

因此,对于垃圾蜘蛛的收集,我们可以通过分析网站的访问日志,找出一些没见过的的蜘蛛(spider)名称,经过查询无误之后,可以将其加入到前文代码的禁止列表当中,起到禁止抓取的作用。

五、附录:UA 收集

下面是网络上常见的垃圾 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           无用爬虫

六、参考资料

问说:http://www.uedsc.com/acquisition.html

浩海:http://www.it300.com/article-15358.html

夜空:http://blog.slogra.com/post-135.html

67 条回应
  1. 求助 2014-12-16 · 16:53

    我用的 DZ 3.1 也是被这些蜘蛛直接把服务费CPU100% LUIX系统 阿帕奇 如果要屏蔽是直接 在 通过修改 .htaccess文件 下面加上你上面的代码就行了吗?望回复 在线等 谢谢

    • avatar
      Jager 2014-12-16 · 18:01

      嗯 可以的,具体你得弄清楚是哪些爬虫,然后加黑名单。

      • 求解 2014-12-17 · 10:31

        修改以后 打开站点.htaccess里有错误,导致现在站点打开500错误。 之前遇到一搜的爬虫 疯狂

  2. 求助 2014-12-16 · 18:59

    YisouSpider 还有 majestic12.co.uk 就发现这两个 疯狂的爬 一会服务器就瘫掉了 我看您用的是 WP博客程序 之前在网上也找了一些代码 加了好像没用 我用的DZ 3.1 直接把 上面的 修改 .htaccess文件 加在最下面 就行了吧  不管他那些爬虫 除了百度和 360 谷歌 其余的都封掉 烦都烦死了 

  3. 求解 2014-12-17 · 10:49

    Internal Server Error

    The server encountered an internal error or misconfiguration and was unable to complete your request.

    Please contact the server administrator, webmaster@HA59358 and inform them of the time the error occurred, and anything you might have done that may have caused the error.

    More information about this error may be available in the server error log. 出现这个。。。修改 .htaccess文件

    • avatar
      Jager 2014-12-17 · 11:51

      :???: 实在搞不定就购买付费服务吧!==>付费服务

  4. 过客 2015-1-23 · 10:06

    谢谢博主分享自己的经验和劳动,受益不好,再次谢过!!

    • avatar
      Jager 2015-1-23 · 11:04

      多交流.
      受益不好??

  5. wxo 2015-1-31 · 12:50

    使用了方式3,模拟空UA,返回的竟然是500!

  6. wxo 2015-1-31 · 13:07

    修改为nginx 层判断ua好使了。 谢谢张哥。

  7. 胡歌网摘 2015-5-1 · 10:46
    #禁止Scrapy等工具的抓取
    if ($http_user_agent ~* (Scrapy|Curl|HttpClient)) {
         return 403;
    }
    #禁止指定UA及UA为空的访问

    为什么这两个分开写?
    写在一起是可以的吧?

    另外,我在猎豹浏览器v5.2.9 提交评论的滑块是拉不动的,只能换到firefox下来提交了,你看看有没有什么问题。

    • avatar
      Jager 2015-5-1 · 12:56

      完全可以写一起,另外没用过猎豹。。

      • 胡歌网摘 2015-5-1 · 15:49

        就是chrome的修改版,你试试chrome有没有问题吧,我本机没装。

  8. WordPress主题 2015-6-17 · 16:25

    非常实用的教程,可以吧AB这类工具也给加上。

    • avatar
      Jager 2015-6-17 · 19:29

      你这是多久没冒过泡了。

      • WordPress主题 2015-6-17 · 20:07

        是很少逛博客。。。。 :mrgreen:

  9. ghost 2015-6-28 · 21:04

    开启https的站点还有点问题,因为HTTP_USER_AGENT并管不着https的访问...

  10. ghost 2015-6-30 · 15:09

    开启https的站点还有点问题,因为HTTP_USER_AGENT并管不着https的访问...
    邮件通知审核通过,但是……??

    • avatar
      Jager 2015-6-30 · 15:29

      谁说https不管useragent?用nginx去实现试试。

      • ghost 2015-7-1 · 22:28

        呃,我用的是Apache2,curl测试的确是https就不拦截了Orz

        • avatar
          Jager 2015-7-2 · 8:28

          个人网站还是用Nginx舒服

          • ghost 2016-3-5 · 9:35

            最近重新折腾的时候才发现之前没有把配置写到https那个VirtualHost……折腾h2去了233

  11. 同盟源 2015-7-22 · 23:55

    来屏蔽个百度的蜘蛛玩玩

  12. ua 2015-7-31 · 22:38

    爬虫程序不可以自己设置UA吗? 比如设置为百度的爬虫UA 。如何反这种爬虫?

  13. ghost 2015-9-18 · 4:35

    把Feedly屏蔽了作甚…

  14. aoweisi 2015-12-2 · 22:27

    博主 请教一个问题 agent 识别为 curl/7.29.0 的是什么东西 是不是抓取工具啊?

    • avatar
      Jager 2015-12-2 · 22:33

      curl 是Linux下的一个命令,可以抓取可以post,很强大。

      • aoweisi 2015-12-2 · 22:36

        哇 博主 真热心 这么快就回复了 那我问一下 这种按你说的那不是可以用作CC攻击?如果可以大GET量请求

        • avatar
          Jager 2015-12-3 · 14:35

          本来就是,变态的请求那就是攻击了。

      • 爱福利 2015-12-3 · 16:03

        你的VPS用的阿里云的ECS 的话 会不会被屏蔽页面啊 听说阿里云对这块拦截挺厉害的 什么 破解软件 注册机 VPN 这些东西很容易被屏蔽掉 那怎么办的?

  15. 爱福利 2015-12-3 · 14:34

    agent:Go 1.1 package http
    我算是发现了,但凡可以写爬虫的都可以 进行采集+CC攻击!

  16. 爱福利 2015-12-4 · 10:02

    博主 Nginx日志里面 useragent 属性一般后面会跟着一个IP 那是什么 ?我发现有大量CC的攻击者 都会伪装USER agent 但是agent后面都会跟着一个IP 像这样:186.237.172.127 - - [04/Dec/2015:09:49:49 +0800] "GET /52.html?s=4415 HTTP/1.1" 500 253 "-" "Mozilla/5.0 9649" 133.130.117.212

    • avatar
      Jager 2015-12-4 · 14:30

      目测是代理ip或请求IP

  17. google 2015-12-12 · 16:24

    我用第一种方法,把代码 加入 .htaccess 后,网站访问了不了,不知道是为什么?我的网站的zencart 系统

  18. 慕梓阁 2016-1-5 · 21:19

    http://www.2zzt.com/jianzhan/7347.html 这篇文章怎么这么神似 又被偷文章了 ?

    • avatar
      Jager 2016-1-5 · 23:13

      呵呵了。

  19. kay 2016-5-7 · 4:08

    站长你好^^,很感谢你提供的恶意UA列表,想提一个意见看看能不能更新下呢?
    1、赞同本文说法,YisouSpider现在已经成正规user agent了。
    2、jikeSpider盘古搜好歹也顶着个”中国搜索”的旗号,也该也不算恶意user agent吧?
    3、另外我再补充几个|Alexa Toolbar|AskTbFXTV|CoolpadWebkit|lightDeckReports Bot|DigExt|heritrix|LinkpadBot|Ezooms|^$

    • avatar
      Jager 2016-5-7 · 8:56

      已去掉盘古
      其实这篇文字分享的是一种方法,各位站长想增加想删除都可以自己定义。所以这些我就不加上去了,比如Alexa Tool 这个Alexa排名的工具条

  20. more 2016-5-31 · 17:05

    nginx: [emerg] "if" directive is not allowed here in /usr/local/nginx/conf/vhost/agent_deny.conf:2
    OMG 不知道什么情况

    • avatar
      Jager 2016-5-31 · 21:04

      include写到哪了?

      • more 2016-6-3 · 9:01

        发现问题了 agent_deny.conf 不能放vhost里面 ,必须在上一层conf 下面,然后再include 就可以了。

        • avatar
          Jager 2016-6-3 · 10:18

          本来就是这样啊,你自己没仔细看文章而已:

          进入到nginx安装目录下的conf目录,将如下代码保存为 agent_deny.conf
          cd /usr/local/nginx/conf
          vim agent_deny.conf

          • more 2016-6-4 · 0:01

            我原来是这样的:
            cd /usr/local/nginx/conf/vhost
            vim agent_deny.conf
            include vhost/agent_deny.conf
            发现不行,然后再
            cd /usr/local/nginx/conf
            vim agent_deny.conf
            include agent_deny.conf
            这样就可以了

            • avatar
              Jager 2016-6-4 · 8:04

              本来就不用带全路径。

  21. more 2016-6-3 · 8:59

    发现有BUG,在nginx上设置之后,百度站长平台检测robots.txt会提示:无法访问您网站的robots.txt文件
    百度暂时无法访问您服务器上的robots.txt文件,请检查服务器的设置,确保该文件能被正常访问。错误码:403

    • more 2016-6-3 · 9:02

      一旦不include,再去检测就正常了

  22. 渐行渐远 2016-6-22 · 16:40

    我设置过滤了ua为空的user_agent,用curl测试也成功了,但是为什么日志里返回的还都是200呢?求解

  23. qa 2016-7-25 · 6:10

    通过nginx校验cookie效果更佳。

  24. david 2016-8-11 · 22:35

    你往index.php里调用wp_die()是逗我玩么?wp环境还没建立呢你就调用那不报错?

    • avatar
      Jager 2016-8-12 · 7:41

      博主很忙,没空逗你玩。
      满足恶意爬虫的访问条件才会die,没必要加载wp内核。

  25. 求助 2016-11-30 · 10:31

    发现有BUG,在nginx上设置之后,百度站长平台检测robots.txt会提示:无法访问您网站的robots.txt文件
    百度暂时无法访问您服务器上的robots.txt文件,请检查服务器的设置,确保该文件能被正常访问。错误码:403

    • avatar
      Jager 2016-12-1 · 7:27

      把第二行代码中的Curl去掉,其他不变

  26. 十年如梦 2017-1-22 · 16:22

    http301跳转https后,抓取http时会提示返回的301,抓去https提示403,这样是否工作正常呢?

    • 十年如梦 2017-1-22 · 17:33

      找到解决方法了,在return 301前面添加include agent_deny.conf;

  27. 尧月 2017-2-7 · 10:16

    学习了,谢谢

  28. 玉满斋 2017-3-5 · 22:04

    为啥.htacess的我一用就是500错误,只能使用PHP的,不知道有没有效!

  29. 求助 2017-7-8 · 10:24

    张哥,
    Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.3; WOW64; Trident/7.0; .NET4.0E; .NET4.0C; .NET CLR 3.5.30729; .NET CLR 2.0.50727; .NET CLR 3.0.30729) 这个ua 是不是爬虫啊。
    .NET CLR 是不是用java虚拟机做的爬虫呢

  30. 求助 2017-7-8 · 10:26

    张哥,
    最近发现有人采集我的网站
    ua>Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.3; WOW64; Trident/7.0; .NET4.0E; .NET4.0C; .NET CLR 3.5.30729; .NET CLR 2.0.50727; .NET CLR 3.0.30729)
    .NET CLR 是不是指用.net做的一个爬虫程序

  31. miracler 2018-2-18 · 17:08

    难道是我的姿势不对吗?
    #禁止指定UA及UA为空的访问
    if ($http_user_agent ~ "FeedDemon|Indy Library|....." ) {
    return 403;
    }
    无法屏蔽,如果换成:
    if ($http_user_agent ~* "FeedDemon|Indy Library|....." ) {
    return 403;
    }
    是可以的。

    • avatar
      Jager 2018-2-24 · 14:14

      你这个匹配是忽略了大小写,匹配更广一些。

  32. 无风 2018-5-17 · 18:15

    感谢博主,相当有用,我用了PHP的语句,但是我的页面是HTTPS的。那么$ua = $_SERVER['HTTP_USER_AGENT'];,还有效吗,因为我发现MJ12BOT还在爬。

    • avatar
      Jager 2018-5-27 · 11:56

      和https应该没关系

      • 无风 2018-5-27 · 11:57

        谢谢,现在原理我明白了,他只是屏掉,让他跳转 die('请勿采集本站,因为采集的站长木有小JJ!');
        作用应该是有了,现在服务器跑起来流畅多了。

  33. 信天翁 2018-7-24 · 20:31

    我可以说我的根目录/usr/local/nginx夏敏只有logs文件夹,根本没有conf,用的是1.1.4版本,后来换成了tengine2.2还是没找到小编说的文件,这怎么回事啊,另外试了apache的3中方法,都不行,500错误。

  34. 强哥 2019-5-22 · 9:48
    Internal Server Error
    The server encountered an internal error or misconfiguration and was unable to complete your request.
    
    Please contact the server administrator at webmaster@example.com to inform them of the time this error occurred, and the actions you performed just before this error.
    
    More information about this error may be available in the server error log.

    为什么我放进去就报这样的错误。难道是我的apache不支持这样的

  35. 2019-7-17 · 14:18

    通过nginx校验cookie效果更佳。

  36. 玛西尔 2020-1-6 · 8:00

    我是新手不太懂,只能搞懂第三种方法,是把内容复制进wordpress博客根目录下的index文件吗?

  37. 云门 2022-8-21 · 22:20

    很全面的技术分享,谢谢