上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)