1. Headers

从用户的 headers 进行反爬是最常见的反爬虫策略。Headers(上一讲中已经提及) 是一种区分浏览器行为和机器行为中最简单的方法,还有一些网站会对 Referer (上级链接)进行检测(机器行为不太可能通过链接跳转实现)从而实现爬虫。
相应的解决措施:通过审查元素或者开发者工具获取相应的 headers 然后把相应的 headers 传输给 python 的 requests,这样就能很好地绕过。

2. IP 限制

一些网站会根据你的 IP 地址访问的频率,次数进行反爬。也就是说如果你用单一的 IP 地址访问频率过高,那么服务器会在短时间内禁止这个 IP 访问。
相应的解决措施:构造自己的 IP 代理池,然后每次访问时随机选择代理(但一些 IP 地址不是非常稳定,需要经常检查更新)。

3. UA 限制

UA 是用户访问网站时候的浏览器标识,其反爬机制与 ip 限制类似。
相应的解决措施:构造自己的 UA 池,每次 python 做 requests 访问时随机挂上 UA 标识,更好地模拟浏览器行为。当然如果反爬对时间还有限制的话,可以在 requests 设置 timeout(最好是随机休眠,这样会更安全稳定,time.sleep())。

4. 验证码反爬虫或者模拟登陆

验证码:这个办法也是相当古老并且相当的有效果,如果一个爬虫要解释一个验证码中的内容,这在以前通过简单的图像识别是可以完成的,但是就现在来讲,验证码的干扰线,噪点都很多,甚至还出现了人类都难以认识的验证码(~~~~~~~~)。
相应的解决措施:验证码识别的基本方法:截图,二值化、中值滤波去噪、分割、紧缩重排(让高矮统一)、字库特征匹配识别。(python 的 PIL 库或者其他)模拟登陆(例如知乎等):用好 python requests 中的 session(下面几行代码实现了最简单的 163 邮箱的登陆,其实原理是类似的)。

import requests
s = requests.session()
login_data={"account" : " ", "password" : " "}
res=s.post("http://mail.163.com/", login_data)

5. Ajax 动态加载

网页的不希望被爬虫拿到的数据使用 Ajax 动态加载,这样就为爬虫造成了绝大的麻烦,如果一个爬虫不具备 js 引擎,或者具备 js 引擎,但是没有处理 js 返回的方案,或者是具备了 js 引擎,但是没办法让站点显示启用脚本设置。基于这些情况,ajax 动态加载反制爬虫还是相当有效的。
Ajax 动态加载的工作原理是:从网页的 url 加载网页的源代码之后,会在浏览器里执行 JavaScript程序。这些程序会加载出更多的内容,并把这些内容传输到网页中。这就是为什么有些网页直接爬它的URL 时却没有数据的原因。
相应的解决措施:若使用审查元素分析”请求“对应的链接(方法:右键→审查元素→Network→清空,点击”加载更多“,出现对应的 GET 链接寻找 Type 为 text/html 的,点击,查看 get 参数或者复制 Request URL),循环过程。如果“请求”之前有页面,依据上一步的网址进行分析推导第 1 页。以此类推,抓取抓 Ajax 地址的数据。对返回的 json 使用 requests 中的 json 进行解析,使用 eval()转成字典处理(上一讲中的 fiddler 可以格式化输出 json 数据。

6. cookie 限制

一次打开网页会生成一个随机 cookie,如果再次打开网页这个 cookie 不存在,那么再次设置,第三次打开仍然不存在,这就非常有可能是爬虫在工作了。
相应的解决措施:在 headers 挂上相应的 cookie 或者根据其方法进行构造(例如从中选取几个字母进行构造)。如果过于复杂,可以考虑使用 selenium 模块(可以完全模拟浏览器行为)。