爬虫(一)反爬虫机制
爬虫用久了,总是会被封的。——鲁迅
有些网站,特别是一些陈年老站,没有做过反爬虫机制的,我们可以尽情地爬,愉快地爬,把它们的底裤。。数据全都爬下来。最多出于情怀考虑,我们爬慢一点,不给它的服务器太大压力。但是对于有反爬虫机制的网站,我们不能这样。
u-a校验
最简单的反爬虫机制应该是u-a校验了。浏览器在发送请求的时候,会附带一部分浏览器及当前系统环境的参数给服务器,这部分数据放在http请求的header部分。
我们要做的就是通过requests库设置我们的爬虫u-a。一般来说第三方库发送请求会有一个默认的u-a,如果我们直接用这个u-a,就等于直接告诉别人,我就是爬虫,快来禁我!有些网站如果不设置u-a是上不去的。requests库设置u-a也很简单。
def download_page(url): headers={ 'user-agent': 'mozilla/5.0 (macintosh; intel mac os x 10_11_2) applewebkit/537.36 (khtml, like gecko) chrome/47.0.2526.80 safari/537.36' } data = requests.get(url,headers=headers) return data
当然我们如果反复访问同一个网站,却一直使用同一个u-a,也是不行的。可以弄一个u-a池,然后每次访问时都从中随机抽取一个u-a。
访问频率限制
一般来说,真人浏览网页的速度相对程序是很慢的,但是爬虫不一样。如果有人一秒钟访问了100次同一个网站,那几乎毫无疑问,这就是爬虫。一般来说,面对这种情况,我们有两种办法来解决。
第一种办法很简单。既然访问太快会被禁,那我访问慢点就好了啊。我们可以在每次访问完网站之后就设置一个time.sleep,限制访问速度。最好是用一台机器从慢到快访问,找到被封的阈值,然后以稍微低一点的速度进行访问。
第二种方法就是换ip。网站一般是通过ip来识别访问者的身份的,所以我们只要不停地更换ip,就可以伪装成不同的人。同一个ip一秒钟访问了100次很不正常,但是100个ip一秒钟访问100次就很正常了。那么我们如何更换ip呢?其实也不用真正更换我们的ip,而是通过代理ip转发我们的请求。不少网站提供了很多免费的代理ip,我们只要把它们爬下来,以备不时之需。不过很多代理ip寿命都不长,所以需要时常进行检测。requests设置代理ip也很简单。
proxies = {"http": "http://42.228.3.155:8080",} requests.get(url, proxies=proxies)
验证码
有些网站,不管你做什么,登录还是访问页面,都需要输入验证码进行验证。在这种情况下,我们必须识别出验证码,才能爬取网站内容。有些简单的字母加数字的验证码可以用ocr进行识别,其他一些滑动验证之类的就需要其他的技巧来破解,这里就不详谈了。
登录验证
登录很多时候是服务于网站功能的,反爬虫不过是顺带的目的。我们可以通过按f12检查开发者工具来看网站在登录时会发送什么数据,然后通过requests的相关函数模拟登陆。如果以后有时间会专门写一篇文章来详细说说。
上一篇: 为什么所有王朝中只有清朝能对蒙古草原进行有效控制?
下一篇: 从“最简真分数的个数”谈起