DrissionPage 过滑动验证码

本文出自: https://www.cnblogs.com/jackzhuo/p/18586281,并非原创,如需要转载请移步自原文并注明出处

1. 安装DrissionPage

pip install DrissionPage
# 指定pip源,如豆瓣
pip install DrissionPage -i  https://pypi.doubanio.com/simple

2. 安装ddddocr

pip install ddddocr
# 指定pip源,如豆瓣
pip install ddddocr -i https://pypi.doubanio.com/simple

3. 滑动验证码-带缺口滑块

from DrissionPage import ChromiumPage,ChromiumOptions
import random
import time
import ddddocr

# 浏览器路径
path = r'C:\Program Files\Google\Chrome\Application\chrome.exe'
co = ChromiumOptions().set_browser_path(path)

# 打开浏览器(全局)
page = ChromiumPage(co)
# 目标网站
page.get("https://xxxx.yyyy.ccc.cn/biz/slideCaptchaindex.html",retry=3,interval=2,timeout=15)

# 滑块的运动轨迹
def get_tracks(distance):
    value = round(random.uniform(0.55,0.78),2)
    v,t,sum1 = 0,0.3,0
    plus = []
    mid = distance * value
    while sum1 < distance:
        if sum1 < mid:
            a = round(random.uniform(2.5,3.5),1)
        else:
            a = -round(random.uniform(2.0,3.0),1)
        s = v * t + 0.5 * a * (t ** 2)
        v = v + a * t
        sum1 += s
        plus.append(round(s))
    return plus


for i in range(5):
    # 获取滑块背景图
    background_bytes = page.ele('xpath://*[@id="oriImg"]').src()
    # 获取缺口图片
    cut_bytes = page.ele('xpath://*[@id="cutImg"]').src()
    # 识别滑块缺口并获得滑动轨迹
    det = ddddocr.DdddOcr(det=False,ocr=False,show_ad=False)
    # 获得滑块距离(通过滑块图片和缺口图片计算出滑块的距离)
    result = det.slide_match(cut_bytes,background_bytes,simple_target=True)
    print("滑块距离:",result)
    # 获得滑块运动轨迹
    offset = result['target'][0]
    tracks = get_tracks(offset)
    print("滑动轨迹:",tracks)
    # 滑动滑块
    # 按动鼠标左键不放
    page.actions.hold('xpath://*[@id="slider"]')
    # 鼠标滑动
    for track in tracks:
        # 使鼠标相对当前位置移动若干距离
        page.actions.move(offset_x=track,offset_y=round(random.uniform(1.0,3.0),1),duration=.1)
    time.sleep(0.1)
    # 释放鼠标左键
    page.actions.release('xpath://*[@id="slider"]')
    # 截图
    page.ele('xpath://*[@id="captchadiv"]').get_screenshot(path='./captcha.jpg')
    time.sleep(5)
    # 如果验证失败
    if '验证' in page.ele('xpath:/html/body/div[6]/div/div[2]').text:
        print('滑动失败,刷新滑块')
        page.ele('xpath://*[@id="captchadiv"]/div[1]/img').click()
    else:
        print("滑动成功")
        break

print('开始采集')

4. 滑动验证码-滑到底

import time
import random

from DrissionPage import Chromium


# 接管已经打开的浏览器
browser = Chromium(9333)
cp = browser.latest_tab

def get_tracks(distance=255):
    value = round(random.uniform(0.55,0.78),2)
    v,t,sum1 = 0,0.3,0
    plus = []
    mid = distance * value
    while sum1 < distance:
        if sum1 < mid:
            a = round(random.uniform(2.5,3.5),1)
        else:
            a = -round(random.uniform(2.0,3.0),1)
        s = v * t + 0.5 * a * (t ** 2)
        v = v + a * t
        sum1 += s
        plus.append(round(s))

    # 计算  plus当plus值小于distance,加上相差数再加上随机一个值
    res = 0
    for i in plus:
        res += i
    if res < distance:
        diff_value = distance -res
        if diff_value <= 10:
            add_value = diff_value + random.randint(3, 6)
        else:
            add_value = diff_value + random.randint(1, 3)
        index3 = random.randint(4, len(plus) - 3)
        plus.insert(index3,add_value)

    return plus


def get_tracks2(distance=255):
    value = round(random.uniform(0.55,0.78),2)
    v,t,sum1 = 0,0.3,0
    plus = []
    mid = distance * value
    while sum1 < distance:
        if sum1 < mid:
            a = round(random.uniform(2.5,3.5),1)
        else:
            a = -round(random.uniform(2.0,3.0),1)
        s = v * t + 0.5 * a * (t ** 2)
        v = v + a * t
        sum1 += s
        plus.append(round(s))

    # 强制插入负数
    count = 0
    zi = random.randint(1,2)                        # 表示可以随机几个负数
    while count <= zi:
        index1 = random.randint(1, len(plus) - 3)
        if plus[index1] > 0:
            value = plus[index1]
            print("value",value)
            plus[index1] = -value
            index2 = random.randint(1, len(plus) - 4)
            plus.insert(index2,value*2)
        count += 1

    # 计算  plus当plus值小于distance,加上相差数再加上随机一个值
    res = 0
    for i in plus:
        res += i
    if res < distance:
        diff_value = distance -res
        if diff_value <= 10:
            add_value = diff_value + random.randint(3, 6)
        else:
            add_value = diff_value + random.randint(1, 3)
        index3 = random.randint(4, len(plus) - 3)
        plus.insert(index3,add_value)

    return plus


