Python基于OpenCV实现滑块验证

我们平常写爬虫时,经常会遇到滑块验证,非常头疼,调用API识别价格不菲。

于是我们可以利用自动化的方案解决,基于OpenCV进行图形处理获取滑块距离,再结合自动化即可解决难题。

先封装好OpenCV的识别函数,在写一个爬虫自动化测试函数,传入获取到的页面,通过页面滑块进行控制,必要时还得借助物理公式模拟人为点击,给鼠标写一个变速的运动轨迹。

import asyncio

import cv2
import base64

from Log import log


# 计算滑动距离
async def findpic(target='fadebg.png', template='slider.png'):  # 缺口背景图路径, 滑块图片路径
    target_rgb = cv2.imread(target)     # 读取缺口背景图
    target_gray = cv2.cvtColor(target_rgb, cv2.COLOR_BGR2GRAY)  # 将缺口背景图 BGR格式转换成灰度图片
    template_rgb = cv2.imread(template, 0)  # 读取滑块图,第二个参数0表示灰度模式
    res = cv2.matchTemplate(target_gray, template_rgb, cv2.TM_CCOEFF_NORMED)  # 模板匹配,在大图中找小图
    min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
    return max_loc[0]  # 返回滑块移动距离


# 保存图片
async def save(filename, data):
    _, img = data.split(",")
    img = base64.b64decode(img)
    with open(filename, "wb") as f:
        f.write(img)


# 获取完整背景图
async def get_fullimg(page):
    old_img = await page.xpath('//*[@id="J_slider_verification"]/div[1]/img[2]')
    for item in old_img:
        img = await(await item.getProperty('src')).jsonValue()
        await save(filename="img/fullbg.png", data=str(img))


# 获取缺口背景图
async def get_fadeimg(page):
    new_img = await page.xpath('//*[@id="J_slider_verification"]/div[1]/img[2]')
    for item in new_img:
        img = await(await item.getProperty('src')).jsonValue()
        await save(filename="../img/fadebg.png", data=str(img))


# 获取滑块图
async def get_sliderimg(page):
    new_img = await page.xpath('//*[@id="J_slider_verification"]/div[1]/img[1]')
    for item in new_img:
        img = await(await item.getProperty('src')).jsonValue()
        await save(filename="../img/slider.png", data=str(img))


# 传入爬虫获取的页面,开始完成滑块验证
async def slider_main(page):
    # 点击确定按钮
    await asyncio.sleep(3)
    enter_botton = await page.xpath('//*[@id="outerContainer"]/div/div[3]/div/button')
    await enter_botton[0].click()
    # 按住滑块
    await page.waitForXPath('//*[@id="J_slider_verification"]/div[3]/div[3]/div/i[1]')
    slider_botton = await page.xpath('//*[@id="J_slider_verification"]/div[3]/div[3]/div/i[1]')
    await slider_botton[0].hover()
    await page.mouse.down()
    await page.waitFor(500)
    # 获取带缺口验证码图片
    await get_fadeimg(page)
    # 获取滑块验证码图
    await get_sliderimg(page)
    # 获取滑动距离
    move = await findpic()
    # 滑动滑块
    await page.mouse.move(int(page.mouse._x + 1.1*move), 450, {'steps': 35})
    log.info('滑块移动距离:' + str(page.mouse._x + 1.1*move))
    # await page.screenshot({'path': 'slider_test.png'})  # 显示滑动结果
    await page.waitFor(500)
    await page.mouse.up()

你可能感兴趣的:(大数据,自动化,python,爬虫,opencv)