1. 健康学习网 > 百科知识 >

防止爬虫,设计一个网络爬虫系统,有什么手段来避免抓取重复网页

本文目录索引

1,设计一个网络爬虫系统,有什么手段来避免抓取重复网页

网络爬虫是一个自动提取网页的程序,它为搜索引擎从万维网上下载网页,是搜索引擎的重要组成。传统爬虫从一个或若干初始网页的URL开始,获得初始网页上的URL,在抓取网页的过程中,不断从当前页面上抽取新的URL放入队列,直到满足系统的一定停止条件
爬虫的工作流程较为复杂,需要根据一定的网页分析算法过滤与主题无关的链接,保留有用的链接并将其放入等待抓取的URL队列。然后,它将根据一定的搜索策略从队列中选择下一步要抓取的网页URL,并重复上述过程,直到达到系统的某一条件时停止
(1) 对抓取目标的描述或定义;
  (2) 对网页或数据的分析与过滤;
  (3) 对URL的搜索策略。
  抓取目标的描述和定义是决定网页分析算法与URL搜索策略如何制订的基础。而网页分析算法和候选URL排序算法是决定搜索引擎所提供的服务形式和爬虫网页抓取行为的关键所在。这两个部分的算法又是紧密相关的。

设计一个网络爬虫系统,有什么手段来避免抓取重复网页

2,python爬虫有什么办法防止反爬虫

  解决方法,以淘宝为例:  #-*_coding:utf-8-*-  import requests  import re  from xlwt import *  import time  reload(__import__('sys')).setdefaultencoding('utf-8')#打印为中文  '''  headers={'User-Agent':'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36'}#构造头部  cook ={"Cookie":''}#cookie有改动,大家用自己的cookie就好  url="https://wwwcom/market/nvzhuang/dress.php?spm=a21bo.7723600.8224.2.nPpHHT"  #html=requests.get(url).content  html=requests.get(url,cookies=cook,headers=headers).content#get中提交url,COOKIE,  print html  '''  def getHtml(url):  proxylist = (  '123.134.185.11',  '115.228.107.142',  '180.76.135.145',  '58.218.198.61',  '110.72.43.148',  )  for proxy in proxylist:  proxies = {'': proxy}  headers={'User-Agent':'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36'}#构造头部  cook ={''}#cookie有改动,大家用自己的cookie就好  #html=requests.get(url).content  html=requests.get(url,cookies=cook,headers=headers,proxies=proxies).text  return html  def changeurl(start_url,page): #传参数(开始的url,页数)  urls=[]  for i in range(1,page+1):  url=start_url+str(i)  urls.append(url)  return urls  start_url="https//list.tmall.com/search_product.htm?type=pc&totalPage=100&cat=50025135&sort=d&style=g&from=sn_1_cat-qp&active=1&jumpto="  urls=changeurl(start_url,2)  wb = Workbook()  ws = wb.add_sheet('sheet1')  ws.write(0, 0, 'pid')  ws.write(0, 1, 'price')  ws.write(0, 2, 'title')  ws.write(0, 3, 'url')  index = 1  for url in urls:  html=getHtml(url)  time.sleep(1)  reForProduct = re.compile('\s+[\s\S]+?\s+\s+')  products = reForProduct.findall(html)  for pro in products:  for (pid, price, url, title) in products:  text= ("%s\t%s\t%s\t%s") % (pid, price, title, url)  print text  ws.write(index, 0, pid)  ws.write(index, 1, price)  ws.write(index, 2, title)  ws.write(index, 3, url)  index += 1  wb.save('result.xls')

3,如何设置让网站禁止被爬虫收录?

1、网站建设好了,当然是希望网页被搜索引擎收录的越多越好,但有时候我们也会碰到网站不需要被搜索引擎收录的情况。要启用一个新的域名做镜像网站,主要用于PPC 的推广,这个时候就要想办法屏蔽搜索引擎蜘蛛抓取和索引我们镜像网站的所有网页。因为如果镜像网站也被搜索引擎收录的话,很有可能会影响官网在搜索引擎的权重。 2、屏蔽主流搜索引擎爬虫(蜘蛛)抓取/索引/收录网页的几种思路。是整站屏蔽,而且是尽可能的屏蔽掉所有主流搜索引擎的爬虫。 3、通过 robots.txt 文件屏蔽,可以说 robots.txt 文件是最重要的一种渠道(能和搜索引擎建立直接对话)。通过 meta tag 屏蔽,在所有的网页头部文件添加,添加如下语句:。通过服务器(如:Linux/nginx )配置文件设置,直接过滤 spider/robots 的IP 段。

