首页
Javascript
Html
Css
Node.js
Electron
移动开发
小程序
工具类

服务端

浏览器相关
前端收藏
其他
关于

如何防止网站被爬虫爬取的几种办法

2014年05月26日 转载自 老徐_kevin 阅读(97)

今天想对一个问题进行分析和讨论,就是关于爬虫对网站页面爬取的问题,有些网站通过爬虫去采集其它的网站页面信息作为己用,大量的爬取行为会对web服务器有比较性能有影响,主要的表现就是会变得很慢。

对于如何防止网站被爬取,我想从以下几种方法去分析:

1.基于程序本身去防止爬取:作为爬虫程序,爬取行为是对页面的源文件爬取,如爬取静态页面的html代码,可以用jquery去模仿写html,这种方法伪装的页面就很难被爬取了,不过这种方法对程序员的要求很高。

2.基于iptables和shell脚本:可以对nginx的access.log进行策略定义,例如定义在1分钟内并发连接数超过30个ip为非法,如ip不在白名单内,则加入iptables策略封掉,当然这种的缺点是会有“误伤”,策略细粒度越小就会有更多的“误伤”,细粒度大就会使效果变差,另外还有类似的第三方工具fail2ban,利用做filter和actor对一些有危害的操作记录或是封ip。但是对于某个特定的爬虫地址(例如网易、有道)的爬取行为拒绝也很难准确做到,因为你无法准确知道这些特定的爬虫ip地址(例如网易、有道),以下是我的定位方式,不过发现由于ip库不准确造成错误的屏蔽。注意:建议不要用封ip条目的方式,iptables列表长度是65535时就会封满,服务器也就会死机。

111812892.jpg

脚本如下:

  1. #! /bin/bash
  2. LOGFILE=/var/log/nginx/access.log
  3. PREFIX=/etc/spiders
  4. #日志中大部分蜘蛛都有spider的关键字,但是百度的不能封,所以过滤掉百度
  5. grep 'spider' $LOGFILE |grep -v 'Baidu' |awk '{print $1}' >$PREFIX/ip1.txt
  6. # 封掉网易的有道
  7. grep 'YoudaoBot' $LOGFILE | awk '{print $1}' >>$PREFIX/ip1.txt
  8. #封掉雅虎
  9. grep 'Yahoo!' $LOGFILE | awk '{print $1}' >>$PREFIX/ip1.txt
  10. # 过滤掉信任IP
  11. sort -n $PREFIX/ip1.txt |uniq |sort |grep -v '192.168.0.' |grep -v '127.0.0.1'>$PREFIX/ip2.txt
  12. # 如果一小时内,发包不超过30个就要解封
  13. /sbin/iptables -nvL |awk '$1 <= 30 {print $8}' >$PREFIX/ip3.txt
  14. for ip in `cat $PREFIX/ip3.txt`; do /sbin/iptables -D INPUT -s $ip -j DROP ; done
  15. /sbin/iptables -Z // 将iptables计数器置为0
  16. for ip in `cat $PREFIX/ip2.txt`; do /sbin/iptables -I INPUT -s $ip -j DROP ; done

3.使用robots.txt文件:例如阻止所有的爬虫爬取,但是这种效果不是很明显。

  1. User-agent: *
  2. Disallow: /

4.使用nginx的自带功能:通过对httpuseragent阻塞来实现,包括GET/POST方式的请求,以nginx为例,具体步骤如下:

编辑nginx.conf

  1. #vim /usr/local/nginx/conf/nginx.conf

拒绝以wget方式的httpuseragent,增加如下内容

  1. ## Block http user agent - wget ##
  2. if ($http_user_agent ~* (Wget) ) {
  3. return 403;
  4. }
  5. ## Block Software download user agents ##
  6. if ($http_user_agent ~* LWP::Simple|BBBike|wget) {
  7. return 403;
  8. }

平滑启动

  1. # /usr/local/nginx/sbin/nginx -s reload

如何拒绝多种http user agent,内容如下:

  1. if ($http_user_agent ~ (agent1|agent2|Foo|Wget|Catall Spider|AcoiRobot) ) {
  2. return 403;
  3. }

大小写敏感匹配

  1. ### 大小写敏感http user agent拒绝###
  2. if ($http_user_agent ~ (Catall Spider|AcoiRobot) ) {
  3. return 403;
  4. }
  5. ### 大小写不敏感http user agent拒绝###
  6. if ($http_user_agent ~* (foo|bar) ) {
  7. return 403;
  8. }

注意语法:~*表示是大小写不敏感,~表示是大小写敏感

© 本文著作权归原作者所有 来源:老徐_kevin 阅读原文

