前言
哈喽,各位小伙伴,你们好呀,今天呢,咱们来说一下google,我们都知道,google是目前地表最强的搜索引擎了,我们可以借助google庞大的搜索资源找到一些自己想要的资源,可能是一些收费电影,可能是一些奇门小说,可能是某个角落的种子,不管怎么说,google搜索还是挺给力的,但是呢,有梯子的我们可能都遇到过,我们搜索的多了,会有这种情况
这种验证码呢,叫做ReCaptcha验证码,相对来说,是比较繁琐的验证码之一
当然了,ReCaptcha不止谷歌一家再用,国外的网站很多都是使用这种验证码,但是在国内不多,因为在国内比较容易被墙,所以用的少,但是我们是高端玩家,在自由的internet中,我们怎么可能只局限于国内,下面,我们就针对ReCaptcha验证码破解
测试网站:https://www.google.com/recaptcha/api2/demo
谷歌提供的范例,实际网站验证码和这个一模一样
ReCaptcha验证码样式
为什么使用第三方平台
嗯,看到这可能有人会对我不屑一顾,说辣鸡才会用第三方平台,要是按照技术来划分的话,我真的辣鸡,哈哈
但是这里要抬杠一下,并不是说用第三方平台就是辣鸡,我们可以想象一下,如果是滑动验证码,我们当然有一试的能力,python可以调用OpenCV,看看文档,当然是可以实现了,但是有个问题是,你可能针对的一个网站的滑动验证识别好了,但是可能每个网站的滑动验证码都不太一样,在用OpenCV识别的时候,可能就会识别率低的情况,要是在公司,一直完不成任务,嗯,,,等着被炒鱿鱼吧,再说,像谷歌人机个人也解决不了,没有NB的机器学习是不可能的,所以只能用第三方平台,毕竟,完成任务才是首要任务
这里选用的第三方平台:https://2captcha.com/
为什么推荐2captcha平台
我们先说一下现在打码平台机制都有哪些
第一种呢,就是打码平台训练好各种各样的数据,比如,哪些是花,哪些是车,然后我们把图片发送给打码平台,他给我们结果,但是这样会有个问题,如果训练的不好,我们这边的结果也是很不好的,各种不准确,影响效果
第二种呢,就是平台雇人,我们把整个验证码都给打码平台,平台找人帮助我们点击,然后把结果给我们,我们在登录了或者做其他
我们可以看出来,肯定是第二种更加灵活地,现在阶段,机器再NB,至少 在验证码上准确率还是不如人的
2captcha平台目前采用的就是第二种方式,赚取的是中间差价,但是识别率是我用过最高的,曾经因为选错了平台,一直不成功,加班加点,鼠标都被我砸坏了,唉,所以,选择一个合适的平台还是很重要的
所需工具
Chromedriver:浏览器驱动,可以理解为一个没有界面的chrome浏览器
Selenium:用于模拟人对浏览器进行点击、输出、拖拽等操作,就相当于是个人在使用浏览器,也常常用来应付反爬虫措
开始行动
既来之则安之,选择了2captcha,就要看看人家的官网啦
打开官网
嗯…纯英文,我也看不懂..怎么办呢,别着急,我带你们一步一步分析主要功能
登录账号
登录完成后,会自动跳到主页
第一个红色圈起来的地方表示剩余多少钱,没有钱的话记得要氪金,否则是不能用滴,氪金过程这里就不多做解释了哈,问题不大
第二个红色圈起来的地方表示这是你的唯一key,每次请求要带上这个key的,所以要保管好
进入主题,研究文档
点击红色圈的地方,API,一般API都是文档,let’s go
En….什么玩意..完全看不懂,别慌,往下滑
滑到rates,我们知道,谷歌人机是ReCaptcha,但是三个呢,到底是哪个呢,我就来带大家看看
首先点击ReCaptcha(oldmethod),这个是老的方法,咱也不知道唉,所以就先看看这个吧,从浅到深嘛,这里呢,我都直接翻译了一下,方便我们观看
Look,人家也说了,旧方法解决ReCaptcha准确率比较低,建议使用新方法,那我们就点击新方法去看看
我们找到了,这种属于ReCaptcha v2验证码,确实和谷歌人机挺一样的,我们来看一下文档是怎么写的
人家说,我们先找到data-sitekey参数,然后将data-sitekey参数提交到https://2captcha.com/in.php
等个15-20s再向https://2captcha.com/res.php获取结果
然后找到id=g-recaptcha-response的textarea标签,将display:none 这个css删除
将给我们字符串添加到textarea输入框点击提交,就完成了
是不是很简单,我们也来试一下
打开谷歌的示例样式
我们打开开发者工具,搜索data-sitekey,可以看到,真的有一个
我们赋值一下这个data-sitekey,并且用代码获取到最后的结果
然后我们找到 id=g-recaptcha-response 的textarea标签,将他的display属性删除
但是有点不太对
我们的
2captcha的示例的
我们可以看到,2captcha是个删除display之后,textarea框是直接展示出来的,但是我们删除display之后,基本没用丝毫动静,这…
别着急,人家都想到了,我们往下滑滑
既然我们不能直接显示出来textarea,那就说明我们是隐式的ReCaptcha验证码,其实他的原理呀,也挺简单
如果你学过一些前端,会些js,你可能就会想到,虽然我看不到这个textarea,但是通过js我们仍然能更改textarea的数据,只是说,我们鼠标点击不了而已,人家也说了,看第一个红圈的位置,通过此js,我们我们就可以把向2captcha获取的值赋值上,第二个圈js是提交表单,其实就是我们人点击提交而已,只不过是js代码帮我们完成了,这样,我们也完成了一个偷天换日
小试牛刀
好嘞,我们就先来手动搞一下,在上述中,我们已经根据data-sietkey拿到了最后的结果,显然,我们只能通过js完成,那么,我们就试一下
通过上述gif看到,我们通过js,确实绕过了点击车辆识别了,其他识别,确实方便,
但是我们不可能通过人每次这样搞呀,但是因为牵扯到了执行js,所以只能使用selenium,所以,我们来看一下selenium上的效果吧
Look,这样,我们就针对谷歌人机(ReCaptcha)验证码,完成了自动登录,如果爬取国外的某某网站时,如果遇到了ReCaptcha,我相信一定会对你有帮助
完整代码
import time from selenium import webdriver from selenium.webdriver.chrome.webdriver import WebDriver import requests # 常量 driver: WebDriver USER = {} API_KEY = "xxxxxxxxxxxxxxx" # 初始化 def init(): global driver driver = webdriver.Chrome("chromedriver.exe", desired_capabilities=None) def open_google(): driver.get("https://www.google.com/recaptcha/api2/demo") data_sitekey = driver.find_element_by_xpath('//*[@id="recaptcha-demo"]').get_attribute("data-sitekey") # iframe_src = driver.find_element_by_xpath('//*[@id="recaptcha-demo"]/div/div/iframe').get_attribute("src") # iframe_k = url_params_format(iframe_src).get("k") print(data_sitekey) page_url = "https://www.google.com/recaptcha/api2/demo" # print(iframe_k) u1 = f"https://2captcha.com/in.php?key={API_KEY}&method=userrecaptcha&googlekey={data_sitekey}&pageurl={page_url}&json=1&invisible=1" r1 = requests.get(u1) print(r1.json()) rid = r1.json().get("request") u2 = f"https://2captcha.com/res.php?key={API_KEY}&action=get&id={int(rid)}&json=1" time.sleep(25) while True: print(u2) r2 = requests.get(u2) print(r2.json()) if r2.json().get("status") == 1: form_tokon = r2.json().get("request") break time.sleep(5) wirte_tokon_js = f'document.getElementById("g-recaptcha-response").innerHTML="{form_tokon}";' submit_js = 'document.getElementById("recaptcha-demo-form").submit();' driver.execute_script(wirte_tokon_js) time.sleep(1) driver.execute_script(submit_js) if __name__ == '__main__': init() open_google()
Code
谢谢观看,谢谢支持