4,夏季防蚊虫有哪些方法

‍‍夏秋换季,蚊子依然很多。对于一些人来说,被蚊子叮咬一下,可能会患上一些常见的疾病。因此大家一定要做好防蚊虫的措施,同时,还要学会被蚊虫叮咬后的处理方法,大家好好学习一下吧! 怎样防蚊虫叮咬 夏季预防蚊虫叮咬,要经常的洗澡,也要注意勤换衣,做好个人卫生,这样会转移蚊子的注意力。夏季防蚊虫还要穿浅色的衣服,这样可以降低蚊虫叮咬的机会。预防蚊虫叮咬,还可以口服维生素B,也可以很好的驱蚊,但是维生素B不宜长期服用。想要驱蚊,还可以在屋内种植茉莉花、米兰、夜来香等驱蚊植物,不过花粉过敏者就不要尝试了。 蚊香驱蚊注意事项 夏季,蚊香是最常用的驱蚊工具,但是蚊香燃烧对人体会造成一定的伤害,产生烟熏,所以用蚊香驱蚊适合在室外、阳台等处。电蚊香片或液体蚊香可以在屋里使用,在睡觉前就要先点上。使用电蚊香片或液体蚊香时,最好先把门窗关好,人先离开房间,等一段时间后回家,然后开窗换气睡觉。 蚊子叮咬后该如何处理 1.肥皂涂抹止痒:蚊虫在咬人的时候,在蚊子的口器中分泌出一种有机酸――蚁酸,这种物质可以让人肌肉酸痒。肥皂里面含高级脂肪酸的钠盐,这种脂肪酸的钠盐水解后会呈现出碱性,这样就可以达到消除痛痒的功效。 2.洗衣粉湿涂:用清水先把蚊虫叮咬位置洗净,但是不要擦干,接下来可以用一湿手指头蘸一点洗衣粉涂于被蚊虫叮咬的位置,这样可以快速的止痒且红肿很快消失,待红肿消失后要及时的把身上的洗衣粉洗掉。 3.用大蒜涂擦:可以先把打算切成片,然后在被蚊虫叮咬的位置进行涂擦,这样可以达到很好的止痛去痒消炎作用;即使被咬的位置已经成大包或发炎溃烂,都可以尝试用大蒜擦,一般12小时后即可消炎去肿。 怎样防蚊虫叮咬?上面的这些驱蚊高招大家要好好学习一下,秋季蚊虫依然很多,大家巧妙驱蚊,拉开你与蚊虫的距离。 ‍‍

5,如何使用python解决网站的反爬虫

1、从用户请求的Headers反爬虫是最常见的反爬虫策略。
伪装header。很多网站都会对Headers的User-Agent进行检测,还有一部分网站会对Referer进行检测(一些资源网站的防盗链就是检测Referer)。如果遇到了这类反爬虫机制,可以直接在爬虫中添加Headers,将浏览器的User-Agent复制到爬虫的Headers中;或者将Referer值修改为目标网站域名[评论:往往容易被忽略,通过对请求的抓包分析,确定referer,在程序中模拟访问请求头中添加]。对于检测Headers的反爬虫,在爬虫中修改或者添加Headers就能很好的绕过。
2、基于用户行为反爬虫
还有一部分网站是通过检测用户行为,例如同一IP短时间内多次访问同一页面,或者同一账户短时间内多次进行相同操作。[这种防爬,需要有足够多的ip来应对]
(1)、大多数网站都是前一种情况,对于这种情况,使用IP代理就可以解决。可以专门写一个爬虫,爬取网上公开的代理ip,检测后全部保存起来。有了大量代理ip后可以每请求几次更换一个ip,这在requests或者urllib中很容易做到,这样就能很容易的绕过第一种反爬虫。
编写爬虫代理:
步骤:
1.参数是一个字典{'类型':'代理ip:端口号'}
proxy_support=urllib.request.ProxyHandler({})
2.定制、创建一个opener
opener=urllib.request.build_opener(proxy_support)
3a.安装opener
urllib.request.install_opener(opener)
3b.调用opener
opener.open(url)
用大量代理随机请求目标网站,应对反爬虫