评论

  •  
  • nginx优化跨域的OPTIONS请求

    需要跨域的项目,很多时候每次都会发送OPTIONS请求,能不能优化呢?

    发布:2020-03-07 阅读(136)

  • mongodb之多表关联查询并分页

    mongodb多表关联查询

    发布:2020-02-29 阅读(103)

  • 网易高手:角色权限设计的100种解法

    角色、权限、用户之间的关系,以及如何设计

    发布:2020-02-22 阅读(134)

  • 理解 JWT 的使用场景和优劣

    这样形如 A.B.C 的字符串时能敏感地认出这是使用了 jwt。发了这两篇文章后,有不少读者在文末留言,表达了对 jwt 使用方式的一些疑惑,以及到底哪些场景适合使用 jwt。我并不是 jwt 方面的专家,和不少读者一样,起初研究时我也存在相同疑惑,甚至在逐渐接触后产生了更大的疑惑,经过这段时间项目中的使用和一些自己思考,把个人的总结整理成此文。

    发布:2020-01-09 阅读(124)

  • Idea每次修改jsp都需要重启tomcat解决方法

    发布:2020-01-03 阅读(228)

  • 实现token自动续期

    go语言实现token自动续期

    发布:2019-12-31 阅读(509)

  • nodejs前后端添加RSA加密验证

    RSA加密的玩法

    发布:2019-12-30 阅读(259)

  • 使用OpenSSL生成RSA公钥和私钥

    发布:2019-12-29 阅读(178)

  • MongoDB unique唯一索引值,如何支持空值 ?

    发布:2019-12-29 阅读(164)

  • 捕获mongoose save()报错并返回Controller

    捕获save报错,返回controller

    发布:2019-12-29 阅读(137)

  • windows下安装配置nginx 反向代理

    win10下安装nginx,配置返向代理

    发布:2019-12-11 阅读(154)

  • Client does not support authentication protocol requested by server

    ERROR 9076 nodejs.SequelizeConnectionError: Client does not support authentication protocol requested by server; consider upgrading MySQL client

    发布:2019-09-01 阅读(383)

  • Linux rpm命令详解

    RPM是RedHat Package Manager(RedHat软件包管理工具)类似Windows里面的“添加/删除程序

    发布:2019-08-02 阅读(403)

  • Linux中apt与apt-get命令的区别与解释

    Ubuntu 16.04 发布时,一个引人注目的新特性便是 apt 命令的引入。其实早在 2014 年,apt 命令就已经发布了第一个稳定版,只是直到 2016 年的 Ubuntu 16.04 系统发布时才开始引人关注。随着 apt install package 命令的使用频率和普遍性逐步超过 apt-get install package,越来越多的其它 Linux 发行版也开始遵循 Ubuntu 的脚步,开始鼓励用户使用 apt 而不是 apt-get。

    发布:2019-03-04 阅读(636)

  • centos7设置、查看、删除环境变量的方法

    centos查看环境变量与设置环境变量在使用过程中很常见,本文整理了一些常用的与环境变量相关的命令,感兴趣的朋友可以参考下希望对你有所帮助

    发布:2018-12-27 阅读(1721)

  • linux CentOS 安装oh my Zsh

    linux cenos下安装oh my zsh,oh my zsh 用于管理zsh配置,使shell界面更美观。 Zsh 是一款功能强大终端(shell)软件,既可以作为一个交互式终端,也可以作为一个脚本解释器。它在兼容 Bash 的同时 (默认不兼容,除非设置成 emulate sh) 还有提供了很多改进。

    发布:2018-12-20 阅读(1969)

  • Nginx配置SSL证书,实现https访问

    以腾讯云为例,配置nginx,实现https访问

    发布:2018-11-23 阅读(1030)

  • nginx设置二级域名指向子目录

    nginx设置二级域名指向子目录

    发布:2018-11-22 阅读(1307)

  • nginx性能优化

    发现ip访问比nginx快多了,知道nginx出问题了~ 得给他优化优化。优化后由原来的2.7s打开,到600ms打开~nginx优化还是有用的

    发布:2018-11-22 阅读(627)

  • Nginx开启gzip

    通过nginx开启gzip设置

    发布:2018-10-15 阅读(641)

  • linux云服务通过Nginx绑定多个域名

    通过Nginx反向代理,在一个云服务器上绑定多个域名,不同的域名访问不同的目录,端口

    发布:2018-10-11 阅读(959)

  • CentOS 7上安装Nginx

    如何在Linux(CentOS 7)上安装Nginx,作为反向代理服务器。

    发布:2018-10-11 阅读(819)

  • nginx实现CORS跨域配置

    nginx服务端实现CORS跨域配置

    发布:2018-06-20 阅读(96)

  • 关于UUID的二三事

    UUID,是Universally Unique Identifier的缩写,UUID出现的目的,是为了让分布式系统可以不借助中心节点,就可以生成UUID来标识一些唯一的信息;

    发布:2017-06-26 阅读(118)

  • tail命令详情

    命令从指定点开始将 File 参数指定的文件写到标准输出。如果没有指定文件,那么会使用标准输入。Number 变量指定将多少单元写到标准输出。Number 变量的值可以是正的或负的整数。如果值的前面有 +(加号),从文件开头指定的单元数开始将文件写到标准输出。如果值的前面有 -(减号),那么从文件末尾指定的单元数开始将文件写到标准输出。如果值前面没有 +(加号)或 -(减号),那么从文件末尾指定的单元号开始读取文件

    发布:2017-05-23 阅读(771)

  • 如何防止网站被爬虫爬取的几种办法

    今天想对一个问题进行分析和讨论,就是关于爬虫对网站页面爬取的问题,有些网站通过爬虫去采集其它的网站页面信息作为己用,大量的爬取行为会对web服务器有比较性能有影响,主要的表现就是会变得很慢。

    发布:2014-05-26 阅读(97)

  • 网站设置301转各的各种方法

    将不带www的域名301重定向到带www的域名,利于SEO

    发布:2013-11-29 阅读(626)