selenium + opencv突破滑動驗證


selenium + opencv突破滑動驗證

前事准備

1. 需要使用的模塊requests,numpy,selenium,cv2,time
2. 需要瀏覽器驅動 chromedriver.exe
3. 安裝opencv模塊(版本不要過新)
""" 我這里使用的版本
pip uninstall opencv-python # 卸載
pip install opencv-python==3.4.2.16 # 安裝
pip install opencv-contrib-python==3.4.2.16
"""

實現代碼

# 注意使用的是selenium 運行時要考慮網路延時 

import requests
import cv2 as cv
from time import sleep
import numpy as np
from selenium import webdriver
from selenium.webdriver import ActionChains

# 導入瀏覽器驅動
web = webdriver.Chrome(r'chromedriver.exe')

# 訪問指定頁面
web.get('https://dun.163.com/trial/sense')
sleep(2)  # 防止網路延遲數據加載不成
# 找到滑動選項
web.find_element_by_xpath('//li[@captcha-type="jigsaw"]').click()
sleep(2)
# 找到滑動的圖片
web.find_element_by_xpath('//div[@class="yidun_intellisense yidun_intellisense--light"]/div/div').click()
sleep(2)
# 獲取 背景圖與滑動塊圖片的連接
background_image_url = web.find_element_by_xpath('//div[@class="yidun_bgimg"]/img[1]').get_attribute('src')
slider_image_url = web.find_element_by_xpath('//div[@class="yidun_bgimg"]/img[2]').get_attribute('src')

# 獲取兩張圖片 並保存
background_image = requests.get(background_image_url).content
slider_image = requests.get(slider_image_url).content

background_image_path = 'background_image' + '.jpg'
with open(background_image_path, mode='wb') as f:
    f.write(background_image)
slider_image_path = 'slider_image' + '.jpg'
with open(slider_image_path, mode='wb') as f:
    f.write(slider_image)
sleep(1)
# 讀取圖片
background = cv.imread(background_image_path)
slider = cv.imread(slider_image_path)

# 灰度處理圖片 圖片只有白黑
background = cv.cvtColor(background, cv.COLOR_BGR2GRAY)
slider = cv.cvtColor(slider, cv.COLOR_BGR2GRAY)
# 去除白色部分 獲取滑塊正常大小
slider = slider[slider.any(1)]

# 進行相似度匹配返回坐標數組
result = cv.matchTemplate(background, slider, cv.TM_CCOEFF_NORMED)

# 獲取相似度最高像素坐標 x 是像素高度 y 是像素距離
x, y = np.unravel_index(result.argmax(), result.shape)

# 等比例縮放問題 (滑動距離) 300比320 但是起始位置與背景圖位置有偏差,不做等比例可以通過識別
# distance = int(y*0.9375) - 2 # 等比例縮放 0.9375

sleep(1)
# 使用動作鏈
btn = web.find_element_by_xpath('//div[@class="yidun_control"]/div[2]')
ActionChains(web).drag_and_drop_by_offset(btn,xoffset=y,yoffset=0).perform()
sleep(2)
web.close()

實現效果


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM