前言
哈嘍,各位小伙伴,你們好呀,今天呢,咱們來說一下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()
謝謝觀看,謝謝支持