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

1.2 网络爬虫的攻防战

网络爬虫是模仿人的浏览访问行为,进行数据的批量抓取。当抓取数据量慢慢增大时,会对被访问的服务器造成很大的压力,甚至有可能会崩溃。服务器第一种识别网络爬虫的方式便是经由检查连接的用户代理(User-Agent)来识别到底是浏览器访问,还是代码访问。假如是代码访问,当访问量增大时,服务器就会直接封掉来访IP地址。

在进行访问时,在开发者环境下不仅能够找到URL、FormData,还能够在requests传入headers中构造浏览器的请求头封装,只需要构造这个请求头的参数,创建请求头部信息便可,代码如下:

    import requests
    headers = {
         'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/74.0.3729.157
Safari/537.36',
    }
    #经由requests()方法构造一个请求对象
    url = r'https://www.baidu.com//'
    response = requests.get(url, headers = headers)

很多人会认为修改User-Agent太简短易懂,确实很简短易懂,但正常人一秒看一张图,而网络爬虫一秒能看几百张图,那么服务器的压力必然增大。也就是说,假如在一个IP地址下批量访问下载图片,这个行为不符合正常人类的行为,肯定会被限制。其原理也很简单易懂,便是统计每个IP地址的访问频率,此频率超过阈值,就会返回一个验证码,假如真的是用户访问,用户就会填写,而后继续访问,假如是代码访问,就会被限制。

这个问题的解决方法有两个,第一个便是常用的增设延时,每三秒抓取一次,代码如下:

    import time
    time.sleep(3)

其实,还有一个更重要的方法,那便是从本质解决问题。不管如何访问,服务器的目的都是查出哪些为代码访问,而后加以限制。解决办法如下:为以防无法访问,在数据采集之前经常会使用代理,可以通过设置requests的proxies属性的方式实现。

首先构建自己的代理IP地址池,把其以字典的形式赋值给proxies,而后传输给requests,代码如下:

    proxies = {
       "http":"http://10.10.1.10:3128",
       "https":"http://10.10.1.10:1080",
    }
    response = requests.get(url,proxies=proxies)