爬虫是模拟人的浏览访问行为,进行数据的批量抓取。当抓取数据量逐渐增大时,会被访问的服务器造成很大的压力,甚至有可能会崩溃。换句话说,服务器不喜欢有人抓取自己的数据,那么网站方面就会针对这些爬虫者,采取一些反爬策略。
服务器第一种识别爬虫的方式就是通过检查连接的useragent来识别到底是浏览器访问,还是代码访问。如果是代码访问的话,访问量增大时,服务器就会直接封掉来访IP。
那么应对这种初级的反爬机制,我们应该采取何种措施?
在进行访问时,我们在开发者环境下不仅可以找到URL、Form Data、还可以在request headers中构造浏览器的请求头,封装自己。服务器识别浏览器的访问方式就是判断keywor是否为Request headers 下的User-Agent。我们只需要构造这个请求头的参数。创建请求头部信息即可,代码如下:
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64)'AppleWebKit/537.36 (KHTML,like Gecko) Chrome/43.0.2357.124 Safari/537.36'}
response =requests.get(url,headers=headers)
很多人会认为修改User-Agent太简单,确实很简单,但正常人一秒看一个图,而爬虫一秒可以看几百张图,那么服务器的压力必然增大。就是说,如果在一个IP下批量访问下载图片,这个行为不符合正常人类的行为,肯定要被封IP。其原理也很简单,就是统计每个IP的访问频率,此频率超过阀值,就会返回一个验证码,如果真的是用户访问的话,用户就会填写,然后继续访问,如果是代码访问的话,就会被封IP。
这个问题的解决方法有两个,第一个就是常用的增设延时,每三秒抓取一次,代码如下:
import time
time.sleep(3)
其实,还有一个更重要的方法,那就是从本质解决问题。
不管如何访问,服务器的目的就是查出哪些为代码访问,然后封锁IP。解决办法:为避免被封锁IP,在数据采集之前经常会使用代理。当然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)