Python网络爬虫技术与应用
上QQ阅读APP看书,第一时间看更新

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协议的。