安装模块
#pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install opencv-contrib-python
cv2无代码提示,找到cv2的包把cv2.pyd复制进site-packages。
网易易盾案例
import cv2 # 处理图片(模块不支持中文)
import requests #获取图片链接
from selenium import webdriver #浏览器帮助操作
from selenium.webdriver import ActionChains #控制鼠标的模块
from selenium.webdriver.common.by import By #获取元素
import numpy as np
import time
driver = webdriver.Chrome() # 操作谷歌浏览器
driver.get('https://dun.163.com/trial/sense')
driver.maximize_window() # 全屏
# 选择可疑用户-滑动拼图
driver.find_element(By.XPATH,'/html/body/main/div[1]/div/div[2]/div[2]/ul/li[2]').click()
time.sleep(3)
# 点击安全验证
driver.find_element(By.XPATH,'/html/body/main/div[1]/div/div[2]/div[2]/div[1]/div[2]/div[1]/div/div[2]/div[3]/div/div/div[1]/div[1]').click()
time.sleep(3)
# 获取图片链接
while True:
# 获取验证码背景链接
background_img = driver.find_element(By.XPATH,'/html/body/main/div[1]/div/div[2]/div[2]/div[1]/div[2]/div[1]/div/div[2]/div[3]/div/div/div[2]/div/div/div[1]/div/div[1]/img[1]').get_attribute('src')
# 获取验证码滑块链接
block_img = driver.find_element(By.XPATH,'/html/body/main/div[1]/div/div[2]/div[2]/div[1]/div[2]/div[1]/div/div[2]/div[3]/div/div/div[2]/div/div/div[1]/div/div[1]/img[2]').get_attribute('src')
# 获取图片,保存到本地
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36"
}
res = requests.get(background_img,headers=headers)
background_data = res.content
req = requests.get(block_img,headers=headers)
block_data = req.content
# 将图片保存到本地
with open ('./background_img.png','wb') as f1:
f1.write(background_data)
with open ('./block_img.png','wb') as f2:
f2.write(block_data)
#以下报错
# 通过cv2读取图片
bgimg = cv2.imread('./background_img.png')
blimg = cv2.imread('./block_img.png')
# 灰度处理,降低偏差
bg_img = cv2.cvtColor(bgimg, cv2.COLOR_BGR2GRAY)
bl_img = cv2.cvtColor(blimg, cv2.COLOR_BGR2GRAY)
# 保存处理过后的图片
cv2.imwrite('./hui_bgimg.png', bg_img)
cv2.imwrite('./hui_blimg.png', bl_img)
# 将模块图和北京图块确实的部分进行匹配
# 使用matchTemplate()方法,模块会将图像中的每一块区域都覆盖一遍,
# 并每次使用所选的method方法进行计算,每次的计算结果最后以一个二维数组的形式返回给我们。
# matchTemplate(目标对象,模板对象,匹配方式)模板匹配
# TM_CCORR_NORMED相关系数匹配(相似程度,值越大越相似)
result = cv2.matchTemplate(bg_img,bl_img,cv2.TM_CCORR_NORMED)
# 获取数组中维度最大的值的索引
index_max = np.argmax(result)
# 定位坐标
y,x = np.unravel_index(index_max,result.shape)
# 定位滑块条
bl_bc = driver.find_element(By.XPATH,'/html/body/main/div[1]/div/div[2]/div[2]/div[1]/div[2]/div[1]/div/div[2]/div[3]/div/div/div[2]/div/div/div[2]/div[2]/span')
time.sleep(2)
# 拖动滑块条
action = ActionChains(driver)
# 拖拽滑块条
action.drag_and_drop_by_offset(bl_bc, xoffset=x, yoffset=0).perform()
time.sleep(2)
#定位验证成功的元素
success = driver.find_element(By.XPATH,'/html/body/main/div[1]/div/div[2]/div[2]/div[1]/div[2]/div[1]/div/div[2]/div[3]/div/div/div[1]/div[2]/span[2]').text
if success == "验证成功":
break