1.3 反网络爬虫技术及解决方案
1.网络爬虫的危害
1)网络爬虫的影响
性能骚扰:Web服务器默认接收人类访问,受限于编辑水平和目的,网络爬虫将会为Web服务器带来巨大的资源开销。
法律风险:服务器上的数据有产权归属,网络爬虫获取数据后牟利将带来法律风险。
2)侵犯用户隐私和知识产权
互联网用户的隐私、公司的商业机密,在大数据时代极易被网络爬虫窃取,相关的网络安全技术人员得采用必要的手段反爬,例如cookie反爬机制等,避免因商业机密的泄露而造成的经济损失。
客户端向服务器发送请求,请求头里面携带cookie信息,服务器检查cookie时效,如果cookie没有过期,则返回响应的请求数据。携带cookie发送请求如图1-8所示。
图1-8 携带cookie发送请求
2.反爬技术
1)验证码(Verification Code)
验证码是一种直接而有效的方式,用来判断请求方是否是人类。从一开始的简短易懂数字验证码,到后来的中文验证码,再到现在的图片验证码,验证码是应用层最普遍、最核心的网络爬虫对抗技术。关于一些简短易懂的数字、字母验证码,随着近几年机器学习、神经网络的快速发展,已经近乎于失效。有人训练出基于LSTM的模型能够达到90%的识别正确率。关于图片验证码,也有专门用人工打码平台来处理,所以仅靠验证码很难有效处理网络爬虫问题,过多的验证码也会使正常用户的体验受到影响。简单验证码如图1-9所示。
图1-9 简单验证码
2)Ajax
Ajax技术在2004年左右开始飞速发展,成为主流的浏览器端技术,也使得网络爬虫从静态网络爬虫转化为动态网络爬虫。至此,抓取网站的数据不再是简短易懂的一个HTTP请求,解析HTML页面就能够实现的。大量的网站使用Ajax技术来构建网站,也使得解析数据变得相对没那么容易获取,因为在网站完全不设防的情况下,网络爬虫也不单需要解析HTML页面,同时还需要解析Ajax接口返回的数据,代码如下:
function get(){ $.ajax({ type:"OPTIONS", url:"/", compelete:function(d){ var t = d.getResponseHeader("Date"); var timestamp = Date.parse(t); var times = timestamp/1000; var dateNow = formateDate(new Date(timestamp)); liveNow(dateNow,times); } }); };
3)数据混淆
网络爬虫的目标是抓取到有用的数据。对于许多应用来说,获取错误的数据往往比获取不到数据更加致命。这个思路的核心便是,当网络爬虫命中反爬规则之后,使用错误的数据取代正确的数据返回给网络爬虫,这种方式十分隐蔽,又能够对敌手造成足够的麻烦,也相当有效。
4)经由User-Agent控制访问
不管是浏览器还是网络爬虫程序,在向服务器发起网络请求时,都会发过去一个头文件headers,就像百度的请求头,大多数的字段都是浏览器向服务器表明身份用的,对于网络爬虫程序来说,最需要注意的字段便是User-Agent。很多网站都会创建User-Agent白名单,只有属于正常范围的User-Agent才能够正常访问,代码如下:
#导入requests库 import requests #定义获得URL的函数 def get_html(url): try: #请求获得URL,超时时间30s r=requests.get(url,timeout=30) #状态响应 r.raise_for_status() #转换成UTF-8的编码格式 r.encoding = r.apparent_encoding #返回响应的文本数据 return r.text except: #运行错误返回值 return "Something Wrong!" #输出获得URL print(get_html('https://www.baidu.com'))
5)经由IP地址限制反网络爬虫
假如一个固定的IP地址在短暂的时间内快速大量地访问一个网站,那么自然会引起注意。管理员能够经由一些手段禁止该IP地址访问,网络爬虫程序则无法工作。
解决方法:比较成熟的方式是IP地址代理池,简而言之,便是经由IP地址代理,从不同的IP地址进行访问,这样就无法限制该IP地址的访问。但是IP地址代理的获得本身便是一个很麻烦的事情,虽然网上有免费和付费的,但是质量参差不齐。假如是企业需要,能够经由自己购买集群云服务来自建代理池。这里实现一个简短易懂的代理转换,代码如下:
import random def get_proxy(): ''' 简答模拟代理池 返回一个字典类型的键值对, ''' proxy = ["http://116.211.143.11:80", "http://183.1.86.235:8118", "http://183.32.88.244:808", "http://121.40.42.35:9999", "http://222.94.148.210:808"] fakepxs = {} fakepxs['http'] = proxy[random.randint(0, len(proxy)-1)] return fakepxs
6)经由Robots协议限制网络爬虫
世界上将网络爬虫做得最大、最好的便是Google。搜索引擎本身便是一个超级大的网络爬虫,Google开发出来的网络爬虫24小时不中断地在网上抓取着新的信息,并返回给数据库,但是这些搜索引擎的网络爬虫都遵循着Robots协议。
Robots协议是一种寄放于网站根目录下的ASCII编码的文本文件,它往往通知网络搜索引擎的漫游器,该网站中的哪些内容是不应被搜索引擎的漫游器获得的,哪些是能够被漫游器获得的。
Robots协议并不是一个标准,而只是约定俗成的,所以并不能保护网站的隐私。注意,Robots协议是用字符串比较来确定是否获得URL,所以目录结尾有与没有斜杠“/”表示的是不同的URL。Robots协议允许使用类似'Disallow:*.gif '这样的通配符。
这实际上只是一个自由协议,遵循与否,都在于网络爬虫的编辑者。来看一下京东的Robots协议,代码如下:
User-agent: * Disallow: /?* Disallow: /pop/*.html Disallow: /pinpai/*.html?* User-agent: EtaoSpider Disallow: / User-agent: HuihuiSpider Disallow: / User-agent: GwdangSpider Disallow: / User-agent: WochachaSpider Disallow: /
能够看到,京东的Robots协议里确定地指出四个“User-Agent”是禁止访问的,事实上,这四个User-Agent也是四个臭名远扬的恶性网络爬虫。当然有种情况是例外的,例如网络爬虫获得网页的速度和人类浏览网页是差不多的,这并不会给服务器造成太大的性能损失,在这种情况下是可以不用遵守Robots协议的。