def generate_random_number(start=0.01,end=0.03):
    return round(random.uniform(start, end),3)


def get_random():
    num1_float = random.randint(-5, -1)
    num2_float = random.randint(1, 5)
    return {"num1":num1_float,"num2":num2_float}


def slide(num=0):
    # cp.wait.eles_loaded('@id=nc_1_n1z')
    ele = cp.ele('@id=nc_1_n1z')
    value_ele1 = cp.ele('@id=`nc_1_refresh1`')
    if ele:
        print("处理滑动......")
        ele.wait.clickable()
        # cp.actions.move_to(ele, duration=0.5).hold().move(82, random.uniform(-5, 5), duration=0.1).move(63, random.uniform(-5, 5), duration=0.2).move(41, random.uniform(-5, 5), duration=0.3).move(100, random.uniform(-5, 5),duration=0.5).release()
        # time.sleep(2)
        cp.actions.hold('xpath://span[@id="nc_1_n1z"]')

        # 随机函数名处理轨迹
        my_array = ["get_tracks", "get_tracks2"]
        random_choice = random.choice(my_array)
        if random_choice == "get_tracks":
            tracks = get_tracks(255)
        else:
            tracks = get_tracks2(255)
        print("当前处理轨迹函数是: {}".format(random_choice))
        print("当前滑动距离列表: {}".format(tracks))

        # 随机生成从-5/5的两个数
        random_res = get_random()
        num1 = random_res.get("num1",-5)
        num2 = random_res.get("num2",5)

        for key,track in enumerate(tracks):
            # 使鼠标相对当前位置移动若干距离
            # time.sleep(generate_random_number())
            if num == 3 and key == round(len(tracks)/1.3):                    # 重试次数过多,先执行一半释放鼠标左键
                print("尝试次数过多...",round(len(tracks)/1.3),len(tracks))
                cp.actions.move(offset_x=track, offset_y=round(random.uniform(num1, num2), 1), duration=0.1).release()
                return slide(num+1)
            if num == 6:
                # 刷新浏览器
                cp.refresh()
                return slide(num + 1)

            if key+1 == len(tracks):
                cp.actions.move(offset_x=track, offset_y=round(random.uniform(num1, num2), 1), duration=0.1).release()
            else:
                cp.actions.move(offset_x=track, offset_y=round(random.uniform(num1, num2), 1), duration=0.1)
        value_ele = cp.ele('@id=`nc_1_refresh1`')
        value_ele2 = cp.ele('@id=nc_1__scale_text')
        if value_ele:
            # if "验证失败,点击框体重试" in value_ele.text:
                num += 1
                print("滑动验证失败,进行重试")
                value_ele.click()
                return slide(num)
        elif value_ele2:
            num += 1
            print("滑动验证失败,进行重试")
            value_ele2.click()
            return slide(num)

    elif value_ele1:
        print("先点击重试再进行识别......")
        if value_ele1:
            # if "验证失败,点击框体重试" in value_ele1.text:
                value_ele1.click()
                return slide(num)
    else:
        return {"res":False,"msg":"加载滑动验证码失败"}

    return {"res":True,"msg":"加载滑动验证码处理成功"}

print(slide())
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,546评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,224评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,911评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,737评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,753评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,598评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,338评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,249评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,696评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,888评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,013评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,731评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,348评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,929评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,048评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,203评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,960评论 2 355

推荐阅读更多精彩内容

  • 通过canvas画布来解决图形验证码。 思路: a.一个文本框用来输入由数字和字母组合的验证码+一个画布标签来显示...
    盼旺阅读 853评论 0 8
  • 我们可以借助插件来做 打开插件,找到自己需要的验证码 筛选有用的路径 把对应的视图函数也拿过来,注意还需要一个ge...
    程序员之路阅读 1,334评论 0 1
  • 前言 前段时间接到需求,需要给登录模块做滑块登录验证功能,要求设计尽量不复杂且能正确校验滑动图片验证码。 实现思路...
    多喝热水o阅读 1,062评论 0 2
  • 极验验证码:需要手动拼合滑块来完成的验证,相对图形验证码识别难度上升了几个等级。下面用程序识别并通过极验验证码的验...
    生信师姐阅读 7,275评论 0 5
  • 一.数字短信验证码 思路: a.两个文本框+一个获取验证码按钮,文本框用来输入手机号和获取到的验证码,按钮负责点击...
    凉烬阅读 339评论 0 0