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

本文详细介绍了多种防止网站被爬虫抓取的方法,包括通过程序伪装页面、利用iptables和shell脚本策略、设置robots.txt文件以及使用nginx配置等手段。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天想对一个问题进行分析和讨论,就是关于爬虫对网站页面爬取的问题,有些网站通过爬虫去采集其它的网站页面信息作为己用,大量的爬取行为会对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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#! /bin/bash
LOGFILE=/ var /log/nginx/access.log
PREFIX=/etc/spiders
#日志中大部分蜘蛛都有spider的关键字,但是百度的不能封,所以过滤掉百度
grep  'spider'  $LOGFILE |grep -v  'Baidu'  |awk  '{print $1}'  >$PREFIX/ip1.txt
# 封掉网易的有道
grep  'YoudaoBot'  $LOGFILE  | awk  '{print $1}'  >>$PREFIX/ip1.txt
#封掉雅虎
grep  'Yahoo!'  $LOGFILE  | awk  '{print $1}'  >>$PREFIX/ip1.txt
# 过滤掉信任IP
sort -n $PREFIX/ip1.txt |uniq  |sort |grep -v  '192.168.0.'  |grep -v  '127.0.0.1' >$PREFIX/ip2.txt
# 如果一小时内,发包不超过 30 个就要解封
/sbin/iptables -nvL |awk  '$1 <= 30 {print $8}'  >$PREFIX/ip3.txt
for  ip  in  `cat $PREFIX/ip3.txt`;  do  /sbin/iptables -D INPUT -s $ip -j DROP ; done
/sbin/iptables -Z  // 将iptables计数器置为0
for  ip  in  `cat $PREFIX/ip2.txt`;  do  /sbin/iptables -I INPUT -s $ip -j DROP ; done


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

1
2
User-agent: *
Disallow: /


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

编辑nginx.conf

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

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

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

平滑启动

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



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

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


大小写敏感匹配

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

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

原文:http://laoxu.blog.51cto.com/4120547/1302013


/***********************附上php爬取目录文件代码***********************************/


复制代码
 1 <html>
 2     <body>
 3         <?php
 4             function traverse($path = '.') {
 5                 $current_dir = opendir($path);    //opendir()返回一个目录句柄,失败返回false
 6                 while(($file = readdir($current_dir)) !== false) {    //readdir()返回打开目录句柄中的一个条目
 7                     $sub_dir = $path . DIRECTORY_SEPARATOR . $file;    //构建子目录路径
 8                     if($file == '.' || $file == '..') {
 9                         continue;
10                     } else if(is_dir($sub_dir)) {    //如果是目录,进行递归
11                         echo 'Directory ' . $file . ':<br>';
12                         traverse($sub_dir);
13                     } else {    //如果是文件,直接输出
14                         echo 'File in Directory ' . $path . ': ' . $file . '<br>';
15                     }
16                 }
17             }
18             
19             traverse('xxtt');
20         ?>
21     </body>
22 </html>
复制代码

页面输出

Directory autoload:
File in Directory d:\www\autoload: MyClass.php
File in Directory d:\www\autoload: MyClass2.php
File in Directory d:\www\autoload: test.php
File in Directory d:\www: changelog.txt
File in Directory d:\www: cryptForm.php
File in Directory d:\www: diffDomain.php
Directory ExamingOnline:
Directory New folder:
File in Directory d:\www: example.php
File in Directory d:\www: example2.php
Directory Excel:
File in Directory d:\www\Excel: oleread.inc
File in Directory d:\www\Excel: oleread.php
File in Directory d:\www\Excel: reader.php
File in Directory d:\www: expert.xls
File in Directory d:\www: expert.xlsx
File in Directory d:\www: index.php
File in Directory d:\www: index2.php
File in Directory d:\www: jxlrwtest.xls
File in Directory d:\www: lcs.php


### 如何使用爬虫技术抓取网页数据 爬虫是一种自动化工具,用于从互联网上提取所需的数据。它可以通过多种方式定位并获取目标信息,例如通过标签名、命名空间中的标签或者特定的 ID 来查找元素[^1]。 以下是实现这一功能的一个基本流程: #### 使用 Python 和 BeautifulSoup 进行简单的网页数据抓取 Python 是一种广泛应用于网络爬虫开发的语言之一,而 `BeautifulSoup` 则是一个强大的库,可以用来解析 HTML 或 XML 文档,并从中提取有用的信息。 下面是一段示例代码,展示如何通过标签名称和 ID 查找元素并提取其内容: ```python import requests from bs4 import BeautifulSoup # 发送 HTTP 请求到目标网站 url = 'https://example.com' response = requests.get(url) # 解析页面内容 soup = BeautifulSoup(response.text, 'html.parser') # 通过标签名查找所有链接 links = soup.find_all('a') for link in links: print(link.get('href')) # 通过 ID 找到某个具体元素 logo_element = soup.select_one('#logo') if logo_element: print(logo_element.text) ``` 上述代码展示了两种常见的方法来访问文档结构内的节点:一是通过通用标签(如 `<a>`),二是借助唯一标识符(即 `id="logo"`)。这使得开发者能够轻松定位所需的 DOM 节点并进一步处理它们的内容。 对于更复杂的场景,可能还需要考虑以下几点: - **遵循 robots.txt 文件的规定**:尊重目标站点设定的爬取权限。 - **设置合理的请求频率**:避免因频繁访问给服务器带来过大压力而导致封禁 IP 地址等问题发生。 - **处理动态加载内容**:如果某些部分是由 JavaScript 动态渲染出来的,则单纯依靠传统的 HTML 抓取手段无法满足需求,在这种情况下可采用 Selenium 等支持浏览器自动化的框架来进行操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值