0x00 前置

爬虫是个好东西,它可以在有限的时间内帮你获取大量的信息。可是对于有些网站来说,它们并不想自己的信息被爬虫获取,比如一些大型的图片站或者音乐站,它们采取的反爬虫策略会让你的爬虫在爬取信息时跑着跑着就断掉了,报错了,丢失连接之类的,这就很烦,所以我们需要花些精力来应付反爬虫。这方面有本很好的书叫Python网络数据采集。前言的最后放一句别人的话

不要忘记,抓取的瓶颈不在你使用多线程,多进程或者asyncio,主要在对方对你的抓取的容忍程度以及在爬和反爬策略上的博弈的结果。


0x01 常见的几种机制

  • 后台对访问进行统计,如果单个userAgent访问超过阈值,予以封锁。
  • 限制IP访问频率,超过频率就断开连接,甚至直接封掉IP。
  • 验证码识别
  • 针对于cookies
  • 除此之外还有一些更加复杂的机制比如隐藏输入字段、“蜜罐”等,这里不赘述

0x10 应对策略

首先说,被ban应该是常有的事,万全之策是建立一个表标记已经爬过的网页,达到避免重复爬取的过程。(如果有这个条件)


0x11 UA限制

其实不只是User-Agent,所有的http请求头都是可能要注意的。
对于UA来说,你需要建一个UA表,里面存了不同的UA,然后每次从里面选一个来使用,一份简单的示例代码如下

user_agent_list就是你的那个表,这个表里面应该存一些正常的浏览器的UA,像什么Python-urllib/3.4这种UA还是算了吧。
除了UA之外,Referrer,Accept-Language等等请求头里的内容都有可能会被限制,所以需要留意一些


0x12 IP限制

封IP是个比较常见的情况,所以你需要准备一大堆代理IP。关于这个网上有很多代理站,随便搜一发就可以。使用代理的时候要注意一下切换IP的频率。
除此之外,你还可以设置爬取的时间间隔,如果你已经被ban了,就不要傻傻重复试,怎么也得休息一会。一般根据经验来,sleep10秒不够就20秒。

本着 多说无益, show me the code 的精神 扔段代码

大概需要自己弄一个iplist这样


0x13 验证码识别

这个东西大概要用到机器学习或者一些在线的网站…因为各种验证码算法层出不穷的缘故,所以真正的和验证码正面刚是一件很伤的事情。最好还是倾其所有的做好其他的地方,不要让人家弹出验证码让你输入。


0x14 Cookies

个人感觉这是相对简单的一个部分,通过从采集网站生成的Cookie就可以解决绝大多数问题。你可以使用Chrome的EditThisCookie插件来方便你的操作。


0x20 Extend

爬虫与反爬的斗争是永无止境的,在网上看到过很多有趣的反爬虫策略简单提一下。

  • 去哪儿网上页面显示的数字和代码里展示的数字不一样,因为他们对字体进行了置换处理。或者把关键信息以乱码展示,渲染的时候再转化的为可读字符。比如把页面用很多小图片拼起来…
  • Facebook等网站使用的隐含字段策略,会要求你访问时返回一些常规用户不可见的服务器随机生成的数据,如果缺少了这部分信息就会被认为是爬虫。也可以在表单里包含一个具有普通名称的隐含字段,比如username,爬虫只要提交这个字段的值就会被ban

0x30 写在最后

最后闲扯两句。爬虫的核心在应该还是数据结构,并行和抓取策略算法等等。爬虫是门大学问,这里写的很少,毕竟从道德上讲,网站的robots.txt里的内容就是爬虫要绝对遵守的。