• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

使用pyppteer+ddddocr通过极验滑块验证码附源码

武飞扬头像
Cason.py
帮助1

前言:

        验证码是大多数爬虫都需要克服的难题。pyppteer是目前市场主流的自动化工具之一,它的优势在于不易被浏览器检测到,ddddocr也是目前主流的验证码识别的第三方模块。接下来就通过python自动化工具和ddddocr等第三方模块完成极验滑块。

一:使用自动化工具打开网站

        目标网站:行为验证4.0-适应型验证码-滑动验证,点选验证,图片验证-极验GeeTest学新通

  1.  
    # 浏览器 启动参数
  2.  
    start_parm = {
  3.  
    # 关闭无头浏览器
  4.  
    "headless": False,
  5.  
    "args": [
  6.  
    '--disable-infobars', # 关闭自动化提示框
  7.  
    '--no-sandbox', # 关闭沙盒模式
  8.  
    '--start-maximized', # 窗口最大化模式
  9.  
     
  10.  
    ],
  11.  
    }
  12.  
    browser = await launch(**start_parm)
  13.  
    page = await browser.newPage()
  14.  
     
  15.  
    # 设置网页 视图大小
  16.  
    await page.setViewport(viewport={'width': 1920, 'height': 1080})
  17.  
    await page.goto('https://www.geetest.com/adaptive-captcha-demo')
学新通

二:控制鼠标定位到指定元素

  1.  
    await page.waitForXPath('//div[@class="type-config"]') # 等待元素加载
  2.  
    botton1 = await page.xpath('//div[@class="tab-item tab-item-1"]') # 滑块拼图验证按钮
  3.  
    await botton1[0].click()
  4.  
    await page.click('#captcha', options={
  5.  
    'button': 'left',
  6.  
    'clickCount': 2,
  7.  
    'delay': 300, # 延迟点击(ms)
  8.  
    })
  9.  
    botton2 = await page.xpath('//*[@aria-label="点击按钮开始验证"]') # 开始验证按钮
  10.  
    await botton2[0].click()

三:提取滑块拼图照片url

  1.  
    elements_1 = await page.xpath(
  2.  
    '//*[@id="captcha"]/div[2]/div[1]/div[4]/div[1]/div[2]/div/div/div[1]/div[1]/div[1]/@style') # 滑块图片链接
  3.  
    elements_2 = await page.xpath(
  4.  
    '//*[@id="captcha"]/div[2]/div[1]/div[4]/div[1]/div[2]/div/div/div[1]/div[2]/@style') # 背景图片链接
  5.  
    for element in elements_1:
  6.  
    sc = await page.evaluate('(element) => element.textContent', element)
  7.  
    sc_url = sc.split('"')[1].split('"')[0] # 提取滑块图片链接
  8.  
    with open('slice.png', 'wb')as f1:
  9.  
    f1.write(requests.get(sc_url).content)
  10.  
    for element in elements_2:
  11.  
    bg = await page.evaluate('(element) => element.textContent', element)
  12.  
    bg_url = bg.split('"')[1].split('"')[0] # 提取背景图片链接
  13.  
    with open('bg.png', 'wb') as f2:
  14.  
    f2.write(requests.get(bg_url).content)

四:获取拼图坐标偏移量

  1.  
    async def get_xy():
  2.  
    det = ddddocr.DdddOcr(det=False, ocr=False)
  3.  
     
  4.  
    with open('slice.png', 'rb') as f:
  5.  
    target_bytes = f.read()
  6.  
     
  7.  
    with open('bg.png', 'rb') as f:
  8.  
    background_bytes = f.read()
  9.  
    try:
  10.  
    res = det.slide_match(target_bytes, background_bytes)
  11.  
    print(res)
  12.  
    return res.get('target')[0]
  13.  
    except:
  14.  
    return False

五:操作鼠标移动滑块

        其中x,y需要根据自己电脑进行微调。

  1.  
    if target:
  2.  
    # print(target)
  3.  
    botton3 = await page.xpath(
  4.  
    '//*[@id="captcha"]/div[2]/div[1]/div[4]/div[1]/div[2]/div/div/div[2]/div/div[3]')
  5.  
    await botton3[0].hover() # 鼠标悬停元素上
  6.  
    await page.mouse.down() # 鼠标落下
  7.  
    await page.waitFor(500)
  8.  
    x = 1116 target
  9.  
    y = 641
  10.  
    await page.mouse.move(x, y, {'steps': 2}) # 鼠标移动
  11.  
    await page.waitFor(500)
  12.  
    await page.mouse.up() # 鼠标松开
  13.  
    time.sleep(2)
  14.  
    elements_3 = await page.xpath('//*[@id="captcha"]/div[2]/div[1]/div[3]/div[2]/div/div[2]/text()')
  15.  
    msg = ''
  16.  
    for element in elements_3:
  17.  
    msg = await page.evaluate('(element) => element.textContent', element)
  18.  
    if msg == '验证通过':
  19.  
    break
  20.  
    else:
  21.  
    print(msg)
  22.  
    else: # 获取坐标失败时刷新验证
  23.  
    botton4 = await page.xpath('//*[@aria-label="刷新验证"]')
  24.  
    await botton4[0].click()
学新通

学新通

验证通过,欧耶~

