Python使用selenium过天眼查滑块验证码反爬实现模拟登录
Python使用selenium過天眼查滑塊驗證碼反爬實現模擬登錄
- 天眼查的滑塊驗證碼樣式
- 一頓操作到滑塊驗證碼階段
- 破解滑塊驗證碼
- 結束
天眼查的滑塊驗證碼樣式
在輸入賬號和密碼后會發現這個令人討厭的東西——滑塊驗證碼,此時需要點擊滑塊,然后才會出現缺口。
點擊滑塊之后會出現下面這種情況,需要將滑塊移動至缺口的位置才算通過滑塊驗證碼。按照這個步驟來人工操作肯定沒問題,但是我們應該怎么樣去通過selenium來實現電腦自動化操作來實現呢?網站有沒有反爬機制來防止selenium操作呢?如果有,我們又應該怎么突破這種反爬機制呢?
一頓操作到滑塊驗證碼階段
在解決問題上述問題之前呢,我們要先走滑塊驗證碼的面前。覺得這一步簡單的可以跳過。下面我們來講講這一步怎么操作。
首先呢,我們可以看到主頁面的樣子
我們既然要實現登錄功能, 第一步自然是點擊右上角的登錄,來到登錄頁面,用selenium來操作的話就是先獲取到登錄元素,然后實現點擊功能,下面是實現這一步的代碼。
這時我們來到了下面的頁面
我們要用賬號密碼來登錄,我們發現右上角有個電腦符號,我們點擊這里就會跳轉到賬號密碼登錄的界面,下面我們用selenium來操作
這時我們到了這個頁面:
現在呢,我們想要點擊密碼登錄跳轉到賬號密碼登錄界面,但是,這里就出現問題了,如果像之前一樣用xpath來獲取元素的話,我們發現編譯環境給報錯了,找不到這個元素,那么我們就不得不換一種方法來獲取元素。
我們發現了onclick對應有值,也就是說我們點擊賬號密碼登錄以后會用到這個值,學過前段的朋友應該知道,這是一段js代碼,那么我們不妨用selenium直接執行這段js代碼,那不就直接跳轉到這個頁面了嗎?
過不其然,我們來到了這個頁面。那么下面就是根據xpath或者class屬性值來獲取賬號輸入框、密碼輸入框、并填入賬號密碼了。
#輸入賬號 time.sleep(2) inputuid = driver.find_element_by_xpath('//*[@id="mobile"]') inputuid.send_keys("在這里輸入你的賬號")#輸入密碼 time.sleep(2) inputpassword = driver.find_element_by_xpath('//*[@id="password"]') inputpassword.send_keys('在這里輸入你的密碼')下面就是點擊登錄按鈕,我們發現通過xpath和class屬性值同樣獲取不到,不過我們同樣發現了onclick下的一段js代碼
那么跟上面一樣,執行這段代碼就實現了點擊登錄的功能。
于是我們就來到了滑塊驗證碼的界面。
破解滑塊驗證碼
我們應該如何來找到缺口的位置呢?我們又應該如何來操作滑塊到達缺口的位置呢?下面我們來分析一下。
我們首先應該找到缺口所在的位置,我們肉眼很容易可以看出缺口所在的位置,但是機器應該如何去找呢?我們進入滑塊驗證碼的頁面可以看到一張完整的圖片,當點擊滑塊以后才會出現滑塊和缺口。我們可不可以讓機器通過這兩張圖片的對比來獲取缺口的位置呢?那么我們來試著獲取這兩張圖片試試看。
首先我們應該獲取到完整的圖片,那么機器應該如何獲取呢?我們可以獲取到圖片元素所在的位置和尺寸來獲取圖片的坐標,然后我們對整個屏幕來張截圖,再對這張截圖來根據圖片的坐標來截取圖片。
#獲取圖片左上角位置以及圖片大小 time.sleep(2) img = driver.find_element_by_xpath('/html/body/div[10]/div[2]/div[2]/div[1]') location = img.location size = img.size#得到圖片的坐標 top, buttom, left, right = location["y"], location["y"]+size["height"], location["x"], location["x"]+size["width"] print(top, buttom, left, right)#截取滑塊驗證碼的完整圖片 scrennshot = driver.get_screenshot_as_png() scrennshot = Image.open(BytesIO(scrennshot)) captcha1 = scrennshot.crop((int(left), int(top), int(right), int(buttom))) captcha1.save('./yanzhengma.png')接下來我們點擊滑塊來獲取帶缺口的圖片
#單擊滑塊按鈕得到缺口圖片并截圖 slider = driver.find_element_by_xpath('/html/body/div[10]/div[2]/div[2]/div[2]/div[2]') ActionChains(driver).click_and_hold(slider).perform() time.sleep(1) scrennshot = driver.get_screenshot_as_png() scrennshot = Image.open(BytesIO(scrennshot)) captcha2 = scrennshot.crop((int(left), int(top), int(right), int(buttom))) captcha2.save('./yanzhengma2.png') time.sleep(2)兩張圖片都獲取到了,那么我們如何讓機器比對兩張圖片來找到缺口所在的位置呢?圖片在機器中是用數據的形式進行存儲的,我們看著缺口的位置顏色有明顯的不同,而機器也可以通過顏色的對比也就是在機器中存儲的RGB也就是紅黃藍三元素的值來進行對比。但是除了缺口的位置有明顯的差別之外,我們發現滑塊本身也同樣有巨大的顏色差別,為了解決這個問題,我們可以從滑塊的右側也就是避開滑塊來進行從左到右的逐一比對不過我們注意到滑塊中除了缺口外還有一些陰影的存在
注意看上方的圖,發現陰影了嗎?如果讓機器完全一模一樣的去識別的話,這些陰影就會成為我們的絆腳石,難道就沒有辦法了嗎?道高一尺魔高一丈,當然還是有辦法的,陰影畢竟是陰影,顏色比起缺口位置來說是很淺的,那么我們就可以設置一個閾值,也就是允許圖片有一些輕微的不同,直到遇到缺口這種顏色差別很大的才算成功。那我們就可以寫代碼了。我們為這個比對來寫一個函數
下面就是進行比對來找到缺口的位置
#從滑塊的右側開始逐一比對RGB值來尋找缺口位置 left = 77 has_find = False #i和j分別是圖片的橫坐標和縱坐標 for i in range(left, captcha1.size[0]):if has_find:breakfor j in range(captcha1.size[1]):if not compare_pixel(captcha1, captcha2, i, j):left = i #進入這個if條件即表示尋到了缺口所在的位置,將缺口的橫坐標賦值給lefthas_find = Truebreak#需要移動的距離減去滑塊距離左邊邊框的位置從而得到實際需要移動的距離 move = left - 20下面就是控制滑塊移動到缺口的位置
#拖動滑塊到缺口位置 ActionChains(driver).move_by_offset(xoffset=move, yoffset=0).perform()然后我們控制松開鼠標的話,缺口對是對上了,但是卻一直通過不了驗證,這就是網站的一些反爬手段了。怎么去解決這個問題呢?
我們的思路就是,能不能讓滑塊不那么像機器,例如滑塊劃到缺口的位置停一會再松開、或者說讓滑塊的移動模仿人的滑動滑塊的動作,比如說先加速后減速最后到滑塊的位置。
本人經過無數次的實驗得出結論,將滑塊滑動到缺口的位置,然后停留三秒鐘,即可通過檢測。
結束
本文到這里就結束了,希望我信心苦苦碼的這么多字對大家能夠有所幫助!在文章的最后給大家附上全部代碼!隨文章一起發布的有一個代碼實現視頻,大家感興趣可以看看。https://live.csdn.net/v/186077。
對于滑塊位置的確定可以去上網下載一個屏幕坐標獲取工具。
總結
以上是生活随笔為你收集整理的Python使用selenium过天眼查滑块验证码反爬实现模拟登录的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java毕业设计旅游路线规划系统源码+l
- 下一篇: python计算平均绩点_Python爬