常见的反爬虫技术

爬虫和反爬的对抗一直在进行着…为了帮助更好的进行爬虫行为以及反爬,今天就来介绍一下网页开发者常用的反爬手段。

通过robots.txt来限制爬虫:

爬虫都遵守着一个协议:robots.txt
robots.txt(统一小写)是一种存放于网站根目录下的ASCII编码的文本文件,它通常告诉网络搜索引擎的漫游器(又称网络蜘蛛),此网站中的哪些内容是不应被搜索引擎的漫游器获取的,哪些是可以被漫游器获取的。因为一些系统中的URL是大小写敏感的,所以robots.txt的文件名应统一为小写。robots.txt应放置于网站的根目录下。如果想单独定义搜索引擎的漫游器访问子目录时的行为,那么可以将自定的设置合并到根目录下的robots.txt,或者使用robots元数据(Metadata,又称元数据)。
robots.txt协议并不是一个规范,而只是约定俗成的,所以并不能保证网站的隐私。注意robots.txt是用字符串比较来确定是否获取URL,所以目录末尾有与没有斜杠“/”表示的是不同的URL。robots.txt允许使用类似”Disallow: *.gif”这样的通配符[1][2]。
解决方法:

  • 这实际上只是一个”君子协议“,遵守与否,都在于爬虫的编写者。
通过User-Agent来控制访问:

无论是浏览器还是爬虫程序,在向服务器发起网络请求的时候,都会发过去一个头文件:headers 这里面的大多数的字段都是浏览器向服务器”表明身份“用的
对于爬虫程序来说,最需要注意的字段就是:User-Agent
很多网站都会建立 user-agent白名单,只有属于正常范围的user-agent才能够正常访问。
解决方法:

  • 在发送请求时使用该网站user-agent白名单的的UA

可以使用python的第三方模块fake_useragent 随机生成UA,需手动安装

>>> from fake_useragent import FakeUserAgent
>>> ua = FakeUserAgent()
>>> ua.random
'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1866.237 Safari/537.36'
验证码:

最为经典的反爬虫策略当属“验证码”了。因为验证码是图片,用户登录时只需输入一次便可登录成功,而我们程序抓取数据过程中,需要不断的登
录,比如我们需要抓取1000个用户的个人信息,则需要填1000次验证码,而手动输入验证码是不现实的,所以验证码的出现曾经难倒了很多网络爬虫工程师。
解决方法:

  • 分析网站验证码机制,从网站后台或者前端获取验证码(文本形式),该方法只适用于少量网站,因为一般验证码我们很难拿到。
  • 利用图像识别技术,识别验证码文本(例如最近比较火的深度学习Tensorflow等)。
  • 往往一些网站不只有pc端,还有手机端网站,很有可能手机端是不包含验证码的。所以不妨试试手机端网站,也许会有意外收获
IP限制:

另外一种麻烦的反爬虫策略当属封ip和封账号了。本人初期曾经用一台机器抓取拉钩,导致短时间内账号被封,IP被封,所以遇到类似问题一定要多加小心。
解决方法:

  • 最简单的解决办法:限制程序抓取频率,每隔几秒登录一次(如果对抓取数量没有要求,则可以采用这种方法,如果想抓取大量数据,还不得抓取到猴年马月啊)。
  • 既然封账号封IP,那我就用多个账号、多台机器抓取呗,既解决了反爬虫问题,也相当于做了分流处理,降低单台机器带宽压力。
  • 事实证明,有些网站即使我们采用了1)2)方法,还是会被封,这种情况下我们只能去抓取代理IP了,可以写一个专门的爬虫程序用来抓取代理,用这些代理去抓取我们想要的数据。到此为止,基本上封账号、封IP的问题就可以解决了。

通过cookie限制抓取信息,比如我们模拟登陆之后,想拿到登陆之后某页面信息,千万不要以为模拟登陆之后就所有页面都可以抓了,有时候还需要请求一些中间页面拿到特定cookie,然后才可以抓到我们需要的页面。
解决方法:

  • 通过浏览器的F12查看器,观察具体整个过程都请求了哪些URL(主要包括HTML、JS、XHR),挨个试,试到成功为止。
JS渲染:

采用JS渲染页面。什么意思呢,就是返回的页面并不是直接请求得到,而是有一部分由JS操作DOM得到,所以那部分数据我们也拿不到咯。
解决方法:

  • 可以使用Phantomjs模拟浏览器请求返回渲染完JS的页面
  • 通过抓包抓取JS渲染的数据(不推荐)

你可能感兴趣的:(爬虫(urllib))