6,python爬虫中怎么写反爬虫

1、通过UA判断:UA是UserAgent,是要求浏览器的身份标志。
UA是UserAgent,是要求浏览器的身份标志。反爬虫机制通过判断访问要求的头部没有UA来识别爬虫,这种判断方法水平很低,通常不作为唯一的判断标准。反爬虫非常简单,可以随机数UA。
2、通过Cookie判定:Cookie是指会员帐户密码登录验证
Cookie是指会员帐户密码登录验证,通过区分该帐户在短时间内爬行的频率来判断。这种方法的反爬虫也很困难,需要多账户爬行。
3、通过访问频率判定
爬虫类经常在短时间内多次访问目标网站,反爬虫类机制可以通过单个IP访问的频率来判断是否是爬虫类。这样的反爬方式难以反制,只能通过更换IP来解决。
4、通过验证码判定
验证码是反爬虫性价比高的实施方案。反爬虫通常需要访问OCR验证码识别平台,或者使用TesseractOCR识别,或者使用神经网络训练识别验证码。
5、动态性页面加载
使用动态加载的网站通常是为了方便用户点击和查看,爬虫无法与页面互动,这大大增加了爬虫的难度。
一般情况下,用户对网站进行信息爬取时,都要受到“爬虫”的约束,使用户在获取信息时受到一定的阻碍

7,windows服务器怎么反爬虫

手工识别和拒绝爬虫的访问

相当多的爬虫对网站会造成非常高的负载,因此识别爬虫的来源IP是很容易的事情。最简单的办法就是用netstat检查80端口的连接:
netstat -nt | grep youhostip:80 | awk '{print $5}' | awk -F":" '{print $1}'| sort | uniq -c | sort -r -n


这行shell可以按照80端口连接数量对来源IP进行排序,这样可以直观的判断出来网页爬虫。一般来说爬虫的并发连接非常高。

如果使用lighttpd做Web
Server,那么就更简单了。lighttpd的mod_status提供了非常直观的并发连接的信息,包括每个连接的来源IP,访问的URL,连接状
态和连接时间等信息,只要检查那些处于handle-request状态的高并发IP就可以很快确定爬虫的来源IP了。

拒绝爬虫请求既可以通过内核防火墙来拒绝,也可以在web server拒绝,比方说用iptables拒绝:
iptables -A INPUT -i eth0 -j DROP -p tcp --dport 80 -s 84.80.46.0/24


直接封锁爬虫所在的C网段地址。这是因为一般爬虫都是运行在托管机房里面,可能在一个C段里面的多台服务器上面都有爬虫,而这个C段不可能是用户宽带上网,封锁C段可以很大程度上解决问题。

通过识别爬虫的User-Agent信息来拒绝爬虫

有很多爬虫并不会以很高的并发连接爬取,一般不容易暴露自己;有些爬虫的来源IP分布很广,很难简单的通过封锁IP段地址来解决问题;另外还有很多
各种各样的小爬虫,它们在尝试Google以外创新的搜索方式,每个爬虫每天爬取几万的网页,几十个爬虫加起来每天就能消耗掉上百万动态请求的资源,由于
每个小爬虫单独的爬取量都很低,所以你很难把它从每天海量的访问IP地址当中把它准确的挖出来。

这种情况下我们可以通过爬虫的User-Agent信息来识别。每个爬虫在爬取网页的时候,会声明自己的User-Agent信息,因此我们就可以
通过记录和分析User-Agent信息来挖掘和封锁爬虫。我们需要记录每个请求的User-Agent信息,对于Rails来说我们可以简单的在
app/controllers/application.rb里面添加一个全局的before_filter,来记录每个请求的User-Agent信
息:
logger.info "HTTP_USER_AGENT #{request.env["HTTP_USER_AGENT"]}"


