关于作者
- 马隆博,Java,Javascript
- Blog: http://mlongbo.com
- E-Mail: mlongbo@gmail.com
- 相关项目: http://gso.mlongbo.com/
- 文章编写于: 2014/12/27
转载请注明出处:
http://mlongbo.com/fight_with_google_captcha/
写过爬虫或搞过代理的朋友应该都知道,google有一个验证码机制用来防止机器人恶意查询. 我们在使用翻墙软件和一些代理软件时也常常会遇到这种需要输入验证码的情况。我在写gso的时候自然也避免不了会遇到这种问题, 那么我都是怎么应对的呢, 稍后我会讲述一些我所用到的一些方法, 也欢迎你来一起探讨.
首先我觉得应该先弄清楚google判断正常用户请求和机器请求的机制是什么, 这样我们才能更好的去应对.
在我查询了大量资料之后发现,大家普遍都认为有以下这几个因素:
- 单IP请求频率;
- userAgent;
- cookie;
不过肯定还有更高级的检测条件,我们猜不到,那就先从上面这三个因素着手。
在写爬虫时,我们应该都知道,持续地向google发送请求,要不了多久就挂了,这时候我们只能减少请求的频率。如果多使用几个userAgent,挂掉的几率又会少一些。我最初就是这样做的,使用了动态的userAgent,即把用户请求过来的userAgent转发给google。这样正常情况下,每天3,4千的查询请求是差不多了。不正常情况就是有人恶意的频繁请求我的服务器。
之后还是挂过几次,不知道怎么回事,只能靠猜。所以又想办法,加上了cookie功能,把google给我的cookie响应给用户,下次用户请求时我再给google。这样好像没太大反应,还是出现了被挂掉的情况。不知道会不会是因为cookie错乱被google发现了(即如果cookie是有序的,cookie1给了a用户,我下次再请求google时应该带着cookie1,这时b用户来了,给了他cookie2,那就变成了下次再请求google应该带着cookie2, 这时候a用户带着cookie1回来了,发送给google的就变成了cookie1而不是cookie2), 如果google有这样的检测机制那我也没办法了。
总之,既然没办法对google来硬的,就只有想办法尽量模拟正常用户请求。说到这里,我还在我的服务器上安装了shadowsocks,自己平时通过他来翻墙使用google的所有服务,尽量让google认为我这个服务器ip是正常的吧。
好了,userAgent和cookie的办法都用上了,那还可以用什么招呢。
我们可以想,google在全世界有那么多ip,我们为什么不多找来一些分担请求呢。我主要找了亚洲几个国家的ip,也尽量少用同机房的ip。 不过还有一个挺费劲的问题就是要对这些ip进行维护,说不好哪天某个ip失效了或者它把我的服务器ip列入黑名单了。我也正在做这一块,完了之后会再跟各位分享。我可以先说一下我的大概思路,有兴趣的同学可以帮忙来写(我的项目是开源的,你可以关注)。然后我说说我的思路:
- 定时从互联网上批量获取ip;
- 检查ip可用性及速度;
- 当某个ip的查询超时出现限定次数后(如10次), 将该ip加入黑名单,不再使用;
整个过程都是自动化的。除了上面的方法之外,还要尽量避免出现重复和无效的查询请求。如:
- 配置robots禁止其它搜索引擎抓取结果页;
- 使用nginx限制单ip查询频率,防止恶意请求;
- 使用nginx的proxy_cache对结果页进行缓存,尽量减少重复请求;
好了,我的经历大概就是这些。不过据说google修改了验证码机制,如果你有更好的办法,欢迎一起交流学习。