六:完整代码

  1.  
    # coding:utf-8
  2.  
    import ddddocr
  3.  
    # coding:utf-8
  4.  
    import asyncio
  5.  
    import time
  6.  
     
  7.  
    import requests
  8.  
    from pyppeteer.launcher import DEFAULT_ARGS
  9.  
     
  10.  
    DEFAULT_ARGS.remove("--enable-automation")
  11.  
    from pyppeteer import launch
  12.  
     
  13.  
     
  14.  
    async def main():
  15.  
    # 浏览器 启动参数
  16.  
    start_parm = {
  17.  
    # 关闭无头浏览器
  18.  
    "headless": False,
  19.  
    "args": [
  20.  
    '--disable-infobars', # 关闭自动化提示框
  21.  
    '--no-sandbox', # 关闭沙盒模式
  22.  
    '--start-maximized', # 窗口最大化模式
  23.  
     
  24.  
    ],
  25.  
    }
  26.  
    browser = await launch(**start_parm)
  27.  
    page = await browser.newPage()
  28.  
     
  29.  
    # 设置网页 视图大小
  30.  
    await page.setViewport(viewport={'width': 1920, 'height': 1080})
  31.  
    await page.goto('https://www.geetest.com/adaptive-captcha-demo')
  32.  
    time.sleep(2)
  33.  
    await page.waitForXPath('//div[@class="type-config"]') # 等待元素加载
  34.  
    botton1 = await page.xpath('//div[@class="tab-item tab-item-1"]') # 滑块拼图验证按钮
  35.  
    await botton1[0].click()
  36.  
    await page.click('#captcha', options={
  37.  
    'button': 'left',
  38.  
    'clickCount': 2,
  39.  
    'delay': 300, # 延迟点击(ms)
  40.  
    })
  41.  
    botton2 = await page.xpath('//*[@aria-label="点击按钮开始验证"]') # 开始验证按钮
  42.  
    await botton2[0].click()
  43.  
    while True:
  44.  
    time.sleep(5)
  45.  
    elements_1 = await page.xpath(
  46.  
    '//*[@id="captcha"]/div[2]/div[1]/div[4]/div[1]/div[2]/div/div/div[1]/div[1]/div[1]/@style') # 滑块图片链接
  47.  
    elements_2 = await page.xpath(
  48.  
    '//*[@id="captcha"]/div[2]/div[1]/div[4]/div[1]/div[2]/div/div/div[1]/div[2]/@style') # 背景图片链接
  49.  
    for element in elements_1:
  50.  
    sc = await page.evaluate('(element) => element.textContent', element)
  51.  
    sc_url = sc.split('"')[1].split('"')[0] # 提取滑块图片链接
  52.  
    with open('slice.png', 'wb')as f1:
  53.  
    f1.write(requests.get(sc_url).content)
  54.  
    for element in elements_2:
  55.  
    bg = await page.evaluate('(element) => element.textContent', element)
  56.  
    bg_url = bg.split('"')[1].split('"')[0] # 提取背景图片链接
  57.  
    with open('bg.png', 'wb') as f2:
  58.  
    f2.write(requests.get(bg_url).content)
  59.  
    target = await get_xy() # 得到滑块x坐标偏移量
  60.  
    if target:
  61.  
    # print(target)
  62.  
    botton3 = await page.xpath(
  63.  
    '//*[@id="captcha"]/div[2]/div[1]/div[4]/div[1]/div[2]/div/div/div[2]/div/div[3]')
  64.  
    await botton3[0].hover() # 鼠标悬停元素上
  65.  
    await page.mouse.down() # 鼠标落下
  66.  
    await page.waitFor(500)
  67.  
    x = 1116 target
  68.  
    y = 641
  69.  
    await page.mouse.move(x, y, {'steps': 2}) # 鼠标移动
  70.  
    await page.waitFor(500)
  71.  
    await page.mouse.up() # 鼠标松开
  72.  
    time.sleep(2)
  73.  
    elements_3 = await page.xpath('//*[@id="captcha"]/div[2]/div[1]/div[3]/div[2]/div/div[2]/text()')
  74.  
    msg = ''
  75.  
    for element in elements_3:
  76.  
    msg = await page.evaluate('(element) => element.textContent', element)
  77.  
    if msg == '验证通过':
  78.  
    break
  79.  
    else:
  80.  
    print(msg)
  81.  
    else: # 获取坐标失败时刷新验证
  82.  
    botton4 = await page.xpath('//*[@aria-label="刷新验证"]')
  83.  
    await botton4[0].click()
  84.  
    input('---验证通过---')
  85.  
    await browser.close()
  86.  
     
  87.  
     
  88.  
    async def get_xy():
  89.  
    det = ddddocr.DdddOcr(det=False, ocr=False)
  90.  
     
  91.  
    with open('slice.png', 'rb') as f:
  92.  
    target_bytes = f.read()
  93.  
     
  94.  
    with open('bg.png', 'rb') as f:
  95.  
    background_bytes = f.read()
  96.  
    try:
  97.  
    res = det.slide_match(target_bytes, background_bytes)
  98.  
    print(res)
  99.  
    return res.get('target')[0]
  100.  
    except:
  101.  
    return False
  102.  
     
  103.  
     
  104.  
    if __name__ == '__main__':
  105.  
    main()
  106.  
    asyncio.get_event_loop().run_until_complete(main())
学新通

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhhaccjc
系列文章
更多 icon
同类精品
更多 icon
继续加载