然后统计每天的production.log,抽取User-Agent信息,找出访问量最大的那些User-Agent。要注意的是我们只关注那
些爬虫的User-Agent信息,而不是真正浏览器User-Agent,所以还要排除掉浏览器User-Agent,要做到这一点仅仅需要一行
shell:
grep HTTP_USER_AGENT production.log | grep -v -E 'MSIE|Firefox|Chrome|Opera|Safari|Gecko' | sort | uniq -c | sort -r -n | head -n 100 > bot.log


统计结果类似这样:
57335 HTTP_USER_AGENT Baiduspider+(+http://www.baidu.com/search/spider.htm)
56639 HTTP_USER_AGENT Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)
42610 HTTP_USER_AGENT Mediapartners-Google
19131 HTTP_USER_AGENT msnbot/2.0b (+http://search.msn.com/msnbot.htm)


从日志就可以直观的看出每个爬虫的请求次数。要根据User-Agent信息来封锁爬虫是件很容易的事情,lighttpd配置如下:
$HTTP["useragent"] =~ "qihoobot|^Java|Commons-HttpClient|Wget|^PHP|Ruby|Python" {
url.rewrite = ( "^/(.*)" => "/crawler.html" )
}


使用这种方式来封锁爬虫虽然简单但是非常有效,除了封锁特定的爬虫,还可以封锁常用的编程语言和HTTP类库的User-Agent信息,这样就可以避免很多无谓的程序员用来练手的爬虫程序对网站的骚扰。

还有一种比较常见的情况,就是某个搜索引擎的爬虫对网站爬取频率过高,但是搜索引擎给网站带来了很多流量,我们并不希望简单的封锁爬虫,仅仅是希望降低爬虫的请求频率,减轻爬虫对网站造成的负载,那么我们可以这样做:
$HTTP["user-agent"] =~ "Baiduspider+" {
connection.delay-seconds = 10
}


对百度的爬虫请求延迟10秒钟再进行处理,这样就可以有效降低爬虫对网站的负载了。

通过网站流量统计系统和日志分析来识别爬虫

有些爬虫喜欢修改User-Agent信息来伪装自己,把自己伪装成一个真实浏览器的User-Agent信息,让你无法有效的识别。这种情况下我们可以通过网站流量系统记录的真实用户访问IP来进行识别。

主流的网站流量统计系统不外乎两种实现策略:一种策略是在网页里面嵌入一段js,这段js会向特定的统计服务器发送请求的方式记录访问量;另一种策
略是直接分析服务器日志,来统计网站访问量。在理想的情况下,嵌入js的方式统计的网站流量应该高于分析服务器日志,这是因为用户浏览器会有缓存,不一定
每次真实用户访问都会触发服务器的处理。但实际情况是,分析服务器日志得到的网站访问量远远高于嵌入js方式,极端情况下,甚至要高出10倍以上。

现在很多网站喜欢采用awstats来分析服务器日志,来计算网站的访问量,但是当他们一旦采用Google
Analytics来统计网站流量的时候,却发现GA统计的流量远远低于awstats,为什么GA和awstats统计会有这么大差异呢?罪魁祸首就是
把自己伪装成浏览器的网络爬虫。这种情况下awstats无法有效的识别了,所以awstats的统计数据会虚高。

其实作为一个网站来说,如果希望了解自己的网站真实访问量,希望精确了解网站每个频道的访问量和访问用户,应该用页面里面嵌入js的方式来开发自己
的网站流量统计系统。自己做一个网站流量统计系统是件很简单的事情,写段服务器程序响应客户段js的请求,分析和识别请求然后写日志的同时做后台的异步统
计就搞定了。

通过流量统计系统得到的用户IP基本是真实的用户访问,因为一般情况下爬虫是无法执行网页里面的js代码片段的。所以我们可以拿流量统计系统记录的
IP和服务器程序日志记录的IP地址进行比较,如果服务器日志里面某个IP发起了大量的请求,在流量统计系统里面却根本找不到,或者即使找得到,可访问量
却只有寥寥几个,那么无疑就是一个网络爬虫。

分析服务器日志统计访问最多的IP地址段一行shell就可以了:
grep Processing production.log | awk '{print $4}' | awk -F'.' '{print $1"."$2"."$3".0"}' | sort | uniq -c | sort -r -n | head -n 200 > stat_ip.log


然后把统计结果和流量统计系统记录的IP地址进行对比,排除真实用户访问IP,再排除我们希望放行的网页爬虫,比方Google,百度,微软msn爬虫等等。最后的分析结果就就得到了爬虫的IP地址了。以下代码段是个简单的实现示意:
whitelist = []
IO.foreach("#{RAILS_ROOT}/lib/whitelist.txt") { |line| whitelist << line.split[0].strip if line }

realiplist = []
IO.foreach("#{RAILS_ROOT}/log/visit_ip.log") { |line| realiplist << line.strip if line }

iplist = []
IO.foreach("#{RAILS_ROOT}/log/stat_ip.log") do |line|
ip = line.split[1].strip
iplist 3000 && !whitelist.include?(ip) && !realiplist.include?(ip)
end

Report.deliver_crawler(iplist)


分析服务器日志里面请求次数超过3000次的IP地址段,排除白名单地址和真实访问IP地址,最后得到的就是爬虫IP了,然后可以发送邮件通知管理员进行相应的处理。

网站的实时反爬虫防火墙实现策略

通过分析日志的方式来识别网页爬虫不是一个实时的反爬虫策略。如果一个爬虫非要针对你的网站进行处心积虑的爬取,那么他可能会采用分布式爬取策略,
比方说寻找几百上千个国外的代理服务器疯狂的爬取你的网站,从而导致网站无法访问,那么你再分析日志是不可能及时解决问题的。所以必须采取实时反爬虫策
略,要能够动态的实时识别和封锁爬虫的访问。

要自己编写一个这样的实时反爬虫系统其实也很简单。比方说我们可以用memcached来做访问计数器,记录每个IP的访问频度,在单位时间之内,
如果访问频率超过一个阀值,我们就认为这个IP很可能有问题,那么我们就可以返回一个验证码页面,要求用户填写验证码。如果是爬虫的话,当然不可能填写验
证码,所以就被拒掉了,这样很简单就解决了爬虫问题。

用memcache记录每个IP访问计数,单位时间内超过阀值就让用户填写验证码,用Rails编写的示例代码如下:
ip_counter = Rails.cache.increment(request.remote_ip)
if !ip_counter
Rails.cache.write(request.remote_ip, 1, :expires_in => 30.minutes)
elsif ip_counter > 2000
render :template => 'test', :status => 401 and return false
end


这段程序只是最简单的示例,实际的代码实现我们还会添加很多判断,比方说我们可能要排除白名单IP地址段,要允许特定的User-Agent通过,要针对登录用户和非登录用户,针对有无referer地址采取不同的阀值和计数加速器等等。

此外如果分布式爬虫爬取频率过高的话,过期就允许爬虫再次访问还是会对服务器造成很大的压力,因此我们可以添加一条策略:针对要求用户填写验证码的
IP地址,如果该IP地址短时间内继续不停的请求,则判断为爬虫,加入黑名单,后续请求全部拒绝掉。为此,示例代码可以改进一下:
before_filter :ip_firewall, :except => :test
def ip_firewall
render :file => "#{RAILS_ROOT}/public/403.html", :status => 403 if BlackList.include?(ip_sec)
end


我们可以定义一个全局的过滤器,对所有请求进行过滤,出现在黑名单的IP地址一律拒绝。对非黑名单的IP地址再进行计数和统计:
ip_counter = Rails.cache.increment(request.remote_ip)
if !ip_counter
Rails.cache.write(request.remote_ip, 1, :expires_in => 30.minutes)
elsif ip_counter > 2000
crawler_counter = Rails.cache.increment("crawler/#{request.remote_ip}")
if !crawler_counter
Rails.cache.write("crawler/#{request.remote_ip}", 1, :expires_in => 10.minutes)
elsif crawler_counter > 50
BlackList.add(ip_sec)
render :file => "#{RAILS_ROOT}/public/403.html", :status => 403 and return false
end
render :template => 'test', :status => 401 and return false
end


如果某个IP地址单位时间内访问频率超过阀值,再增加一个计数器,跟踪他会不会立刻填写验证码,如果他不填写验证码,在短时间内还是高频率访问,就
把这个IP地址段加入黑名单,除非用户填写验证码激活,否则所有请求全部拒绝。这样我们就可以通过在程序里面维护黑名单的方式来动态的跟踪爬虫的情况,甚
至我们可以自己写个后台来手工管理黑名单列表,了解网站爬虫的情况。

关于这个通用反爬虫的功能,我们开发一个开源的插件:https://github.com/csdn-dev/limiter

这个策略已经比较智能了,但是还不够好!我们还可以继续改进:

1、用网站流量统计系统来改进实时反爬虫系统

还记得吗?网站流量统计系统记录的IP地址是真实用户访问IP,所以我们在网站流量统计系统里面也去操作memcached,但是这次不是增加计数
值,而是减少计数值。在网站流量统计系统里面每接收到一个IP请求,就相应的cache.decrement(key)。所以对于真实用户的IP来说,它
的计数值总是加1然后就减1,不可能很高。这样我们就可以大大降低判断爬虫的阀值,可以更加快速准确的识别和拒绝掉爬虫。

2、用时间窗口来改进实时反爬虫系统

爬虫爬取网页的频率都是比较固定的,不像人去访问网页,中间的间隔时间比较无规则,所以我们可以给每个IP地址建立一个时间窗口,记录IP地址最近
12次访问时间,每记录一次就滑动一次窗口,比较最近访问时间和当前时间,如果间隔时间很长判断不是爬虫,清除时间窗口,如果间隔不长,就回溯计算指定时
间段的访问频率,如果访问频率超过阀值,就转向验证码页面让用户填写验证码。

最终这个实时反爬虫系统就相当完善了,它可以很快的识别并且自动封锁爬虫的访问,保护网站的正常访问。不过有些爬虫可能相当狡猾,它也许会通过大量
的爬虫测试来试探出来你的访问阀值,以低于阀值的爬取速度抓取你的网页,因此我们还需要辅助第3种办法,用日志来做后期的分析和识别,就算爬虫爬的再慢,
它累计一天的爬取量也会超过你的阀值被你日志分析程序识别出来。

8,如何应对网站反爬虫策略?如何高效地爬大量数据

一般有一下几种

一些常用的方法
IP代理

对于IP代理,各个语言的Native Request API都提供的IP代理响应的API, 需要解决的主要就是IP源的问题了.
网络上有廉价的代理IP(1元4000个左右), 我做过简单的测试, 100个IP中, 平均可用的在40-60左右, 访问延迟均在200以上.
网络有高质量的代理IP出售, 前提是你有渠道.
因为使用IP代理后, 延迟加大, 失败率提高, 所以可以将爬虫框架中将请求设计为异步, 将请求任务加入请求队列(RabbitMQ,Kafka,Redis), 调用成功后再进行回调处理, 失败则重新加入队列. 每次请求都从IP池中取IP, 如果请求失败则从IP池中删除该失效的IP.
Cookies

有一些网站是基于cookies做反爬虫, 这个基本上就是如 @朱添一 所说的, 维护一套Cookies池
注意研究下目标网站的cookies过期事件, 可以模拟浏览器, 定时生成cookies
限速访问

像开多线程,循环无休眠的的暴力爬取数据, 那真是分分钟被封IP的事, 限速访问实现起来也挺简单(用任务队列实现), 效率问题也不用担心, 一般结合IP代理已经可以很快地实现爬去目标内容.

一些坑


大批量爬取目标网站的内容后, 难免碰到红线触发对方的反爬虫机制. 所以适当的告警提示爬虫失效是很有必有的.
一般被反爬虫后, 请求返回的HttpCode为403的失败页面, 有些网站还会返回输入验证码(如豆瓣), 所以检测到403调用失败, 就发送报警, 可以结合一些监控框架, 如Metrics等, 设置短时间内, 告警到达一定阀值后, 给你发邮件,短信等.
当然, 单纯的检测403错误并不能解决所有情况. 有一些网站比较奇葩, 反爬虫后返回的页面仍然是200的(如去哪儿), 这时候往往爬虫任务会进入解析阶段, 解析失败是必然的. 应对这些办法, 也只能在解析失败的时候, 发送报警, 当告警短时间到达一定阀值, 再触发通知事件.
当然这个解决部分并不完美, 因为有时候, 因为网站结构改变, 而导致解析失败, 同样回触发告警. 而你并不能很简单地区分, 告警是由于哪个原因引起的.