与Google验证码的斗争记录

关于作者

  • 马隆博,Java,Javascript
  • Blog: http://mlongbo.com
  • E-Mail: [email protected]
  • 相关项目: http://gso.mlongbo.com/
  • 文章编写于: 2014/12/27

转载请注明出处:

http://mlongbo.com/fight_with_google_captcha/



写过爬虫或搞过代理的朋友应该都知道,google有一个验证码机制用来防止机器人恶意查询. 我们在使用翻墙软件和一些代理软件时也常常会遇到这种需要输入验证码的情况。我在写gso的时候自然也避免不了会遇到这种问题, 那么我都是怎么应对的呢, 稍后我会讲述一些我所用到的一些方法, 也欢迎你来一起探讨.

首先我觉得应该先弄清楚google判断正常用户请求和机器请求的机制是什么, 这样我们才能更好的去应对.

在我查询了大量资料之后发现,大家普遍都认为有以下这几个因素:

  1. 单IP请求频率;
  2. userAgent;
  3. 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列入黑名单了。我也正在做这一块,完了之后会再跟各位分享。我可以先说一下我的大概思路,有兴趣的同学可以帮忙来写(我的项目是开源的,你可以关注)。然后我说说我的思路:

  1. 定时从互联网上批量获取ip;
  2. 检查ip可用性及速度;
  3. 当某个ip的查询超时出现限定次数后(如10次), 将该ip加入黑名单,不再使用;

整个过程都是自动化的。除了上面的方法之外,还要尽量避免出现重复和无效的查询请求。如:

  1. 配置robots禁止其它搜索引擎抓取结果页;
  2. 使用nginx限制单ip查询频率,防止恶意请求;
  3. 使用nginx的proxy_cache对结果页进行缓存,尽量减少重复请求;

好了,我的经历大概就是这些。不过据说google修改了验证码机制,如果你有更好的办法,欢迎一起交流学习。

时间: 2024-11-13 06:59:05

与Google验证码的斗争记录的相关文章

基于js的google map的开发记录

国内的google地图资源接口:ditu.google.cn google 的地图是绘制在 canvas 组件中的 一般非盈利机构调用google地图的日加载次数在25k以下 创建一个简单的google地图的函数: var mapOptions = { center: new google.maps.LatLng(-34.397, 150.644), zoom: 8, mapTypeId: google.maps.MapTypeId.ROADMAP }; var map = new google

Spring MVC 中使用 Google kaptcha 验证码

验证码是抵抗批量操作和恶意登录最有效的方式之一. 验证码从产生到现在已经衍生出了很多分支.方式.google kaptcha 是一个非常实用的验证码生成类库. 通过灵活的配置生成各种样式的验证码,并将生成的验证码字符串放到 HttpSession 中,方便获取进行比较. 本文描述在 spring mvc 下快速的将 google kaptcha 集成到项目中(单独使用的话在 web.xml 中配置 KaptchaServlet). 1.maven 依赖 官方提供的 pom 无法正常使用,使用阿里

qtp识别验证码

花了两天时间才完整的完成识别验证码的登录操作,在网上看到很多关于验证码识别的方法,但是我用的qtp版本比较高级,所以还是要自己花心思研究.po上我的识别验证码的详细历程: 一.读取浏览器中的图片验证码 1.打开浏览器登录界面 2.启动qtp,不勾选web 3.录制验证码.开始录制:在录制的小条上选择insert ->text area output value. 截图验证码图片的框. 然后选择modify,output types设置为environment,name 可以改写为“getchar

ThinkPHP下实现验证码的调用

产生验证码的类位于ThinkPHP/Extend/Library/ORG/Util/Image.class.php文件中. 验证码函数参数解释: length:验证码的长度,默认为4位数 model:验证字符串的类型,默认为数字,其他支持类型有0 字母 1 数字 2 大写字母 3 小写字母 4中文 5混合 type:验证码的图片类型,默认为png width:验证码的宽度,默认会自动根据验证码长度自动计算 height:验证码的高度,默认为22 verifyName:验证码的SESSION记录名

【代码实现】PHP生成各种随机验证码

文章来源:PHP开发学习门户  (自行开发的个人网站) 验证码在WEB应用中非常重要,通常用来防止用户恶意提交表单,如恶意注册和登录.论坛恶意灌水等.本文将通过实例讲解使用PHP生成各种常见的验证码包括数字验证码.数字+字母验证码.中文验证码.算术验证码等等以及其Ajax验证过程. 下载示例源码 PHP生成验证码图片 PHP生成验证码的原理:使用PHP的GD库,生成一张带验证码的图片,并将验证码保存在Session中.PHP生成验证码的大致流程有: 1.产生一张png的图片: 2.为图片设置背景

Google搜索排名优化-面向搜索引擎的网站设计

内容摘要:网站在搜索营销方面最主要的缺点: 行业知识:不知道搜索引擎对吸引的新用户的重要性,在搜索引擎排名服务中追求“傻瓜相关”,购买一些其实没有太多实际意义的行业关键词.其实能够用户输入的关键词越多,其目标性越强,这样的客户价值越高.用户能够直接定位到产品具体内容页比到网站首页有价值的多: 发布技术:网站的网页进入Google的索引量非常小,主要是由于大量使用动态网页造成的.需要将动态页面链接改写成静态 链接: 页面设计:页面标题重复,关键词不突出,过渡使用JavaScript脚本/图片/Fl

thinkphp实现功能:验证码

1.定义验证码函数 public function verify(){ /** * 在thinkPHP中如何实现验证码 * * ThinkPHP已经为我们提供了图像处理的类库ThinkPHP\Extend\... * * 如何导入类库? * 导入类库用"import(文件路径)来导入,但是注意文件的路径中的\要替换成 . 号" * 1)导入系统的类库 import(从library开始算起) import('ORG.Util.Image')注意大小写 * 2)导入项目类库 import

ThinkPHP(SAE)调用验证码不能正确调用验证码

现在,将官网的方法贴出: SAE下使用ThinkPHP验证码,非SaeVcode SaeVcode其实很弱弱,连验证码的尺寸都不能设置,对于开发和美工来说,是件很头痛的事情,经过我们技术员简单测试,发现ThinkPHP自带的验证码是可以在SAE下正常运行的. 1.将“ThinkPHP\Extend\Library\ORG\Util\String.class.php”拷贝至“ ThinkPHP\Extend\Engine\Sae\Lib\Extend\Library\ORG\Util\String

房产地图google map的初步应用点滴.2)(转)

房产地图google map的初步应用点滴.1)房产地图google map的初步应用点滴.2)房产地图google map的初步应用点滴.3) 房产地图google map的初步应用点滴.4) 本来是想将房产地图google map的应用记录一个系列,但继1)记录完之后总找不到时间继续记录下去,1)中主要解决了Google Maps JavaScript API V3 与 Google Local Search API两者由于版本问题带来的一系列麻烦,思路是使用一个iframe作为兼容的跳板,