使用pyppteer+ddddocr通过极验滑块验证码附源码
前言:
验证码是大多数爬虫都需要克服的难题。pyppteer是目前市场主流的自动化工具之一,它的优势在于不易被浏览器检测到,ddddocr也是目前主流的验证码识别的第三方模块。接下来就通过python自动化工具和ddddocr等第三方模块完成极验滑块。
一:使用自动化工具打开网站
目标网站:行为验证4.0-适应型验证码-滑动验证,点选验证,图片验证-极验GeeTest
-
# 浏览器 启动参数
-
start_parm = {
-
# 关闭无头浏览器
-
"headless": False,
-
"args": [
-
'--disable-infobars', # 关闭自动化提示框
-
'--no-sandbox', # 关闭沙盒模式
-
'--start-maximized', # 窗口最大化模式
-
-
],
-
}
-
browser = await launch(**start_parm)
-
page = await browser.newPage()
-
-
# 设置网页 视图大小
-
await page.setViewport(viewport={'width': 1920, 'height': 1080})
-
await page.goto('https://www.geetest.com/adaptive-captcha-demo')
二:控制鼠标定位到指定元素
-
await page.waitForXPath('//div[@class="type-config"]') # 等待元素加载
-
botton1 = await page.xpath('//div[@class="tab-item tab-item-1"]') # 滑块拼图验证按钮
-
await botton1[0].click()
-
await page.click('#captcha', options={
-
'button': 'left',
-
'clickCount': 2,
-
'delay': 300, # 延迟点击(ms)
-
})
-
botton2 = await page.xpath('//*[@aria-label="点击按钮开始验证"]') # 开始验证按钮
-
await botton2[0].click()
三:提取滑块拼图照片url
-
elements_1 = await page.xpath(
-
'//*[@id="captcha"]/div[2]/div[1]/div[4]/div[1]/div[2]/div/div/div[1]/div[1]/div[1]/@style') # 滑块图片链接
-
elements_2 = await page.xpath(
-
'//*[@id="captcha"]/div[2]/div[1]/div[4]/div[1]/div[2]/div/div/div[1]/div[2]/@style') # 背景图片链接
-
for element in elements_1:
-
sc = await page.evaluate('(element) => element.textContent', element)
-
sc_url = sc.split('"')[1].split('"')[0] # 提取滑块图片链接
-
with open('slice.png', 'wb')as f1:
-
f1.write(requests.get(sc_url).content)
-
for element in elements_2:
-
bg = await page.evaluate('(element) => element.textContent', element)
-
bg_url = bg.split('"')[1].split('"')[0] # 提取背景图片链接
-
with open('bg.png', 'wb') as f2:
-
f2.write(requests.get(bg_url).content)
四:获取拼图坐标偏移量
-
async def get_xy():
-
det = ddddocr.DdddOcr(det=False, ocr=False)
-
-
with open('slice.png', 'rb') as f:
-
target_bytes = f.read()
-
-
with open('bg.png', 'rb') as f:
-
background_bytes = f.read()
-
try:
-
res = det.slide_match(target_bytes, background_bytes)
-
print(res)
-
return res.get('target')[0]
-
except:
-
return False
五:操作鼠标移动滑块
其中x,y需要根据自己电脑进行微调。
-
if target:
-
# print(target)
-
botton3 = await page.xpath(
-
'//*[@id="captcha"]/div[2]/div[1]/div[4]/div[1]/div[2]/div/div/div[2]/div/div[3]')
-
await botton3[0].hover() # 鼠标悬停元素上
-
await page.mouse.down() # 鼠标落下
-
await page.waitFor(500)
-
x = 1116 target
-
y = 641
-
await page.mouse.move(x, y, {'steps': 2}) # 鼠标移动
-
await page.waitFor(500)
-
await page.mouse.up() # 鼠标松开
-
time.sleep(2)
-
elements_3 = await page.xpath('//*[@id="captcha"]/div[2]/div[1]/div[3]/div[2]/div/div[2]/text()')
-
msg = ''
-
for element in elements_3:
-
msg = await page.evaluate('(element) => element.textContent', element)
-
if msg == '验证通过':
-
break
-
else:
-
print(msg)
-
else: # 获取坐标失败时刷新验证
-
botton4 = await page.xpath('//*[@aria-label="刷新验证"]')
-
await botton4[0].click()
验证通过,欧耶~
六:完整代码
-
# coding:utf-8
-
import ddddocr
-
# coding:utf-8
-
import asyncio
-
import time
-
-
import requests
-
from pyppeteer.launcher import DEFAULT_ARGS
-
-
DEFAULT_ARGS.remove("--enable-automation")
-
from pyppeteer import launch
-
-
-
async def main():
-
# 浏览器 启动参数
-
start_parm = {
-
# 关闭无头浏览器
-
"headless": False,
-
"args": [
-
'--disable-infobars', # 关闭自动化提示框
-
'--no-sandbox', # 关闭沙盒模式
-
'--start-maximized', # 窗口最大化模式
-
-
],
-
}
-
browser = await launch(**start_parm)
-
page = await browser.newPage()
-
-
# 设置网页 视图大小
-
await page.setViewport(viewport={'width': 1920, 'height': 1080})
-
await page.goto('https://www.geetest.com/adaptive-captcha-demo')
-
time.sleep(2)
-
await page.waitForXPath('//div[@class="type-config"]') # 等待元素加载
-
botton1 = await page.xpath('//div[@class="tab-item tab-item-1"]') # 滑块拼图验证按钮
-
await botton1[0].click()
-
await page.click('#captcha', options={
-
'button': 'left',
-
'clickCount': 2,
-
'delay': 300, # 延迟点击(ms)
-
})
-
botton2 = await page.xpath('//*[@aria-label="点击按钮开始验证"]') # 开始验证按钮
-
await botton2[0].click()
-
while True:
-
time.sleep(5)
-
elements_1 = await page.xpath(
-
'//*[@id="captcha"]/div[2]/div[1]/div[4]/div[1]/div[2]/div/div/div[1]/div[1]/div[1]/@style') # 滑块图片链接
-
elements_2 = await page.xpath(
-
'//*[@id="captcha"]/div[2]/div[1]/div[4]/div[1]/div[2]/div/div/div[1]/div[2]/@style') # 背景图片链接
-
for element in elements_1:
-
sc = await page.evaluate('(element) => element.textContent', element)
-
sc_url = sc.split('"')[1].split('"')[0] # 提取滑块图片链接
-
with open('slice.png', 'wb')as f1:
-
f1.write(requests.get(sc_url).content)
-
for element in elements_2:
-
bg = await page.evaluate('(element) => element.textContent', element)
-
bg_url = bg.split('"')[1].split('"')[0] # 提取背景图片链接
-
with open('bg.png', 'wb') as f2:
-
f2.write(requests.get(bg_url).content)
-
target = await get_xy() # 得到滑块x坐标偏移量
-
if target:
-
# print(target)
-
botton3 = await page.xpath(
-
'//*[@id="captcha"]/div[2]/div[1]/div[4]/div[1]/div[2]/div/div/div[2]/div/div[3]')
-
await botton3[0].hover() # 鼠标悬停元素上
-
await page.mouse.down() # 鼠标落下
-
await page.waitFor(500)
-
x = 1116 target
-
y = 641
-
await page.mouse.move(x, y, {'steps': 2}) # 鼠标移动
-
await page.waitFor(500)
-
await page.mouse.up() # 鼠标松开
-
time.sleep(2)
-
elements_3 = await page.xpath('//*[@id="captcha"]/div[2]/div[1]/div[3]/div[2]/div/div[2]/text()')
-
msg = ''
-
for element in elements_3:
-
msg = await page.evaluate('(element) => element.textContent', element)
-
if msg == '验证通过':
-
break
-
else:
-
print(msg)
-
else: # 获取坐标失败时刷新验证
-
botton4 = await page.xpath('//*[@aria-label="刷新验证"]')
-
await botton4[0].click()
-
input('---验证通过---')
-
await browser.close()
-
-
-
async def get_xy():
-
det = ddddocr.DdddOcr(det=False, ocr=False)
-
-
with open('slice.png', 'rb') as f:
-
target_bytes = f.read()
-
-
with open('bg.png', 'rb') as f:
-
background_bytes = f.read()
-
try:
-
res = det.slide_match(target_bytes, background_bytes)
-
print(res)
-
return res.get('target')[0]
-
except:
-
return False
-
-
-
if __name__ == '__main__':
-
main()
-
asyncio.get_event_loop().run_until_complete(main())
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhhaccjc
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
怎样阻止微信小程序自动打开
PHP中文网 06-13