文章目录
- 一.图鉴的账户注册
- 识别流程
- 二.欧模网案例滑动验证码模拟登录
- 页面分析
- 三.代码分析
- 四.欧模网案例展示
- 总结
一.图鉴的账户注册
图鉴网页地址: http://www.ttshitu.com/
登录后充值一个提分
把这个python脚本复制保存到一个python文件中去
识别流程
首先你要先确定验证码的类型,然后选择类型对应的编号
二.欧模网案例滑动验证码模拟登录
页面分析
我们就用邮箱登录为例
我们点击登录后会有一个滑动验证码的验证,这就是我们主要的问题,下面我们将用代码来实现它
三.代码分析
这个距离是验证码相对原背景图片的距离
这里可以看出小图片的宽为340px,而大图片的宽为670px,且缺口距离大图边缘398px,这里设小图片缺口距离小图片边缘Xpx,利用相似的性质可以得到
X = (398/670)*340
这里减去了30px是因为验证码不需要滑动前面的那段距离
实行了一切动作链的操作,实行之前记得要导入一个第三方库from selenium.webdriver.common.action_chains import ActionChains,而且当你实行了动作链操作后要记得使用action.perform()方法提交动作链操作,最后要再次去实例化一个动作链去松开鼠标,因为前面有一个click and hold()按住鼠标的方法,要用action.release()去松开鼠标
最后是一个模拟客户端滑动验证码的操作,这里为了避免验证码验证出错,做了一个异常捕获,并且点击刷新按钮,让它重新获取验证滑块进行拖动滑块验证
四.欧模网案例展示
from selenium import webdriver
import base64
import json
import requests
from PIL import Image
from time import sleep
from selenium.webdriver.common.action_chains import ActionChainsdef base64_api(uname, pwd, img, typeid):with open(img, 'rb') as f:base64_data = base64.b64encode(f.read())b64 = base64_data.decode()data = {"username": uname, "password": pwd, "typeid": typeid, "image": b64}result = json.loads(requests.post("http://api.ttshitu.com/predict", json=data).text)if result['success']:return result["data"]["result"]else:return result["message"]return ""driver = webdriver.Chrome()
driver.maximize_window()driver.get('https://www.om.cn/login')# 点击 手机/邮箱
driver.find_element_by_xpath('//*[@id="__layout"]/div/div/div/div[2]/div/div[1]/div[3]/div/div[1]/span').click()# 点击 邮箱登录
driver.find_element_by_xpath('//*[@id="__layout"]/div/div/div/div[2]/div/div[1]/div[2]/div[1]/div[2]/span').click()# 输入邮箱
driver.find_element_by_xpath('//*[@id="__layout"]/div/div/div/div[2]/div/div[1]/div[2]/div[2]/div[2]/input').send_keys('你注册的邮箱')# 输入密码
driver.find_element_by_xpath('//*[@id="__layout"]/div/div/div/div[2]/div/div[1]/div[2]/div[2]/div[4]/input').send_keys('你注册的网页密码')# 点击登录按钮
driver.find_element_by_xpath('//*[@id="__layout"]/div/div/div/div[2]/div/div[1]/div[2]/div[2]/button').click()
sleep(1) # 加载验证码# 切换框架
driver.switch_to.frame('tcaptcha_iframe_dy')element = driver.find_element_by_id('slideBg')
src = 'https://t.captcha.qq.com' + element.get_attribute('style').split(r'"')[1] # 背景图片
exit()
content = requests.get(url=src).contentwith open('./code.png', 'wb') as f:f.write(content)# 识别图片验证码的位置
img_path = "./code.png"
result = base64_api(uname='xpBear', pwd='xp1693889638', img=img_path, typeid=33)
print('距离: ', result)num = (int(result) / 672) * 340 - 30 # 滑块移动的距离print('真实距离: ', num)while True:div = driver.find_element_by_xpath('//*[@id="tcOperation"]/div[8]')action = ActionChains(driver)action.click_and_hold(div) # 长按滑块for i in range(10):action.move_by_offset(num / 10, 0) # 移动的距离sleep(0.3)action.perform() # 执行上面的动作action = ActionChains(driver)action.release().perform() # 释放滑块sleep(1)if driver.title == '欧模网-账户登录':try:driver.find_element_by_xpath('//*[@id="reload"]/img').click()sleep(1)except:breakelse:print('登录成功!')breaksleep(1)print(driver.page_source)
以上代码由于有涉及到账户隐私我用中文描述代替了,大家可以自己注册一个账号去使用这个代码模拟客户端滑动验证码登录,从中去感受一下,相信会有意想不到的乐趣
总结
本篇文章主要是解决爬虫过程中一个滑动验证码如何进行登录的,模拟客户端进行滑动验证的过程,希望本篇文章可以帮助到大家,可以这篇文章在排版上有点乱,但是上面的知识都是我学习成果的分享,给个三连支持一波吧!